[QUESTION] 当使用第三方程序安装APK时如何让APK只能安装到SD card,不允许安装到机器存储,并在没有SD卡时弹出警告:请插入SD卡,有SD卡自动安装到SD卡中 [ANSWER] diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 0eb11cd..f10f14a 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -47,6 +47,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import android.widget.Toast; /** * This activity is displayed when the system attempts to start an Intent for @@ -67,6 +68,16 @@ public class ResolverActivity extends AlertActivity implements null, null, true); } + + private boolean existSDCard() { + if (android.os.Environment.getExternalStorageState().equals( + android.os.Environment.MEDIA_MOUNTED)) { + return true; + } else { + return false; + } + } + protected void onCreate(Bundle savedInstanceState, Intent intent, CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption, boolean alwaysChoose) { @@ -74,6 +85,16 @@ public class ResolverActivity extends AlertActivity implements mPm = getPackageManager(); intent.setComponent(null); + try { + if (intent.getDataString().endsWith(".apk") && !existSDCard()) { + Toast.makeText(this, "Not exist SD Card.",Toast.LENGTH_SHORT).show(); + finish(); + return; + } + } catch (Exception e) { + Log.w("ResolverActivity", "Exception:" + e.getMessage()); + } + AlertController.AlertParams ap = mAlertParams; ap.mTitle = title; @@ -109,6 +130,7 @@ public class ResolverActivity extends AlertActivity implements CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption) { onCreate(savedInstanceState, intent, title, initialIntents, rList, alwaysUseOption, false); + } public void onClick(DialogInterface dialog, int which) { diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 90adbdc..43fca32 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -3387,6 +3387,11 @@ class PackageManagerService extends IPackageManager.Stub { } // Add the new setting to mSettings mSettings.insertPackageSettingLP(pkgSetting, pkg); + + if (!isSystemApp(pkg)) { + pkg.applicationInfo.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; + } + // Add the new setting to mPackages mPackages.put(pkg.applicationInfo.packageName, pkg); // Make sure we don't accidentally delete its data. @@ -4727,7 +4732,7 @@ class PackageManagerService extends IPackageManager.Stub { IPackageInstallObserver observer, int flags, String installerPackageName) { this.packageURI = packageURI; - this.flags = flags; + this.flags = flags|PackageManager.INSTALL_EXTERNAL; //flag this.observer = observer; this.installerPackageName = installerPackageName; } |
[QUESTION] 当使用第三方程序安装APK时如何让APK只能安装到SD card,不允许安装到机器存储,并在没有SD卡时弹出警告:请插入SD卡,有SD卡自动安装到SD卡中 [ANSWER] diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 0eb11cd..f10f14a 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -47,6 +47,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import android.widget.Toast; /** * This activity is displayed when the system attempts to start an Intent for @@ -67,6 +68,16 @@ public class ResolverActivity extends AlertActivity implements null, null, true); } + + private boolean existSDCard() { + if (android.os.Environment.getExternalStorageState().equals( + android.os.Environment.MEDIA_MOUNTED)) { + return true; + } else { + return false; + } + } + protected void onCreate(Bundle savedInstanceState, Intent intent, CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption, boolean alwaysChoose) { @@ -74,6 +85,16 @@ public class ResolverActivity extends AlertActivity implements mPm = getPackageManager(); intent.setComponent(null); + try { + if (intent.getDataString().endsWith(".apk") && !existSDCard()) { + Toast.makeText(this, "Not exist SD Card.",Toast.LENGTH_SHORT).show(); + finish(); + return; + } + } catch (Exception e) { + Log.w("ResolverActivity", "Exception:" + e.getMessage()); + } + AlertController.AlertParams ap = mAlertParams; ap.mTitle = title; @@ -109,6 +130,7 @@ public class ResolverActivity extends AlertActivity implements CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, boolean alwaysUseOption) { onCreate(savedInstanceState, intent, title, initialIntents, rList, alwaysUseOption, false); + } public void onClick(DialogInterface dialog, int which) { diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 90adbdc..43fca32 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -3387,6 +3387,11 @@ class PackageManagerService extends IPackageManager.Stub { } // Add the new setting to mSettings mSettings.insertPackageSettingLP(pkgSetting, pkg); + + if (!isSystemApp(pkg)) { + pkg.applicationInfo.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; + } + // Add the new setting to mPackages mPackages.put(pkg.applicationInfo.packageName, pkg); // Make sure we don't accidentally delete its data. @@ -4727,7 +4732,7 @@ class PackageManagerService extends IPackageManager.Stub { IPackageInstallObserver observer, int flags, String installerPackageName) { this.packageURI = packageURI; - this.flags = flags; + this.flags = flags|PackageManager.INSTALL_EXTERNAL; //flag this.observer = observer; this.installerPackageName = installerPackageName; } |