如何确定应用程序可以移动到SD卡?

4

我希望能够识别出安装在手机内存中并可以移动到SD卡的应用程序列表。

我正在使用下面的函数来获取已安装应用程序的列表。

我已经查看了Android源代码中的InstalledAppDetails,但无法找到解决方案。

提前感谢。

private List<App> loadInstalledApps(boolean includeSysApps) 
   {
       List<App> apps = new ArrayList<App>();

       //   the package manager contains the information about all installed apps
       PackageManager packageManager = getPackageManager();

       List<PackageInfo> packs = packageManager.getInstalledPackages(0); //PackageManager.GET_META_DATA 

       for(int i = 0; i < packs.size(); i++) 
       {
           PackageInfo p = packs.get(i);
           ApplicationInfo a = p.applicationInfo;
           // skip system apps if they shall not be included
           if ((!includeSysApps) && ((a.flags & ApplicationInfo.FLAG_SYSTEM) == 1)) 
           {
               continue;
           }

           App app = new App();
           app.setTitle(p.applicationInfo.loadLabel(packageManager).toString());
           app.setPackageName(p.packageName);
           app.setVersionName(p.versionName);
           app.setVersionCode(p.versionCode);
           app.setInstallDir(p.applicationInfo.sourceDir);
           app.setInstallSize(calculateSize(app.getInstallDir()));
           CharSequence description = p.applicationInfo.loadDescription(packageManager);
           app.setDescription(description != null ? description.toString() : "");
           if(app.getInstallDir().contains("/mnt"))
           {
               //app on sdcard
               apps.add(app);
           }
           else
           {
               //app on phone memory
               apps.add(app);
           }        
       }
       return apps;
   }
1个回答

2
应用程序安装位置是在您的应用程序的AndroidManifest.xml文件中指定的。点击这里了解更多信息。简而言之:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="preferExternal"
... >

或者

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
... >

auto表示应用程序可以安装在外部设备上,但您没有偏好;preferExternal表示应用程序将在可能的情况下安装在外部设备上。

请记住...

如果您未声明此属性,则您的应用程序仅安装在内部存储器上,无法移动到外部存储器。

那么,现在的问题是如何从应用程序中获取androidManifest.xml文件。好吧,您可以从APK中获取它(如果在安装后未删除)。有关此问题,请查看此帖子:如何解析.apk包中的AndroidManifest.xml文件

最后,关于解析xml的一个很棒的主题也在这篇文章中找到。 访问android:installLocation清单属性

祝福, Aldo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接