1

我想在我的软件中查看运行 android 应用程序的权限。

出于这个原因,我有以下代码:

   List<App> apps = new ArrayList<App>();
   ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);

   PackageManager packageManager = getPackageManager();

   List<RunningAppProcessInfo> l = am.getRunningAppProcesses();
   Iterator<RunningAppProcessInfo> i = l.iterator();

   PackageManager pm = this.getPackageManager();
   int row_count = 0 ;

   while(i.hasNext()) {
     ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
     try 
     {
       CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
       App app = new App();
       app.setTitle(c.toString());
       app.setPackageName(l.get(row_count).processName);

       PackageInfo packageInfo =  packageManager.getPackageInfo(l.get(row_count).processName, PackageManager.GET_PERMISSIONS);
       String[] reqPermission= packageInfo.requestedPermissions;
       app.set_Permission_Info(reqPermission);

    //   app.setVersionName(p.versionName);
     //  app.setVersionCode(p.versionCode);
      // CharSequence description = p.applicationInfo.loadDescription(packageManager);
     //  app.setDescription(description != null ? description.toString() : "");
       row_count++;
       // app.setSize(p.s)
       apps.add(app);

     }

     catch(Exception e){}

但有一个问题。

当我运行我的应用程序时,我发现应用程序名称和应用程序的包名称不一致。为什么会引入这个问题?

主要问题描述如下:

让我们假设一个名为“EBOOK_Reader”和“Camera”的应用程序正在我的设备中运行。包名分别为“com.ab”和“com.cd”。此代码的问题是适当的包名称与适当的应用程序名称不符。

它显示了“com.ab”到“Camera”和“com.cd”到“EBOOK_Reader”的包名,这是不需要的。

知道如何解决问题吗?谢谢你

4

3 回答 3

1

这是正确的并且正在运行:

   PackageManager mPm = getPackageManager();   
List <PackageInfo> appList=mPm.getInstalledPackages(PackageManager.GET_PERMISSIONS|PackageManager.GET_RECEIVERS|
          PackageManager.GET_SERVICES|PackageManager.GET_PROVIDERS);

for (PackageInfo pi : appList) {
    System.out.println("Process Name: "+pi);
    // Do not add System Packages
    if ((pi.requestedPermissions == null || pi.packageName.equals("android")) || 
            (pi.applicationInfo != null && (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)) 
        continue;

    for (String permission : pi.requestedPermissions) {
        //Map<String, String> curChildMap = new HashMap<String, String>();
        //System.out.println("############     "+permission);

        try {
            PermissionInfo pinfo = mPm.getPermissionInfo(permission, PackageManager.GET_META_DATA);
            CharSequence label = pinfo.loadLabel(mPm);
            CharSequence desc = pinfo.loadDescription(mPm);
            System.out.println("$$$$$ "+label+"!!!!!! "+desc);

        } catch (NameNotFoundException e) {
            Log.i(TAG, "Ignoring unknown permission " + permission);
            continue;
       }
    }
  }
于 2014-04-02T11:13:02.153 回答
0

进程名称不绑定到应用程序包名称。为了方便起见,默认情况下它们碰巧是相同的。但是,每个应用程序都可以使用该属性在其清单中自由更改其进程名称android:process,或者为各种组件生成更多具有不同名称的进程。

在更高级的场景中,多个应用程序可以共享同一个进程。

特别是,这意味着您不能使用进程名称来获取当前正在运行的应用程序。RunningAppProcessInfo.pkgList您应该改为使用该字段迭代在该进程中加载​​的包列表。请记住,它是一个数组,可以包含多个应用程序包名称。(请参阅上面有关高级场景的说明)

在单独的说明中,作为getRunningAppProcesses()各州的文档:

注意:此方法仅用于调试或构建面向用户的流程管理 UI。

于 2013-03-21T07:21:37.400 回答
0

应用名称和应用的包名称通常不同。您最好使用包名称,因为它在整个设备中是唯一的。

更新:现在我明白你的问题了。感谢您的澄清。这是因为变量row_count。基本上你正在使用两个不同的迭代器变量。这就是为什么你会得到 2 个不同的结果。你不需要row_count,因为你已经有了i. 试试下面的更新代码:

基本上l.get(row_count).processName被替换了info.processName

List<App> apps = new ArrayList<App>();
   ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);

   PackageManager packageManager = getPackageManager();

   List<RunningAppProcessInfo> l = am.getRunningAppProcesses();
   Iterator<RunningAppProcessInfo> i = l.iterator();

   PackageManager pm = this.getPackageManager();
   // int row_count = 0 ; // no need for this. feel free to delete

   while(i.hasNext()) {
     ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
     try 
     {
       CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
       App app = new App();
       app.setTitle(c.toString());
       app.setPackageName(info.processName);

       PackageInfo packageInfo =  packageManager.getPackageInfo(info.processName, PackageManager.GET_PERMISSIONS);
       String[] reqPermission= packageInfo.requestedPermissions;
       app.set_Permission_Info(reqPermission);

    //   app.setVersionName(p.versionName);
     //  app.setVersionCode(p.versionCode);
      // CharSequence description = p.applicationInfo.loadDescription(packageManager);
     //  app.setDescription(description != null ? description.toString() : "");
       //row_count++; // no need for this. feel free to delete
       // app.setSize(p.s)
       apps.add(app);

     }

     catch(Exception e){}
于 2013-03-21T07:24:23.337 回答