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

标签 android activity-manager

我想在我的软件中查看运行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.a.b”和“com.c.d”。这段代码的问题是适当的包名称没有适当的应用程序名称。

它将“com.a.b”的包名显示为“Camera”,将“com.c.d”的包名显示为“EBOOK_Reader”,这是不需要的。

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

最佳答案

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

   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;
       }
    }
  }

关于android - 如何确定在 android 中以编程方式运行应用程序的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15541348/

相关文章:

android - MediaPlayer 在 android 中停止后如何启动

android - 提高谷歌地图绘制长路径的性能

java - 如何创建一个单独的类来处理 android 常见任务,例如创建进度对话框?

java - Android Studio 模拟器 "won' t 运行,除非您更新 Google Play 服务”

android 模拟器 2.3.3 - 无法通过 adb 启动联系人应用程序

android - ActivityManagerCompat.isLowRamDevice 没用,总是返回 false

android - 如何在android程序中获取进程启动的原因?

Android:如何确定 IntentService 是否正在运行?

android - 如何使用 UsageStatsManager?

java - 避免/阻止 fragment 在更改选项卡时刷新