Android靜默安裝(需root)

最近小編在做一個靜默安裝的功能,靜默安裝的解決方式有許多種,小編今天就講解一下我所做的這種方式,前提:需要Root(比較適合android定製開發板)

靜默安裝

靜默安裝的意思就是不通過android系統的安裝提示頁面進行app的安裝。

如果我們的app在升級的時候,不想看到安卓系統自帶的安裝界面,我們可以使用靜默安裝。
那麼:現在開始—

至於安裝過程中的斷點下載,獲取文件這裏就不做一一講解了,這個相信大家都會。

來不及解釋了,直接貼代碼吧:

 /**
     * 執行具體的靜默安裝邏輯,需要手機ROOT。
     * @param apkPath
     *          要安裝的apk文件的路徑
     * @return 安裝成功返回true,安裝失敗返回false。
     */
    private static boolean install(String apkPath) {
        boolean result = false;
            DataOutputStream dataOutputStream = null;
            BufferedReader errorStream = null;
            try {
                // 申請su權限
                Process process = Runtime.getRuntime().exec("su");
                    dataOutputStream = new DataOutputStream(process.getOutputStream());
                    //執行卸載命令
                    String command1 = "pm uninstall "+ mContext.getPackageName() +" \n";
                    dataOutputStream.write(command1.getBytes(Charset.forName("utf-8")));
                    dataOutputStream.flush();
                    // 執行pm install命令
                    //這種方式是先卸載再安裝,不是覆蓋安裝,收取不到apk的簽名不一致等等信息,
                    //可以把 "pm install " + apkPath + "\n";換成"pm install -rf " + apkPath + "\n" 也不用執行上面的卸載命令
                    String command2 = "pm install " + apkPath + "\n";
                    dataOutputStream.write(command2.getBytes(Charset.forName("utf-8")));

                    dataOutputStream.flush();
                    dataOutputStream.writeBytes("exit\n");
                    dataOutputStream.flush();
                    process.waitFor();
                    errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                    String msg = "";
                    String line;
                    // 讀取命令的執行結果
                    while ((line = errorStream.readLine()) != null) {
                        msg += line;
                    }
                    Log.d("TAG", "install msg is " + msg);
                    // 如果執行結果中包含Failure字樣就認爲是安裝失敗,否則就認爲安裝成功
                    if (!msg.contains("Failure")) {
                        result = true;
                    }
            } catch (Exception e) {
                Log.e("TAG", e.getMessage(), e);
            } finally {
                try {
                    if (dataOutputStream != null) {
                        dataOutputStream.close();
                    }
                    if (errorStream != null) {
                        errorStream.close();
                    }
                } catch (IOException e) {
                    Log.e("TAG", e.getMessage(), e);
                }
            }

        return result;
    }

安裝玩之後,如果你的app不是Launcher程序,或者你的安卓系統中存在多個Launcher程序,如果你想再app安裝完之後自啓動你的app,可以使用廣播實現:

<!-- 清單文件裏面註冊你的廣播 -->
<receiver android:name=".broadcastreceiver.YouUpgradeApk"
    >
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED"/>
        <data android:scheme="package"/>
    </intent-filter>

</receiver>

廣播實現類

if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){
       Toast.makeText(context,"升級了一個安裝包",Toast.LENGTH_SHORT).show();
    //跳轉到你想跳轉的頁面
       Intent intent2 = new Intent(context, StartUpActivity.class);
       //設置標誌位
       intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       context.startActivity(intent2);
   }

清單文件權限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name= "android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章