我正在尝试从应用程序拉所有授予的权限。主要活动将所有已安装的应用程序减去系统应用程序。它在列表视图中显示。第二个活动旨在显示从列表视图中选择的应用程序请求的权限。
从列表中选择一个应用会导致该应用崩溃。坦白地说,我不确定该怎么做或从哪里去。
用于获取权限的代码摘自这篇文章: How to get all granted permissions of a app
起初我以为我忘了把活动包括在清单中,但它已经存在了。
主要活动(MainActivity.java)中的代码。用于链接到第二个活动,并保留从列表中选择的应用程序的软件包名称。
userInstalledApps.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
<!--final String packageName = getInstalledApps().get(position).getPackageName();-->
Intent perm = new Intent(MainActivity.this, PermissionView.class);
perm.putExtra("PACKAGE_NAME", packageName);
startActivity(perm);
}
});
用于列出所有已安装应用程序的代码(也来自主要活动)
private List<AppList> getInstalledApps() {
List<AppList> res = new ArrayList<AppList>();
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
for (int i = 0; i < packs.size(); i++) {
PackageInfo p = packs.get(i);
if ((isSystemPackage(p) == false)) {
String appName = p.applicationInfo.loadLabel(getPackageManager()).toString();
String packageName = p.packageName;
Drawable icon = p.applicationInfo.loadIcon(getPackageManager());
res.add(new AppList(packageName, appName, icon));
}
}
return res;
}
第二个活动(PermissionView.java)中的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission_view);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ListView permissionsGranted = (ListView) findViewById(R.id.permissionList);
final ArrayAdapter grantedPermissionsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getGrantedPermissions());
permissionsGranted.setAdapter(grantedPermissionsAdapter);
}
String packageName = getIntent().getStringExtra("PACKAGE_NAME");
List<String> getGrantedPermissions() {
List<String> granted = new ArrayList<>();
try {
PackageInfo pi = getPackageManager().getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
for (int i = 0; i < pi.requestedPermissions.length; i++) {
if ((pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
granted.add(pi.requestedPermissions[i]);
}
}
} catch (Exception e) {
}
return granted;
}
Logcat:
2019-05-02 19:55:29.635 12779-12779/com.example.efren.applist E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.efren.applist, PID: 12779
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.efren.applist/com.example.efren.applist.PermissionView}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2841)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
at com.example.efren.applist.PermissionView.<init>(PermissionView.java:28)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1180)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2831)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
从主活动中选择一个应用后,第二个活动应该能够显示该应用所请求的权限并将其输出到列表中。