当使用第三方程序安装APK时如何让APK只能安装到SD card,不允许安装到机器存储,并在没有SD卡时弹出警告:请插入SD卡,

来源:互联网 发布:caffe latte 编辑:程序博客网 时间:2024/04/29 01:44

[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;
         }
0 0
原创粉丝点击