Android apk中安装另一个apk
2015-06-15 22:22
555 查看
转载只是为了自己更好的查阅,原文章地址: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 作为唯一识别依据
2.静默安装
如果没有root过的手机想要静默安装的话,目前"好像"是没有办法绕过的,如果每个软件都能静默安装的话,Android手机就到处是病毒了,所以一般手机的厂商都会建议不要root手机,获取手机的最高权限的,对手机小白来 说不安全
没有root过的手机安装的时候始终都会弹出安装的提示,相当于用Intent
打开安装的界面,然后把apk的安装路径传递过去
就然后就能安装了,至于为啥放在Asset目录下面是因为Asset目录下面的文件是不会压缩的,可以用来存放静态的Sqlite
3的db 文件,gif图片,音频文件之类的,使用的时候只需要用文件流读入到手机的内存卡中即可
一种 发给系统 让系统安装 但是会出现 安装界面 还得点击 比较麻烦。
一种 是 静默安装, 不了解的 百度一下就出来了。 这个安装后, 如果手机安装了 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 作为唯一识别依据
PackageInfo packageInfo; try { packageInfo = getPackageManager().getPackageInfo( "com.example.imgrefocus", 0); } catch (NameNotFoundException e) { packageInfo = null; e.printStackTrace(); } if (packageInfo == null) { // 启用安装新线程 new Thread(new Runnable() { @Override public void run() { Log.e("hao", "未安装进行安装"); slientInstall(); // 未安装进行安装 } }).start(); } else { Log.e("hao", "已经安装"); }
2.静默安装
/** * 静默安装 * * @param file * @return */ public boolean slientInstall() { createFile(); // 进行资源的转移 将assets下的文件转移到可读写文件目录下 File file = new File(Environment.getExternalStorageDirectory() .getPath() + "/temp.apk"); boolean result = false; Process process = null; OutputStream out = null; System.out.println(file.getPath()); if (file.exists()) { System.out.println(file.getPath() + "=="); try { process = Runtime.getRuntime().exec("su"); out = process.getOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(out); dataOutputStream.writeBytes("chmod 777 " + file.getPath() + "\n"); // 获取文件所有权限 dataOutputStream .writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r " + file.getPath()); // 进行静默安装命令 // 提交命令 dataOutputStream.flush(); // 关闭流操作 dataOutputStream.close(); out.close(); int value = process.waitFor(); // 代表成功 if (value == 0) { Log.e("hao", "安装成功!"); result = true; } else if (value == 1) { // 失败 Log.e("hao", "安装失败!"); result = false; } else { // 未知情况 Log.e("hao", "未知情况!"); result = false; } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } if (!result) { Log.e("hao", "root权限获取失败,将进行普通安装"); Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); result = true; } } return result; } public void createFile() { InputStream is = null; FileOutputStream fos = null; try { is = MainActivity.this.getAssets().open("ImgRefocus.apk"); File file = new File(Environment.getExternalStorageDirectory() .getPath() + "/temp.apk"); file.createNewFile(); fos = new FileOutputStream(file); byte[] temp = new byte[1024]; int i = 0; while ((i = is.read(temp)) > 0) { fos.write(temp, 0, i); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
如果没有root过的手机想要静默安装的话,目前"好像"是没有办法绕过的,如果每个软件都能静默安装的话,Android手机就到处是病毒了,所以一般手机的厂商都会建议不要root手机,获取手机的最高权限的,对手机小白来 说不安全
没有root过的手机安装的时候始终都会弹出安装的提示,相当于用Intent
打开安装的界面,然后把apk的安装路径传递过去
就然后就能安装了,至于为啥放在Asset目录下面是因为Asset目录下面的文件是不会压缩的,可以用来存放静态的Sqlite
3的db 文件,gif图片,音频文件之类的,使用的时候只需要用文件流读入到手机的内存卡中即可
相关文章推荐
- java4Android (7)抽象函数/抽象函数的应用
- android PopupWindow实现从底部弹出或滑出选择菜单或窗口
- Android 触摸事件处理机制
- Android 学习10之单击事件1
- android反编译步骤改进版
- android"百码"2——基础小知识积累(逐步完善)2015-06-15
- Macbook下Android studio的butterknife的应用
- Android实习周记:第六周,然而生活不止要求你编得一手好程序
- JAVA中的优化技巧(适用Android)
- Android的Menu
- Android中高效的显示图片之一 ——加载大图
- Android中高效的显示图片之三——缓存图片
- android图片处理方法(不断收集中)
- android 上传图片到php服务器
- androidstudio--gsonformat--超爽的数据解析方式
- Android中SharedPreferences和序列化结合保存对象数据
- android的几个开源框架
- 【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- Android中的优化技巧
- 什么是android开发中涉及到的渠道号?