Модуль React Native: useStatsManager всегда возвращает пустой список

Я пытаюсь использовать собственный 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}")
        })
    }

}

Редактировать :

Пожалуйста, у кого-нибудь есть идеи? Я все еще застрял на этом!

0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня была такая же проблема. В этом случае недостаточно объявить разрешение в манифесте (см. рекомендации 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)
}

Другие вопросы по теме