android 实现静默安装

4.0以上和4.0以下静默安装的方式不一样:
首先说4.0的静默安装:
静默安装无非也是安装,首先得看安装的源码,安装的源码在app层PackageInstaller,这个项目就是安装的源码,你首先可以看安装的源码,不懂的可以接着提问。我先说静默安装的步骤;
1:静默安装apk,你得先随便放一个apk到SD卡当中。我以UC浏览器apk举例子。
2:首先获得apk在SD卡中的路径String fileName = Environment.getExternalStorageDirectory() +  "/UC.apk"; 
3:获取包的管理者,代码如下:
PackageManager pm = getPackageManager();
            try {
                PackageInfo pi = pm.getPackageInfo("com.uc.browser", 
                        PackageManager.GET_UNINSTALLED_PACKAGES);
                if(pi != null) {
                    installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
                }
            } catch (NameNotFoundException e) {
            }
  installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;这句的意思是强制安装,不管你的设备上面是否有曾经安装过apk,都强制在安装一次。
4:通过安装包的观察者PackageInstallObserver,具体代码如下
    PackageInstallObserver observer = new PackageInstallObserver();
class PackageInstallObserver extends IPackageInstallObserver.Stub {
        public void packageInstalled(String packageName, int returnCode) {
            Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
            msg.arg1 = returnCode;
            mHandler.sendMessage(msg);
        }
    };
    
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case INSTALL_COMPLETE:
                   
                    int centerTextLabel;
                    Drawable centerTextDrawable = null;
                    if(msg.arg1 == SUCCEEDED) {
                            
                    } else {}
                    if (centerTextDrawable != null) {}

                    break;
                default:
                    break;
            }
        }
    };
5:通过pm.installPackage(uri, observer, installFlags, "com.uc.browser");
6:去掉gen下面的r
7:编写MK文件:mkd 的具体写法如下
    LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := user

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := InstallActivity
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)
8:然后丢到linux下面mm一下就行。
linux的开发环境的搭建,就是linux的知识了,这里就不讲了,以上是4.0以下的静默安装


接下来4.0以上的静默安装,一般我们在adb install xxx.apk的时候,最终调用的还是pm install xxx.apk。
所以我们可以用pm install -r 进行安装apk。代码如下
  1. //方法体可以在任何地方可套用,不用修改任何东东哦!

  2.      public String install(String apkAbsolutePath ){ 

  3.          String[] args = { "pm", "install", "-r", apkAbsolutePath };

  4.           String result = "";

  5.          ProcessBuilder processBuilder = new ProcessBuilder(args);

  6.           Process process = null;

  7.           InputStream errIs = null;

  8.           InputStream inIs = null;
  9.          try {

  10.              ByteArrayOutputStream baos = new ByteArrayOutputStream();

  11.               int read = -1;

  12.               process = processBuilder.start();

  13.               errIs = process.getErrorStream();

  14.               while ((read = errIs.read()) != -1) {

  15.                  baos.write(read);

  16.               }

  17.               baos.write("/n".getBytes());

  18.            inIs = process.getInputStream();

  19.               while ((read = inIs.read()) != -1) {

  20.                   baos.write(read);

  21.              }

  22.               byte[] data = baos.toByteArray();

  23.               result = new String(data);

  24.           } catch (IOException e) {

  25.               e.printStackTrace();

  26.          } catch (Exception e) {

  27.               e.printStackTrace();

  28.           } finally {

  29.               try {

  30.                   if (errIs != null) {

  31.                     errIs.close();

  32.                  }

  33.                  if (inIs != null) {

  34.                       inIs.close();

  35.                   }

  36.              } catch (IOException e) {

  37.                  e.printStackTrace();

  38.               }

  39.               if (process != null) {
  40.                  process.destroy();

  41.              }

  42.           }

  43.           return result;

  44.       }
复制代码
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

      <uses-permission android:name="android.permission.INSTALL_PACKAGES" />

      <uses-permission android:name="android.permission.DELETE_PACKAGES" />

      <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />

      <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />

      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
同样编写MK文件,然后在linux底下编译

 

你可能感兴趣的:(android 实现静默安装)