本文主要介绍程序如何安装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中添加
1
|
<
uses
-
permission
android
:
name
=
"android.permission.INSTALL_PACKAGES"
/
>
|
(2)、实现代码
静默安装代码如下,实际是通过pm install -r 命令安装。
注意:该函数最好在新建的线程中运行并通过handler发送安装结果给主线程,否则安装时间较长会导致ANR。
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/
命令实现安装,即可拥有系统权限。