List<UsageStats> 返回空

Cam*_*ges 4 java android android-package-managers react-native

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

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

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

这是我的简单本机代码,用于返回带有数据的数组

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);
Run Code Online (Sandbox Code Playgroud)

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

  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>
    
    Run Code Online (Sandbox Code Playgroud)

好吧,我找到了那些关于它的东西......

https://github.com/mvincent7891/UsageStatsModule

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

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

今晚我要读它们......但我相信,这解决了我的问题!感谢你的支持!!!

Jul*_*zul 5

Have you asked and set the necessary permissions to use UsageStatsManager?

UsageStatsManager文档指出,您需要在清单中声明 android.permission.PACKAGE_USAGE_STATS,并且需要在手机的“设置”中为您的特定应用程序打开它。

编辑:
在清单中添加的权限:

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
Run Code Online (Sandbox Code Playgroud)

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

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
Run Code Online (Sandbox Code Playgroud)

  • 您还需要接受手机上的许可。由于这是一个“特殊”权限,因此无法以编程方式请求它。您需要转到“设置”=&gt;“应用程序和通知”=&gt;“高级”=&gt;“特殊应用程序访问”=&gt;“使用情况访问”(在 Pixel 手机上,可能位于其他制造商设置应用程序的其他位置) (2认同)