Как я могу определить разрешение на запуск приложений программно в Android?

Я хочу видеть разрешение запуска приложений 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" и "Камера". Имя пакета - "com.ab" и "com.cd" соответственно. Проблема этого кода в том, что имя соответствующего пакета не соответствует имени соответствующего приложения.

Он показывает имя пакета "com.ab" для "Camera" и "com.cd" для "EBOOK_Reader", что нежелательно.

Есть идеи, как решить проблему? Благодарю вас

3 ответа

Решение

Имя приложения и имя пакета приложения обычно различаются. Вам лучше использовать имя пакета, поскольку оно уникально для всего устройства.

Обновление: теперь я понимаю вашу проблему. Спасибо за разъяснения. Это из-за переменной 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){}

Это правильно и работает:

   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:process атрибут, или порождать больше процессов с разными именами для различных компонентов.

И в еще более сложных сценариях несколько приложений могут совместно использовать один и тот же процесс.

В частности, это означает, что вы не можете использовать имя процесса, чтобы получить приложения, которые работают в данный момент. Вместо этого вы должны перебрать список пакетов, загруженных в этот процесс, используя RunningAppProcessInfo.pkgList поле вместо Помните, что это массив, который может содержать более одного имени пакета приложения. (См. Примечание о расширенных сценариях выше)

На отдельном примечании, в качестве документации для getRunningAppProcesses() состояния:

Примечание. Этот метод предназначен только для отладки или создания пользовательского интерфейса управления процессами.

Другие вопросы по тегам