Java 列表<;UsageStats>;返回空

Java 列表<;UsageStats>;返回空,java,android,react-native,android-package-managers,Java,Android,React Native,Android Package Managers,我想为手机中安装的所有应用程序获取日志,但总是返回一个空列表。下面是我正在使用的代码 此处app.js来自react native call apps来自本机代码java的信息 loadApps = async () => { await ReturnAppsInformations.getApps() .then(response => { console.log(response); // only [] <---- this.set

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

此处app.js来自react native call apps来自本机代码java的信息

loadApps = async () => {
    await ReturnAppsInformations.getApps()
    .then(response => {
      console.log(response); // only [] <----
      this.setState({ apps });
    })
    .catch(error => {
      console.warn(error);
    });
}
loadApps=async()=>{
等待返回AppsInformations.getApps()
。然后(响应=>{
console.log(响应);//仅[]{
控制台。警告(错误);
});
}
下面是我返回带有数据的数组的简单本机代码

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);
usagestastsmanager=(usagestastsmanager)this.reactContext.getSystemService(this.reactContext.USAGE\u STATS\u SERVICE);
List stats=manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,1729196,System.currentTimeMillis());
WritableArray list2=Arguments.createArray();
对于(int i=0;i
我做错了什么? 这是我的第一个应用程序,所以我没有太多的知识

  • 按照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>
    
    
    
  • 好吧,我找到了关于它的那些废话


    今晚我将阅读它们…但我相信,这会解决我的问题!!感谢您的支持!!!

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

    usagestastsmanager
    声明您需要在清单中声明android.permission.PACKAGE\u USAGE\u STATS,并且需要在手机设置中为特定应用程序启用它

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

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

    您需要在
    清单中声明
    android.permission.PACKAGE\u USAGE\u STATS

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

    要了解更多信息,请查看@JulienArzul指出的,您需要添加权限
    android.settings.USAGE\u ACCESS\u 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);
    

    谢谢Julien,我会做的,我会回答你的!!嘿,插入了android清单,但仍然没有回应:(你还需要在手机上接受许可。因为这是一个“特殊的”权限,无法以编程方式请求。您需要转到设置=>应用程序和通知=>高级=>特殊应用程序访问=>使用权限(在像素手机上,可能在其他制造商设置应用程序的其他位置)(很抱歉,我把权限和设置常量弄混了,我在原始答案中更正了它)哦,天哪,那么没有办法自动完成吗?谢谢,我在这里看到了这个即时消息
    AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
    int mode = appOps.checkOpNoThrow(OPSTR_GET_USAGE_STATS, myUid(), context.getPackageName());
    return mode == MODE_ALLOWED;
    
    Intent intent = new Intent(MainActivity.this, AppLockService.class);
    intent.setAction(AppLockService.ACTION_START_FOREGROUND_SERVICE);
    startService(intent);