[英]Install apk programmatically that is working for Android 11 and below
我還是 Android 開發的新手。 我現在正在嘗試幾組代碼,只是為了以編程方式更新或安裝 apk。 正如預期的那樣,我無法讓它們為我工作,因為我的知識還非常有限。 我得到的主要問題主要是關於權限請求。 截至目前,我正在研究我在互聯網上找到的這段代碼:
public class UpdateApp extends AsyncTask<String,Void,Void> {
private Context context;
public void setContext(Context contextf){
context = contextf;
}
@Override
protected Void doInBackground(String... arg0) {
try {
URL url = new URL(arg0[0]);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
String PATH = "/mnt/sdcard/Download/";
File file = new File(PATH);
file.mkdirs();
File outputFile = new File(file, "update.apk");
if(outputFile.exists()){
outputFile.delete();
}
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
}
fos.close();
is.close();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("/mnt/sdcard/Download/update.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error!
context.startActivity(intent);
} catch (Exception e) {
MVPX.log("Update error! " + e.getMessage());
}
return null;
}}
然后在我的 MainActivity 中使用它,如下所示:
UpdateApp atualizaApp = new UpdateApp();
atualizaApp.setContext(getApplicationContext());
atualizaApp.execute("https://sample.com/app-debug.apk");
在我的清單文件中,我包含這些請求只是為了確保:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
但由於某種原因,我總是收到此錯誤:
Update error! /mnt/sdcard/Download/update.apk: open failed: EACCES (Permission denied)
請幫我解決這個問題,我真的需要讓它適用於我的項目。 如果您有比我上面提供的方法更好、更直接的解決方案,那將是一個很大的幫助。 但是,如果您可以為我提供適當的權限處理以使給定的代碼適用於 Android 11 及以下版本,我們將不勝感激。 謝謝你。
在開始下載之前檢查必要的權限。
ActivityResultLauncher<String> storagePermission = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
result -> {
if (result) checkAndUpdate();
});
private void checkAndUpdate() {
if (hasStoragePermission()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (getPackageManager().canRequestPackageInstalls()) {
// Continue to download
} else {
// Ask unknown resources permission
requestUnknownSourcesPermission();
}
} else {
// Continue to download
}
} else {
// Ask storage permission
storagePermission.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void requestUnknownSourcesPermission() {
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
.setData(Uri.parse(String.format("package:%s", getPackageName())));
installPermission.launch(intent);
}
private boolean hasStoragePermission(){
return ActivityCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.