• Android13 下载apk并安装apk


    下载代码

    private void handleUpdate(String code, String file_path) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 提示用户有新版本
                new AlertDialog.Builder(MainActivity.this)
                        .setTitle("发现新版本")
                        .setMessage("新版本:是否立即下载?")
                        .setPositiveButton("下载", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        downloadFile(file_path);
                                    }
                                }).start();
                            }
                        })
                        .setNegativeButton("取消", (new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                            }
                        }))
                        .show();
            }
        });
    
     }
    

    downloadFile代码
    需要下载okhttp

    implementation ‘com.squareup.okhttp3:okhttp:4.10.0’

    private void downloadFile(String URL) {
        OkHttpClient client = new OkHttpClient();
    
        Request request = new Request.Builder()
                .url(URL)
                .build();
    
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
    
            // Write theResponseBody in entirety to the destination.
            BufferedSink sink = Okio.buffer(Okio.sink(new File(getFilesDir().getAbsolutePath() + "/apk.apk")));
            sink.writeAll(response.body().source());
            sink.close();
            installApk(getFilesDir().getAbsolutePath() + "/apk.apk");
        } catch (Exception e) {
        }
    
    }
    

    安装APK installApk

    private void installApk(String filePath) {
        File file = new File(filePath);
        Uri contentUri = FileProvider.getUriForFile(
                this,
                BuildConfig.APPLICATION_ID + ".fileprovider",
                file);
    
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(intent);
    }
    

    在AndroidManifest.xml里添加

    <provider
       android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
    

    在xml里新建file_paths.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <files-path
            name="my_files_dir"
            path="/" />
    </paths>
    
  • 相关阅读:
    1.数据对象及其类型——R语言与数据分析
    安全基础~通用漏洞6
    这份Java面试八股文堪称2022最强,让329人成功进入大厂
    怎么申请工程勘察资质,申请工程勘察乙级资质需要满足什么条件
    【JavaScript】文件分片上传
    大语言模型LLM分布式训练:TensorFlow攻略与深度解析(LLM系列04)
    SpEL表达式详解
    CTFHub | 布尔盲注
    深入理解requests库和使用方法
    LeetCode //C - 149. Max Points on a Line
  • 原文地址:https://blog.csdn.net/qq_34605417/article/details/142261405