簡體   English   中英

以編程方式安裝適用於 Android 11 及以下版本的 apk

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM