[英]Installing APK programmatically in background
我有一個場景,我必須在后台下載 apk 並安裝它,而不向用戶提示任何對話框。 但是,當我嘗試使用以下代碼安裝它時
File file = new File(filename);
if(file.exists()){
try {
String command;
command = "pm install -r " + filename;
Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
proc.waitFor();
Config.debug("Apk installed");
} catch (Exception e) {
e.printStackTrace();
}
}
它要求超級用戶訪問。 有沒有辦法在沒有超級用戶並提示用戶的情況下安裝 apk?
有沒有辦法在沒有超級用戶並提示用戶的情況下安裝 apk?
幸運的是,沒有,出於明顯的安全原因。
更新:一個例外是在 Android 5.0+ 設備上,如果您使用的是設備所有者系統,我認為有一些 API 可用於安裝設備所有者應用程序可用的軟件包。 我還沒有玩過這些,目前還不清楚它們是否能滿足你的需求。
我問這個是因為我擁有的用戶群,以前從未使用過應用程序或設備
然后要么不給他們這項技術,要么教他們如何使用這項技術。
是的,您可以通過使用系統簽名對應用程序進行簽名來靜默安裝 apk 而無需生根。
您應該首先查看 Android 的原生Package Installer 。 我認為您只需要提取所需的功能。
具體來說,如果您查看此方法及其 OnClickListener:
public void onClick(View v) {
if(v == mOk) {
...
startActivity(newIntent);
finish();
} else if(v == mCancel) {
// Cancel and finish
setResult(RESULT_CANCELED);
finish();
}
}
然后您可能會注意到實際安裝程序所在位置的InstallAppProgress類,最后要做的是調用PackageManager
的 installPackage(...) 函數。
public void initView() {
...
pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
}
下一步是檢查PackageManager
這是一個抽象類。 您會在那里找到 installPackage(...) 函數。 壞消息是它被標記為@hide
。 這意味着它不能直接供外部開發人員使用。
/**
* @hide
**/
public abstract void installPackage(Uri packageUri, IPackageInstallObserver installObserver, int flags, String installerPackageName);
但是您將能夠使用反射訪問該方法。
您將使用yourContext.getPackageManager()
反映它。 然后你可以調用 installPackage(...) 函數。
以下代碼調用安裝:
try {
getPackageManager().installPackage(packageUri, myObserver, PackageManager.INSTALL_REPLACE_EXISTING, "com.your.package.name");
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
為了使整個工作正常運行,您需要在清單中聲明這一點,否則代碼將靜默失敗。
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
要獲得此權限,您必須將 APK 安裝為需要 ROOT 的系統。
但是,在您將 APK 安裝為系統后,它似乎無需 ROOT 即可工作。
為此,我創建了一個簽名的 APK 並將其推送:
adb push C:\Users\Example01\Desktop\release\app-release.apk /system/priv-app/MyApp.apk
有了這個,我將它復制到/system/priv-app
這需要寫訪問這就是為什么需要 ROOT。
我使用調試版本對其進行了測試,當我嘗試時,我得到了SecurityException
。
您應該使用有根設備將其安裝為系統特權應用程序。
希望這可以幫助 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.