一、大概說下思路
(1)利用系統應用的權限執行pm install命令的安裝方法,如果你是大衆應用(說的就是通用軟件任何Android手機上都用的比如:微信)的話這個方法不現實也是滿足不了你的需求的,這個主要在行業終端上使用的。
(2)具體代碼如下:
public static boolean installApp(String apkPath) {
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = new StringBuilder();
StringBuilder errorMsg = new StringBuilder();
try {
process = new ProcessBuilder("pm", "install","-i","com.example.ddd", "-r", apkPath).start();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while ((s = successResult.readLine()) != null) {
successMsg.append(s);
}
while ((s = errorResult.readLine()) != null) {
errorMsg.append(s);
}
} catch (Exception e) {
} finally {
try {
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (Exception e) {
}
if (process != null) {
process.destroy();
}
}
Log.e("result",""+errorMsg.toString());
Toast.makeText(ctx,+errorMsg.toString()+" "+successMsg , Toast.LENGTH_LONG).show();
//如果含有“success”單詞則認爲安裝成功
return successMsg.toString().equalsIgnoreCase("success");
}
上面的代碼是通用的也是網上遍地都能找得到的代碼,我就不具體解釋了,我主要說下命令
process = new ProcessBuilder("pm", "install","-i","com.example.ddd", "-r", apkPath).start();
android 7.0之前的版本上執行
new ProcessBuilder("pm", "install", "-r", apkPath) 不需要帶包名就可以執行成功
Android 7.0之後的系統上執行上述命令會執行失敗的,具體的異常我就不貼出來要執行如下的命令:
new ProcessBuilder("pm", "install","-i","com.example.ddd", "-r", apkPath) 這裏的包名是你應用程序的包名,而不是安裝應用的包名,比如你的這個指令在com.example.ddd這個應用上執行那麼你就要寫這個應用的包名
然後添加權限:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
再添加共享進程的配置;
android:sharedUserId="android.uid.system"
接下來就要用系統簽名打包安裝上去就可以測試了。
系統簽名的方法:
@echo off
java -cp signApk.jar SignApk platform.x509.pem platform.pk8 DDD.apk test.apk
adb install -r test.apk
pause
以上腳本保存到txt裏後綴名修改成.bat 然後修改DDD.apk的路徑執行即可,DDD是需要簽名的apk test是系統簽名後的apk
具體的簽名文件文件:
說完了靜默安裝的方法,接下來也說下靜默卸載的方法:
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent sender = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
PackageInstaller mPackageInstaller = MainActivity.this.getPackageManager().getPackageInstaller();
mPackageInstaller.uninstall("要卸載的應用包名", sender.getIntentSender());// 卸載APK