Android apk中安装另一个apk

转载只是为了自己更好的查阅,原文章地址:http://www.eoeandroid.com/thread-561973-1-1.html

一种 发给系统 让系统安装  但是会出现 安装界面  还得点击  比较麻烦。 

一种 是 静默安装,  不了解的 百度一下就出来了。 这个安装后,  如果手机安装了 360  百度管家 等软家  在通知栏会提示 软件安装成功。

    <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.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />

因为有些是系统权限  +进去后  manifest 会出错  clean 一下 就可以了 。
要安装的 apk 放到  assets 目录下  安装时  先将 目录下的 apk 拷贝到 SD 卡上  改名为 temp.apk  然后安装temp.apk 

1.判断是否已经安装过此App ,android 里面识别App的唯一方法是通过App的packetName 作为唯一识别依据

[java]  view plain  copy
  1. PackageInfo packageInfo;  
  2.                try {  
  3.                        packageInfo = getPackageManager().getPackageInfo(  
  4.                                        "com.example.imgrefocus"0);  
  5.                } catch (NameNotFoundException e) {  
  6.                        packageInfo = null;  
  7.                        e.printStackTrace();  
  8.   
  9.                }  
  10.                if (packageInfo == null) {  
  11.                        // 启用安装新线程  
  12.                        new Thread(new Runnable() {  
  13.                                @Override  
  14.                                public void run() {  
  15.                                        Log.e("hao""未安装进行安装");  
  16.                                        slientInstall(); // 未安装进行安装                          
  17.                                }  
  18.                        }).start();  
  19.                } else {  
  20.                        Log.e("hao""已经安装");  
  21.                }  

2.静默安装

[java]  view plain  copy
  1. /** 
  2.          * 静默安装 
  3.          *  
  4.          * @param file 
  5.          * @return 
  6.          */  
  7.         public boolean slientInstall() {  
  8.                 createFile(); // 进行资源的转移 将assets下的文件转移到可读写文件目录下  
  9.                 File file = new File(Environment.getExternalStorageDirectory()  
  10.                                 .getPath() + "/temp.apk");  
  11.   
  12.                 boolean result = false;  
  13.                 Process process = null;  
  14.                 OutputStream out = null;  
  15.                 System.out.println(file.getPath());  
  16.                 if (file.exists()) {  
  17.                         System.out.println(file.getPath() + "==");  
  18.                         try {  
  19.                                 process = Runtime.getRuntime().exec("su");  
  20.                                 out = process.getOutputStream();  
  21.                                 DataOutputStream dataOutputStream = new DataOutputStream(out);  
  22.                                 dataOutputStream.writeBytes("chmod 777 " + file.getPath()  
  23.                                                 + "\n"); // 获取文件所有权限  
  24.                                 dataOutputStream  
  25.                                                 .writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r "  
  26.                                                                 + file.getPath()); // 进行静默安装命令  
  27.                                 // 提交命令  
  28.                                 dataOutputStream.flush();  
  29.                                 // 关闭流操作  
  30.                                 dataOutputStream.close();  
  31.                                 out.close();  
  32.                                 int value = process.waitFor();  
  33.   
  34.                                 // 代表成功  
  35.                                 if (value == 0) {  
  36.                                         Log.e("hao""安装成功!");  
  37.                                         result = true;  
  38.                                 } else if (value == 1) { // 失败  
  39.                                         Log.e("hao""安装失败!");  
  40.                                         result = false;  
  41.                                 } else { // 未知情况  
  42.                                         Log.e("hao""未知情况!");  
  43.                                         result = false;  
  44.                                 }  
  45.                         } catch (IOException e) {  
  46.                                 e.printStackTrace();  
  47.                         } catch (InterruptedException e) {  
  48.                                 e.printStackTrace();  
  49.                         }  
  50.                         if (!result) {  
  51.                                 Log.e("hao""root权限获取失败,将进行普通安装");  
  52.                                 Intent intent = new Intent();  
  53.                                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  54.                                 intent.setAction(android.content.Intent.ACTION_VIEW);  
  55.                                 intent.setDataAndType(Uri.fromFile(file),  
  56.                                                 "application/vnd.android.package-archive");  
  57.                                 startActivity(intent);  
  58.                                 result = true;  
  59.                         }  
  60.                 }  
  61.   
  62.                 return result;  
  63.         }  
  64.   
  65.         public void createFile() {  
  66.                 InputStream is = null;  
  67.                 FileOutputStream fos = null;  
  68.                 try {  
  69.                         is = MainActivity.this.getAssets().open("ImgRefocus.apk");  
  70.                         File file = new File(Environment.getExternalStorageDirectory()  
  71.                                         .getPath() + "/temp.apk");  
  72.                         file.createNewFile();  
  73.                         fos = new FileOutputStream(file);  
  74.                         byte[] temp = new byte[1024];  
  75.                         int i = 0;  
  76.                         while ((i = is.read(temp)) > 0) {  
  77.                                 fos.write(temp, 0, i);  
  78.                         }  
  79.                 } catch (IOException e) {  
  80.                         // TODO Auto-generated catch block  
  81.                         e.printStackTrace();  
  82.                 } finally {  
  83.                         if (is != null) {  
  84.                                 try {  
  85.                                         is.close();  
  86.                                 } catch (IOException e) {  
  87.                                         // TODO Auto-generated catch block  
  88.                                         e.printStackTrace();  
  89.                                 }  
  90.                         }  
  91.                         if (fos != null) {  
  92.                                 try {  
  93.                                         fos.close();  
  94.                                 } catch (IOException e) {  
  95.                                         // TODO Auto-generated catch block  
  96.                                         e.printStackTrace();  
  97.                                 }  
  98.                         }  
  99.   
  100.                 }  
  101.   
  102.         }  

如果没有root过的手机想要静默安装的话,目前"好像"是没有办法绕过的,如果每个软件都能静默安装的话,Android手机就到处是病毒了,所以一般手机的厂商都会建议不要root手机,获取手机的最高权限的,对手机小白来 说不安全

没有root过的手机安装的时候始终都会弹出安装的提示,相当于用Intent 打开安装的界面,然后把apk的安装路径传递过去

就然后就能安装了,至于为啥放在Asset目录下面是因为Asset目录下面的文件是不会压缩的,可以用来存放静态的Sqlite 3的db 文件,gif图片,音频文件之类的,使用的时候只需要用文件流读入到手机的内存卡中即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值