从Android应用中提取授予的权限

时间:2019-05-02 18:46:32

标签: android listview permissions

我正在尝试从应用程序拉所有授予的权限。主要活动将所有已安装的应用程序减去系统应用程序。它在列表视图中显示。第二个活动旨在显示从列表视图中选择的应用程序请求的权限。

从列表中选择一个应用会导致该应用崩溃。坦白地说,我不确定该怎么做或从哪里去。

用于获取权限的代码摘自这篇文章: 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) 

从主活动中选择一个应用后,第二个活动应该能够显示该应用所请求的权限并将其输出到列表中。

0 个答案:

没有答案