如何确定在android中以编程方式运行应用程序的权限?

如何确定在android中以编程方式运行应用程序的权限?,android,activity-manager,Android,Activity Manager,我想查看在我的软件中运行android应用程序的权限 因此,我有以下代码: List<App> apps = new ArrayList<App>(); ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE); PackageManager packageManager = getPackageManager(); List<Running

我想查看在我的软件中运行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){}
List apps=new ArrayList();
ActivityManager am=(ActivityManager)this.getSystemService(ACTIVITY_服务);
PackageManager PackageManager=getPackageManager();
List l=am.getRunningAppProcesses();
迭代器i=l.迭代器();
PackageManager pm=this.getPackageManager();
int row_count=0;
while(i.hasNext()){
ActivityManager.RunningAppProcessInfo=(ActivityManager.RunningAppProcessInfo)(i.next());
尝试
{
CharSequence c=pm.getApplicationLabel(pm.getApplicationInfo(info.processName,PackageManager.GET_META_DATA));
App App=新App();
app.setTitle(c.toString());
app.setPackageName(l.get(行计数).processName);
PackageInfo PackageInfo=packageManager.getPackageInfo(l.get(行计数).processName,packageManager.get_权限);
字符串[]reqPermission=packageInfo.requestedPermissions;
应用程序设置权限信息(reqPermission);
//app.setVersionName(p.versionName);
//应用程序setVersionCode(p.versionCode);
//CharSequence description=p.applicationInfo.loadDescription(packageManager);
//app.setDescription(description!=null?description.toString():“”);
行计数++;
//应用程序设置大小(p.s)
apps.add(app);
}
捕获(例外e){}
但有一个问题

当我运行应用程序时,我发现应用程序名和应用程序包名不一致。为什么会出现此问题

主要问题描述如下:

假设我的设备中运行了一个名为“电子书阅读器”和“摄像头”的应用程序。程序包名称分别为“com.a.b”和“com.c.d”。此代码的问题是,相应的程序包名称与相应的应用程序名称不符

它将“com.a.b”的包名显示为“照相机”,将“com.c.d”的包名显示为“电子书阅读器”,这是不需要的

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

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

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

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

另请注意,作为各州的文件:

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


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

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

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

另请注意,作为各州的文件:

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


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

更新: 现在我理解了你的问题。感谢你的澄清。这是因为变量
行数
。基本上你使用的是两个不同的迭代器变量。这就是为什么你得到两个不同的结果。你不需要
行数
,因为你已经有了
I
的interator。 请尝试以下更新的代码:

基本上
l.get(行数)。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){}
List apps=new ArrayList();
ActivityManager am=(ActivityManager)this.getSystemService(ACTIVITY_服务);
PackageManager PackageManager=getPackageManager();
List l=am.getRunningAppProcesses();
迭代器i=l.迭代器();
PackageManager pm=this.getPackageManager();
//int row_count=0;//不需要这个。请随意删除
while(i.hasNext()){
ActivityManager.RunningAppProcessInfo=(ActivityManager.RunningAppProcessInfo)(i.next());
尝试
{
CharSequence c=pm.getApplicationLabel(pm.getApplicationInfo(info.processName,PackageManager.GET_META_DATA));
App App=新App();
app.setTitle(c.toString());
app.setPackageName(info.processName);
PackageInfo PackageInfo=packageManager.getPackageInfo(info.processName,packageManager.GET_PERMISSIONS);
字符串[]reqPermission=packageInfo.requestedPermissions;
应用程序设置权限信息(reqPermission);
//app.setVersionName(p.versionName);
//应用程序setVersionCode(p.versionCode);
//CharSequence description=p.applicationInfo.loadDescription(packageManager);
//app.setDescription(description!=null?description.toString():“”);
//row_count++;//不需要这个。可以随意删除
//应用程序设置大小(p.s)
apps.add(app);
}
捕获(例外e){}

应用程序名称和应用程序包名称不正确
   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;
       }
    }
  }