Android常用代码之普通及系统权限静默安装APK
2015-12-09 19:12
447 查看
本文主要介绍程序如何安装apk,包括普通模式安装和系统权限静默安装。
如果是非系统应用请直接查看:Android常用代码之APK
root权限静默安装,查看更完美的解决方案。
1、普通模式安装,调用系统Intent,代码如下:
public static void install(Context context, String filePath) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
2、静默安装
如果是非系统应用请移步:Android常用代码之APK
root权限静默安装,查看更完美的解决方案。
分为如下三步
(1)、静默安装需要系统应用安装权限,需要在AndroidManifest.xml中添加
Java
1 | < uses - permission android : name = "android.permission.INSTALL_PACKAGES" / > |
(2)、实现代码
静默安装代码如下,实际是通过pm install -r 命令安装。
注意:该函数最好在新建的线程中运行并通过handler发送安装结果给主线程,否则安装时间较长会导致ANR。
静默安装实现
Java
1fff7 246,246,246);'>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /** * install slient * * @param context * @param filePath * @return 0 means normal, 1 means file not exist, 2 means other exception error */ public static int installSlient ( Context context , String filePath ) { File file = new File ( filePath ) ; if ( filePath == null || filePath . length ( ) == 0 || ( file = new File ( filePath ) ) ==null || file . length ( ) <= 0 || ! file . exists ( ) || ! file . isFile ( ) ) { return 1 ; } String [ ] args = { "pm" , "install" , "-r" , filePath } ; ProcessBuilder processBuilder = new ProcessBuilder ( args ) ; Process process = null ; BufferedReader successResult = null ; BufferedReader errorResult = null ; StringBuilder successMsg = new StringBuilder ( ) ; StringBuilder errorMsg = new StringBuilder ( ) ; int result ; try { process = processBuilder . start ( ) ; successResult = new BufferedReader ( new InputStreamReader ( process . getInputStream ( )) ) ; errorResult = new BufferedReader ( new InputStreamReader ( process . getErrorStream ( ) )) ; String s ; while ( ( s = successResult . readLine ( ) ) != null ) { successMsg . append ( s ) ; } while ( ( s = errorResult . readLine ( ) ) != null ) { errorMsg . append ( s ) ; } } catch ( IOException e ) { e . printStackTrace ( ) ; result = 2 ; } catch ( Exception e ) { e . printStackTrace ( ) ; result = 2 ; } finally { try { if ( successResult != null ) { successResult . close ( ) ; } if ( errorResult != null ) { errorResult . close ( ) ; } } catch ( IOException e ) { e . printStackTrace ( ) ; } if ( process != null ) { process . destroy ( ) ; } } // TODO should add memory is not enough here if ( successMsg . toString ( ) . contains ( "Success" ) || successMsg . toString ( ) .contains ( "success" ) ) { result = 0 ; } else { result = 2 ; } Log . d ( "installSlient" , "successMsg:" + successMsg + ", ErrorMsg:" + errorMsg ) ; return result ; } |
(3) 、获取系统权限
完成了上面两步后,普通方式安装我们的应用仍然无法静默安装。需要我们的应用获得系统权限,编译应用并通过
adb push <your_apk_path> /system/app/
命令实现安装,即可拥有系统权限。
相关文章推荐
- listview原理
- Android 连续点击back button退出当前Activity的两种实现方法
- android 数据重构(仿淘宝浏览记录,足迹)
- android 数据重构(仿淘宝浏览记录,足迹)
- Android实现点击事件和长点击事件共存
- Android学习笔记(8):ViewGroup类
- Android自动检测版本及自动升级
- 源码探索系列2---深入解析AsyncTask
- Android制作粒子爆炸特效
- Android中R文件丢失问题解决办法
- android studio No resource found that matches the given name 找不到图片
- android AIDL技术的简单演示
- android RecyclerView 使用完全解析 介绍(二)
- 【Android开发学习笔记】【高级】【随笔】插件化——Activity生命周期
- Android-Activity所应该了解的大概就这样。(下)
- Android 6.0 Changes
- Android-Activity所应该了解的大概就这样。(上)
- Android-Activity所应该了解的大概就这样。(中)
- Android Proguard 详解
- android - open failed: EROFS (Read-only file system)