一种 发给系统 让系统安装 但是会出现 安装界面 还得点击 比较麻烦。
一种 是 静默安装, 不了解的 百度一下就出来了。 这个安装后, 如果手机安装了 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
2.静默安装
1. PackageInfo packageInfo;
2. try {
3. packageInfo = getPackageManager().getPackageInfo(
4. "com.example.imgrefocus", 0);
5. catch (NameNotFoundException e) {
6. null;
7. e.printStackTrace();
8.
9. }
10. if (packageInfo == null) {
11. // 启用安装新线程
12. new Thread(new Runnable() {
13. @Override
14. public void run() {
15. "hao", "未安装进行安装");
16. // 未安装进行安装
17. }
18. }).start();
19. else {
20. "hao", "已经安装");
21. }
[java] view plain copy
1. /**
2. * 静默安装
3. *
4. * @param file
5. * @return
6. */
7. public boolean slientInstall() {
8. // 进行资源的转移 将assets下的文件转移到可读写文件目录下
9. new File(Environment.getExternalStorageDirectory()
10. "/temp.apk");
11.
12. boolean result = false;
13. null;
14. null;
15. System.out.println(file.getPath());
16. if (file.exists()) {
17. "==");
18. try {
19. "su");
20. out = process.getOutputStream();
21. new DataOutputStream(out);
22. "chmod 777 " + file.getPath()
23. "\n"); // 获取文件所有权限
24. dataOutputStream
25. "LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r "
26. // 进行静默安装命令
27. // 提交命令
28. dataOutputStream.flush();
29. // 关闭流操作
30. dataOutputStream.close();
31. out.close();
32. int value = process.waitFor();
33.
34. // 代表成功
35. if (value == 0) {
36. "hao", "安装成功!");
37. true;
38. else if (value == 1) { // 失败
39. "hao", "安装失败!");
40. false;
41. else { // 未知情况
42. "hao", "未知情况!");
43. false;
44. }
45. catch (IOException e) {
46. e.printStackTrace();
47. catch (InterruptedException e) {
48. e.printStackTrace();
49. }
50. if (!result) {
51. "hao", "root权限获取失败,将进行普通安装");
52. 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. true;
59. }
60. }
61.
62. return result;
63. }
64.
65. public void createFile() {
66. null;
67. null;
68. try {
69. this.getAssets().open("ImgRefocus.apk");
70. new File(Environment.getExternalStorageDirectory()
71. "/temp.apk");
72. file.createNewFile();
73. new FileOutputStream(file);
74. byte[] temp = new byte[1024];
75. int i = 0;
76. while ((i = is.read(temp)) > 0) {
77. 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图片,音频文件之类的,使用的时候只需要用文件流读入到手机的内存卡中即可