0

アプリケーションで自分の場所の許可を使用するアプリケーションのリストを取得しようとしています。また、場所の許可を使用するアプリケーションを取得しようとしています。

    public void getPermissions(Context context) {
        PackageManager packageManager = context.getPackageManager();
        final List<PackageInfo> apps = context.getPackageManager()
            .getInstalledPackages(PackageManager.GET_PERMISSIONS);

        for (PackageInfo pi : apps) {
            String[] permissions = pi.requestedPermissions;
            if (permissions != null) {
                for (String permission : permissions) {
                    Log.d("TAG", permission);
                                if (permission.equals("android.permission.ACCESS_FINE_LOCATION") || permission.equals("android.permission.ACCESS_COARSE_LOCATION") || permission.equals("android.permission.ACCESS_MOCK_LOCATION") || permission.equals("android.permission.ACCESS_LOCATION_EXTRA_COMMANDS") || permission.equals("android.permission.ACCESS_INSTALL_LOCATION_PROVIDER")) {

                                    String appname=pi.applicationInfo.loadLabel(packageManager).toString();
                                    //ImageView appicon;

                                    //appicon = pi.applicationInfo.setImageDrawable(packageManager);
                                    // Log.e("TAG", "Permission found for "+ appname);

                                    locationArray.add(appname);
                                }
                }
            }
        }
   } //end of getPermissions method

しかし、これで私は複数のエントリを取得します

Angry Birds
Angry Birds
CWM
CWM
CWM
Facebook

これを解決するための回避策はありますか?

4

2 に答える 2

1

のすべてのアクセス許可をステップ オーバーし、PackageInfoそれぞれをテストして位置関連のアクセス許可の 1 つであるかどうかを確認するため、エントリが重複するのは正常です。たとえば、Angry Birds ゲームのパーミッションを繰り返すと、2 つのパーミッション (ACCESS_FINE と ACCESS_COARSE と間違えなければ) に出くわします。これらのパーミッションはどちらも if 条件を満たしているため、Angry Birds の 2 つを追加することになります。回。

for (String permission : permissions)秘訣は、最初の許可を見つけたときに抜け出すことです。

for (String permission : permissions) {
                    Log.d("TAG", permission);
                                if (permission.equals("android.permission.ACCESS_FINE_LOCATION") || permission.equals("android.permission.ACCESS_COARSE_LOCATION") || permission.equals("android.permission.ACCESS_MOCK_LOCATION") || permission.equals("android.permission.ACCESS_LOCATION_EXTRA_COMMANDS") || permission.equals("android.permission.ACCESS_INSTALL_LOCATION_PROVIDER")) {

                                    String appname=pi.applicationInfo.loadLabel(packageManager).toString();
                                    //ImageView appicon;

                                    //appicon = pi.applicationInfo.setImageDrawable(packageManager);
                                    // Log.e("TAG", "Permission found for "+ appname);

                                    locationArray.add(appname);
                                    break;   
                                }
                }
于 2012-07-29T11:03:55.873 に答える
1

重複が必要ない場合は、locationArray のすべてのコンテンツを HashSet に追加し (重複は許可されません)、HashSet を locationArray に戻すことができます。

// add elements to hs, including duplicates
HashSet hs = new HashSet();
hs.addAll(localArray);
localArray.clear();
localArray.addAll(hs);

これで、localArray に重複がなくなりました。

于 2012-07-29T11:08:53.887 に答える