【问题标题】:List<UsageStats> return emptyList<UsageStats> 返回空
【发布时间】:2019-01-23 00:30:15
【问题描述】:

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

这里app.js来自react-native调用apps信息来自原生代码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);

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

  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>
    

好的,我找到了关于它的那些 git...

https://github.com/mvincent7891/UsageStatsModule

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    UsageStatsManagerdocumentation 声明您需要在您的 Manifest 中声明 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);
    

    【讨论】:

    • 谢谢朱利安,我做错了,我回答你!!
    • 嘿,插入了 android manifest,但仍然是空响应:(
    • 您还需要接受手机上的权限。由于这是一个“特殊”权限,因此无法以编程方式请求它。您需要转到设置 => 应用和通知 => 高级 => 特殊应用访问 => 使用访问(在 Pixel 手机上,它可能在其他制造商设置应用的其他地方)
    • (抱歉,我将权限与设置常量混淆了,我在原来的答案中更正了)
    • 哦,天哪,有没有办法自动执行此操作?
    【解决方案2】:

    你需要在你的Manifest中声明android.permission.PACKAGE_USAGE_STATS

    <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?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多