使用 PackageManager 获取包名称 [重复]

Posted

技术标签:

【中文标题】使用 PackageManager 获取包名称 [重复]【英文标题】:get package name using PackageManager [duplicate] 【发布时间】:2016-04-18 04:05:27 【问题描述】:

我的列表视图显示已安装的具有互联网权限的应用程序,但它工作正常,我正在尝试启用单击列表项并将用户带到他们可以卸载应用程序的屏幕,我的代码可以在没有任何强制关闭但打开的情况下工作该卸载屏幕仅 0.25 秒并返回。这是因为它没有得到正确的包名。我该如何解决这个问题?

    public class MainActivity extends Activity 

        ArrayList<String> results = new ArrayList<String>();

         @Override
           protected void onCreate(Bundle savedInstanceState) 
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              getInstalledApps(this);
              ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, results);

              ListView listView = (ListView) findViewById(R.id.mobile_list);
              listView.setAdapter(adapter);

              listView.setOnItemClickListener(new OnItemClickListener() 
                  @Override
                  public void onItemClick(AdapterView<?> parent, View view, int position,
                          long id) 
                      String packageName = results.get(position);
                      Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                      intent.setData(Uri.parse("package:" + packageName));
                      startActivity(intent);
                  
              );
         

          private ArrayList<String> getInstalledApps(Context context) 
            PackageManager packageManager = context.getPackageManager();
            List<PackageInfo> applist = packageManager.getInstalledPackages(0);
            Iterator<PackageInfo> it = applist.iterator();
            while (it.hasNext()) 
                PackageInfo pk = (PackageInfo) it.next();
                if ((pk.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) 
                    Log.v("system app using internet = ", ""+pk.applicationInfo.loadLabel(packageManager));
                    continue;
                

                if (PackageManager.PERMISSION_GRANTED == packageManager .checkPermission(Manifest.permission.INTERNET, pk.packageName) ||
                        PackageManager.PERMISSION_GRANTED == packageManager .checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, pk.packageName))
                    results.add("" + pk.applicationInfo.loadLabel(packageManager));
            

            Log.v("app using internet = ", results.toString());

            return results;
        
    

我也想直接把它带到卸载屏幕,而不是把它带到应用信息屏幕。

【问题讨论】:

【参考方案1】:

您将 应用名称 存储在结果数组中,而不是 包名称,这是不同的。

这是一个示例:Facebook 应用程序的名称为 Facebook,但其包名称为 com.facebook.katana

查询 PackageManager 时,不仅要请求 pk.applicationInfo.loadLabel(packageManager),还要请求 pk.packageName(例如在另一个数组中)。

所以你的代码应该按以下方式编辑:

    ArrayList&lt;String&gt; results = new ArrayList&lt;String&gt;();下添加ArrayList&lt;String&gt; packageNames = new ArrayList&lt;String&gt;();

    results.add("" + pk.applicationInfo.loadLabel(packageManager)); 下添加packageNames.add(pk.packageName); 在此处使用括号与您的if (...)

    String packageName = results.get(position); 替换为String packageName = packageNames.get(position);

【讨论】:

我不明白 :( 你能发一个截图吗?谢谢 :D 我已经编辑了我的答案 我按照你说的做了一切,它适用于某些应用程序,但是,它也会为某些应用程序提供错误的位置,我点击图库,它正在打开 kik。 如果有括号,请确保:if (PackageManager.PERMISSION_GRANTED...)result.add()packageNames.add() 都在括号中 它们旁边都有一些代码在括号中,就像“packageNames.add(pk.packageName);”【参考方案2】:
    Try this
    ArrayList<AppInfodata> appsDataList = new ArrayList<>();
    public void getAllApps() 

            PackageManager packageManager = getPackageManager();
            List apps = packageManager
                    .getInstalledPackages(PackageManager.SIGNATURE_MATCH);
            if (apps != null && !apps.isEmpty()) 

                for (int i = 0; i < apps.size(); i++) 
                    PackageInfo p = (PackageInfo) apps.get(i);
                    ApplicationInfo appInfo = null;
                    try 
                        appInfo = packageManager.getApplicationInfo(p.packageName,
                                0);

                        AppInfodata app = new AppInfodata();
                        app.appname = p.applicationInfo.loadLabel(packageManager)
                                .toString();
                        app.packagename = p.packageName;

                      app.icon = p.applicationInfo.loadIcon(packageManager);


                            appsDataList.add(app);
                        

                     catch (NameNotFoundException e) 
                        e.printStackTrace();
                    
                

                // sort the list of applications alphabetically

            
            public class AppInfodata 
        String appname;
        String packagename;

        Drawable icon;


    

class AppListAdapter extends ArrayAdapter<AppInfoData>

AppListAdapter(Context context,int resource,ArrayList<AppInfoData> datalist)

super(context,resource,datalist);

getView(.....)

AppInfoData data =getItem(position);

【讨论】:

如何在列表视图中显示? 我还希望我的自定义图片出现在所有应用旁边,而不是它们自己的图标,我该怎么做? 您可以在此字段中添加自己的图像 app.icon = p.applicationInfo.loadIcon(packageManager); 如果您有资源,则取决于您,而不是根据您的要求更改 AppInfoClass 中 int 中的数据类型 但是如何添加列表视图?这不适合我的代码。你能给我完整的实现吗?

以上是关于使用 PackageManager 获取包名称 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

安卓--获取应用版本名称与版本号

在 PackageManager.GET_CONFIGURATIONS 找不到名称异常

如何使用 packageManager 在 android java 中获取克隆的应用程序?

Android:从 Intent 获取应用程序名称

PackageManager#installPackage 不适用于 Android N

Android 获取当前app版本号和版本名称