Список <UsageStats>возврат пуст - PullRequest
0 голосов
/ 23 января 2019

Я хочу использовать дневник для всех приложений, установленных на телефоне, но всегда возвращается пустой список.Ниже приведен код, который я использую.

Здесь app.js из реактивных приложений вызова, информация из собственного кода java

loadApps = async () => {
    await ReturnAppsInformations.getApps()
    .then(response => {
      console.log(response); // only [] <----
      this.setState({ apps });
    })
    .catch(error => {
      console.warn(error);
    });
}

Вот мой простой нативный код для возврата массива с данными

UsageStatsManager manager = (UsageStatsManager) this.reactContext.getSystemService(this.reactContext.USAGE_STATS_SERVICE);
List<UsageStats> stats =manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,1729196, System.currentTimeMillis());
WritableArray list2 = Arguments.createArray();

for (int i = 0; i < stats.size(); i++) {
    UsageStats usageStats = stats.get(i);
    WritableMap appInfo2 = Arguments.createMap();

    appInfo2.putString("packageName", usageStats.getPackageName());
    appInfo2.putDouble("firsTimeStamp", usageStats.getFirstTimeStamp());
    appInfo2.putDouble("getTotalTimeInForeground", 
    usageStats.getTotalTimeInForeground());
    list2.pushMap(appInfo2);
}
promise.resolve(list2);

Что я делаю не так?Это мое первое приложение, поэтому я не обладаю большими знаниями

Обновлен в соответствии с предложением Жюльена, но все равно приводит к пустому массиву.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.returnappsinformations" 
        xmlns:tools="http://schemas.android.com/tools">
    <uses-permission
        android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />
</manifest>

Хорошо, я нашел эти мерзости об этом ...

https://github.com/mvincent7891/UsageStatsModule

https://github.com/shimatai/react-native-android-datausage

https://github.com/lucasferreira/react-native-android-permissions

Сегодня я собираюсь прочитать их ... Но я верю, что это решит проблему для меня !!Спасибо за поддержку !!!

Ответы [ 3 ]

0 голосов
/ 23 января 2019

вам нужно объявить android.permission.PACKAGE_USAGE_STATS в вашем Manifest

<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />

, а также проверка во время выполнения

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.PACKAGE_USAGE_STATS)
        != PackageManager.PERMISSION_GRANTED) {
    // Permission is not granted
}

для дополнительной проверки Как использовать UsageStatsManager?

0 голосов
/ 23 января 2019

Как указал @JulienArzul, вам нужно добавить разрешение android.settings.USAGE_ACCESS_SETTINGS, а затем проверить, используете ли вы его или нет, используя следующий код: -

AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(OPSTR_GET_USAGE_STATS, myUid(), context.getPackageName());
return mode == MODE_ALLOWED;

Если указанное выше условие возвращает false, перенаправить пользователя на экран настроек этого разрешения

Intent intent = new Intent(MainActivity.this, AppLockService.class);
intent.setAction(AppLockService.ACTION_START_FOREGROUND_SERVICE);
startService(intent);
0 голосов
/ 23 января 2019

Вы спрашивали и устанавливали необходимые разрешения для использования UsageStatsManager?

UsageStatsManager в документации говорится, что вам нужно объявить android.permission.PACKAGE_USAGE_STATS в вашем манифесте ичто его нужно включить в настройках вашего телефона для вашего конкретного приложения.

РЕДАКТИРОВАТЬ:
Разрешение для добавления в ваш манифест:

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />

Это специальное разрешение не может быть предоставлено через обычный API разрешений Android.Поэтому вам нужно перенаправить пользователей на страницу настроек, где они могут предоставить их вручную.Вы можете открыть нужный экран настроек через намерение:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
...