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

Android apk中安装另一个apk

2015-12-21 15:04 453 查看
转载只是为了自己更好的查阅,原文章地址: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 作为唯一识别依据

[java] view
plaincopyprint?

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.静默安装

[java] view
plaincopyprint?

/** 

         * 静默安装 

         *  

         * @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图片,音频文件之类的,使用的时候只需要用文件流读入到手机的内存卡中即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: