Android apk中安装另一个apk

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

你可能感兴趣的:(apk,android,携带安装)