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 print ?
  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 print ?
  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图片,音频文件之类的,使用的时候只需要用文件流读入到手机的内存卡中即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,一个APK文件可以包含多个应用。这种情况通常是通过将多个不同的功能分别打包到单独的模块,然后在同一个APK文件打包这些模块,实现多个应用的打包。这样做可以节约下载和安装的时间,并使用户可以一次安装多个应用。 ### 回答2: 在Android,通常一个APK文件只能安装一个应用程序。这是因为APK文件包含了应用程序的所有资源和代码,包括主程序、库文件、资源文件等。然而,有一种特殊的情况可以在一个APK安装多个应用程序,那就是使用“Split APKs”(分离的APK)技术。 使用Split APKs技术可以将一个APK文件分割成多个独立的APK文件,每个文件对应一个应用程序。这样,用户只需下载一个APK文件并安装,就能同时安装多个应用程序。 在实现这个功能的过程,需要使用Android的动态模块加载技术。通过动态加载功能,可以在运行时加载和卸载分离的APK文件,并调用其的应用程序。这些分离的APK文件可以通过远程服务器下载,也可以作为本地资源存储在设备上。 使用Split APKs技术的一个常见应用场景是游戏应用程序。在游戏,可能会通过分离APK技术将游戏的主体和扩展内容(例如新关卡、道具等)分开存储,以便实现动态更新和灵活扩展的目的。 总之,通过Split APKs技术,可以在一个APK文件安装多个应用程序。这种方式在某些特定的应用场景下非常有用,可以提供更好的用户体验和开发灵活性。 ### 回答3: 在Android系统一个APK文件通常只能安装一个应用程序。APK文件是Android应用程序的安装包,每个APK文件都会对应一个独立的应用程序。当用户在设备上点击APK文件进行安装时,系统会将APK文件解压并安装对应的应用程序,将应用程序的相关文件和数据存储在设备的特定目录。 然而,有一些特殊情况下可以在一个APK文件安装多个应用程序。例如,可以使用"多渠道打包"的技术来在一个APK文件打包多个应用程序。多渠道打包是一种将多个APK合并为一个APK的技术,不同的渠道可以安装不同的应用程序。这种方式通常用于应对市场分段、产品定制或者企业内部分发等需求。 另外,有些应用程序可能提供插件或者扩展机制,允许在应用程序安装额外的功能模块或者插件。这些插件或者扩展模块可以作为单独的APK文件进行安装,与主应用程序进行交互并提供额外的功能。但是这种方式与一个APK文件安装多个独立的应用程序并不相同,插件或者扩展模块仍然需要依赖主应用程序的运行环境,无法独立运行。 总而言之,通常情况下,一个APK文件只能安装一个应用程序。如果需要在一个APK文件安装多个应用程序,可以使用多渠道打包的技术。此外,还可以通过插件或者扩展机制来在应用程序安装额外的功能模块或者插件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值