您的位置:首页 > 移动开发 > Android开发

Android常用代码之普通及系统权限静默安装APK

2015-12-09 19:12 447 查看


202015-06

本文主要介绍程序如何安装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



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 ;
}

返回值0表示安装成功,1表示文件不存在,2表示其他错误。需要更丰富的安装失败信息(内存不足、解析包出错)可直接使用PackageUtils.installSlient

 

(3) 、获取系统权限

完成了上面两步后,普通方式安装我们的应用仍然无法静默安装。需要我们的应用获得系统权限,编译应用并通过

adb push <your_apk_path> /system/app/

命令实现安装,即可拥有系统权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: