Java 列表<;UsageStats>;返回空
我想为手机中安装的所有应用程序获取日志,但总是返回一个空列表。下面是我正在使用的代码 此处app.js来自react native call apps来自本机代码java的信息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
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
我做错了什么?
这是我的第一个应用程序,所以我没有太多的知识
<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);