List <usagestats>返回空

时间:2019-01-23 00:30:15

标签: java android react-native android-package-managers

我想为手机中安装的所有应用程序使用日记,但总是返回一个空列表。下面是我正在使用的代码。

这里来自本地代码java的react-native调用应用程序信息中的app.js

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);

我在做什么错? 这是我的第一个应用程序,所以我没有很多知识

  1. 已根据Julien的建议进行了更新,但仍然会导致数组为空。

    <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 :(得分:0)

您是否询问并设置了使用UsageStatsManager所需的权限?

UsageStatsManager的{​​{3}}指出,您需要在清单中声明android.permission.PACKAGE_USAGE_STATS,并且需要针对特定​​应用在手机的“设置”中将其打开。

编辑:
可以添加清单的权限:

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

无法通过Android的常规权限API授予特殊权限。因此,您需要将用户重定向到“设置”页面,他们可以在其中手动授予它。您可以通过Intent打开右侧的“设置”屏幕:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);

答案 1 :(得分:0)

您需要在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
}

更多支票How to use UsageStatsManager?

答案 2 :(得分:0)

正如@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);