最近小編在做一個靜默安裝的功能,靜默安裝的解決方式有許多種,小編今天就講解一下我所做的這種方式,前提:需要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" />