列表<UsageStats> return 为空
List<UsageStats> return empty
我想获取 phone 中安装的所有应用程序的使用日志,但 returned 总是一个空列表。下面是我正在使用的代码。
这里app.js来自react-native call apps information from native codejava
loadApps = async () => {
await ReturnAppsInformations.getApps()
.then(response => {
console.log(response); // only [] <----
this.setState({ apps });
})
.catch(error => {
console.warn(error);
});
}
这是我的 return 数组
的简单本机代码
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);
我做错了什么?
这是我的第一个应用程序,所以我没有太多知识
已根据 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>
好的,我找到了关于它的那些 gits...
https://github.com/mvincent7891/UsageStatsModule
https://github.com/shimatai/react-native-android-datausage
https://github.com/lucasferreira/react-native-android-permissions
今晚我要阅读它们...但我相信,这解决了我的问题!!感谢支持!!!
您是否询问并设置了使用 UsageStatsManager
所需的权限?
UsageStatsManager
的 documentation 声明您需要在您的清单中声明 android.permission.PACKAGE_USAGE_STATS 并且需要在您的 phone 的设置中打开它您的特定应用程序。
编辑:
在您的清单中添加的权限:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
无法通过 Android 的正常权限 API 授予该特殊权限。因此,您需要将用户重定向到“设置”页面,他们可以在其中手动授予权限。您可以通过 Intent 打开右侧的设置屏幕:
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
您需要在 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?
正如@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;
如果上述条件 returns 为假,则将用户重定向到该权限的设置屏幕
Intent intent = new Intent(MainActivity.this, AppLockService.class);
intent.setAction(AppLockService.ACTION_START_FOREGROUND_SERVICE);
startService(intent);
我想获取 phone 中安装的所有应用程序的使用日志,但 returned 总是一个空列表。下面是我正在使用的代码。
这里app.js来自react-native call apps information from native codejava
loadApps = async () => {
await ReturnAppsInformations.getApps()
.then(response => {
console.log(response); // only [] <----
this.setState({ apps });
})
.catch(error => {
console.warn(error);
});
}
这是我的 return 数组
的简单本机代码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);
我做错了什么? 这是我的第一个应用程序,所以我没有太多知识
已根据 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>
好的,我找到了关于它的那些 gits...
https://github.com/mvincent7891/UsageStatsModule
https://github.com/shimatai/react-native-android-datausage
https://github.com/lucasferreira/react-native-android-permissions
今晚我要阅读它们...但我相信,这解决了我的问题!!感谢支持!!!
您是否询问并设置了使用 UsageStatsManager
所需的权限?
UsageStatsManager
的 documentation 声明您需要在您的清单中声明 android.permission.PACKAGE_USAGE_STATS 并且需要在您的 phone 的设置中打开它您的特定应用程序。
编辑:
在您的清单中添加的权限:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
无法通过 Android 的正常权限 API 授予该特殊权限。因此,您需要将用户重定向到“设置”页面,他们可以在其中手动授予权限。您可以通过 Intent 打开右侧的设置屏幕:
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
您需要在 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?
正如@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;
如果上述条件 returns 为假,则将用户重定向到该权限的设置屏幕
Intent intent = new Intent(MainActivity.this, AppLockService.class);
intent.setAction(AppLockService.ACTION_START_FOREGROUND_SERVICE);
startService(intent);