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つの異なるイテレータ変数を使用しています。そのため、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 に答える