转载只是为了自己更好的查阅,原文章地址: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 作为唯一识别依据
- 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图片,音频文件之类的,使用的时候只需要用文件流读入到手机的内存卡中即可