Я пытаюсь использовать собственный API. У меня есть следующий код, чтобы получить 5 наиболее часто используемых приложений. Это собственный модуль Android с TypeScript, потому что я не могу вызывать API с помощью React Native:
fun getUsageData(startTime: Double, endTime: Double, successCallback: Callback) {
val usageStatsManager = reactApplicationContext.getSystemService(Context.USAGE_STATS_SERVICE) as
// Query usage stats
val usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime.toLong(), endTime.toLong())
// Sort usage stats by total time in foreground
usageStatsList.sortByDescending { it.totalTimeInForeground }
// Extract package names of top 5 used apps
val topApps: WritableArray = WritableNativeArray()
for (i in 0 until minOf(5, usageStatsList.size)) {
val packageName = usageStatsList[i].packageName
topApps.pushString(packageName)
}
// // Pass the top apps list back to React Native
successCallback.invoke(topApps)
}
Но мой список в Typescript всегда пуст, и я не знаю почему:LOG Top 5 used apps: []
И это мой код TypeScript:
const getUsageData = () => {
const startTime = new Date().getTime() - (7 * 24 * 60 * 60 * 1000);
const endTime = new Date().getTime();
UsageStatsModule.getUsageData(Number(startTime), Number(endTime), (topApps : any) => {
console.info('Top 5 used apps:', topApps);
});
};
Я не знаю, как начать отладку, потому что у меня нет ошибок и я не занимался мобильной разработкой.
Редактировать :
Я внес несколько изменений, чтобы получить больше информации, но это не было окончательным:
В манифесте.xml:
<uses-permission android:name = "android.permission.PACKAGE_USAGE_STATS" />
и в файле модуля:
@ReactMethod
fun getUsageData(startTime: Double, endTime: Double, successCallback: Callback) {
try {
val usageStatsManager: UsageStatsManager = this.reactApplicationContext.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val cal: Calendar = Calendar.getInstance()
cal.add(Calendar.DAY_OF_MONTH, -1)
// Query usage stats
val usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, cal.timeInMillis, System.currentTimeMillis())
?: throw SecurityException("Permission denied or usage stats not available")
// Sort usage stats by total time in foreground
usageStatsList.sortByDescending { it.totalTimeInForeground }
Log.d("a", "a : " + usageStatsList.size)
// Extract package names of top 5 used apps
val topApps: WritableArray = WritableNativeArray()
for(i in 0..usageStatsList.size - 1) {
val packageName = usageStatsList[i].packageName
topApps.pushString(packageName)
}
// Pass the top apps list back to React Native
successCallback.invoke(topApps)
} catch (e: Exception) {
// Handle exceptions
e.printStackTrace()
// Notify React Native about the error
// You might want to handle this differently based on your app's requirements
successCallback.invoke(WritableNativeArray().apply {
pushString("Error: ${e.message}")
})
}
}
Редактировать :
Пожалуйста, у кого-нибудь есть идеи? Я все еще застрял на этом!
У меня была такая же проблема. В этом случае недостаточно объявить разрешение в манифесте (см. рекомендации https://developer.android.com/training/permissions/requesting-special). Пользователю необходимо предоставить разрешение через приложение «Настройки», которое вы запускаете с контекстом вашей активности:
Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS, Uri.fromParts("package", packageName, null)).also {
ContextCompat.startActivity(context, it, null)
}