如何在程序中将应用安装到外部SD卡?

3
我目前正在开发一款更新管理应用程序。到目前为止,每当我安装或更新任何其他应用程序时,该应用程序都运行良好。所有这些应用程序都已安装在data/app文件夹中,并且我使用了android.content.pm.IPackageManager类和installpackage()方法来安装它们。
我正在开发一个定制ROM,其中包括1 GB的内部存储器,4GB的内部SD卡和8GB的外部SD卡。由于所有我的应用程序都已安装在data/app文件夹中,因此我的内部存储器空间不足!我想知道是否可以使用相同的installpackage()方法将应用程序安装在外部SD卡(或内部SD卡)上。
以下是我安装应用程序的方法:
 private Class<?> iPackageManagerStubProxyClass;

  iPackageManagerStubProxyClass = Class
 .forName("android.content.pm.IPackageManager$Stub$Proxy");



  public void installPackage(Uri uri) throws NoSuchMethodException,
  NumberFormatException, IllegalArgumentException, IllegalAccessException,
  InvocationTargetException, ClassNotFoundException {
  Log.i(LOG_TAG, "installing without deleting");
  Method method = getMethod(iPackageManagerStubProxyClass, "installPackage");
  method.invoke(packageManagerServiceProxy, uri, getPackageInstallObserver(),
  Integer.valueOf(INSTALL_REPLACE_EXISTING | INSTALL_INTERNAL), "");
  System.out.println(method);
  }

我开始怀疑是否可以将应用程序安装到SD卡上。有什么建议吗?如果不行,我能在安装后通过编程方式将我的应用程序移动到SD卡上吗?


抱歉,我忘了说:INSTALL_REPLACE_EXISTING = 0x00000002; INSTALL_INTERNAL = 0x00000010; - Cacique
2个回答

5
请使用这段代码。
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        android:installLocation="preferExternal"
        ... >

使用后,我仍然无法在手机磁盘中看到我的应用文件夹。 - Vivek Pratap Singh
在给予android:installLocation="preferExternal"之后,应用将会被安装在您的外部存储中,例如SD卡,请检查您的外部存储文件夹。 - Shivputra N

3

如何以编程方式将应用安装在外部SD卡上?

目前(截至Android 7.0),没有可行的编程方式来实现此操作!

你必须在AndroidManifest.xml文件中定义属性android:installLocation

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

需要指定以下值之一:

"internalOnly" 应用程序只能安装在内部设备存储上。如果设置了此选项,则应用程序将永远不会安装在外部存储上。如果内部存储已满,则系统将无法安装该应用程序。如果未定义 android:installLocation,则这也是默认行为。

"auto" 应用程序可以安装在外部存储上,但系统会默认将其安装在内部存储上。如果内部存储已满,则系统将在外部存储上安装它。安装后,用户可以通过系统设置将应用程序移到内部或外部存储。

"preferExternal" 应用程序更喜欢安装在外部存储(SD 卡)上。不能保证系统会遵守此请求。如果外部介质不可用或已满,则可能会将应用程序安装在内部存储上。安装后,用户可以通过系统设置将应用程序移到内部或外部存储。

更多信息


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