Android 下载和更新APK

请先移步 下载服务器上文件时的配置

添加权限

<!--未知应用安装权限-->
<uses-permission android:name="android.permission.REPLACE_EXISTING_PACKAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

在manifest的application标签下添加

<!--        android:authorities="包名.fileprovider" />-->
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.mydemo.test3.fileprovider"
            android:exported="false"
            tools:replace="android:authorities"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

在res的xml文件夹下新建provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--    com.example.mydemo.myapplication 更改为你的包名-->
    <external-path path="Android/data/com.example.mydemo.myapplication/"        name="files_root" />
    <external-path path="." name="external_storage_root" />
</paths>

Activity

/**
 * @anthor GrainRain
 * @funcation
 * @date 2019/10/28
 */
public class UpgradeAct extends Activity {

    private String filePath = Environment.getExternalStorageDirectory() + "/UnmannedShip";
    private String apkName = "apkTest.apk";

    private Button button1;
    public static final int downloadAPKRequestCode = 200;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        //动态获取权限
        ApplyPermission.ApplyPermission(UpgradeAct.this);

        button1 = findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                new UpgradeAPKUtil("http://47.112.96.171:8081/DownloadFile/apkTest.apk",
                        filePath, apkName, UpgradeAct.this);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("---------------", requestCode + " " + resultCode);
        switch (requestCode) {
            case downloadAPKRequestCode:
                if(resultCode == -1) {
                    UpgradeAPKUtil.installApk(UpgradeAct.this, filePath, apkName);
                }
        }
    }

}

下载安装apk工具类
instartApk类里需要修改包名

public class UpgradeAPKUtil {

    private String downloadAPKUrl, filePath, APKName;
    private static Activity activity;

    //APKName 保存的apk名
    public UpgradeAPKUtil(String downloadAPKUrl, String installAPKPath, String APKName, Activity activity) {

        setAPKName(APKName);
        setDownloadAPKUrl(downloadAPKUrl);
        setFilePath(installAPKPath);
        setActivity(activity);

        new Thread(downloadApkRunnable).start();
        showProgressDialog(activity, "正在下载apk...", 100);
    }

    //下载APK的子线程
    Runnable downloadApkRunnable = new Runnable() {
        @Override
        public void run() {
            // TODO
            // 在这里进行 http request.网络请求相关操作
            DownloadUtil.get().download(getDownloadAPKUrl(), getFilePath(), getAPKName(),

                    new  DownloadUtil.OnDownloadListener() {
                        @Override
                        public void onDownloadSuccess(File file) {
                            Log.e("---------", "onDownloadSuccess");
                            instartApk(getActivity(), getFilePath(), getAPKName());
                        }
                        @Override
                        public void onDownloading(int progress) {
                            Log.e("---------", "onDownloading " + progress);
                            progressDialogNum = progress;

                        }
                        @Override
                        public void onDownloadFailed(Exception e) {
                            Log.e("---------", "onDownloadFailed " + e.getMessage());
                        }
                    });
        }
    };

    //兼容8.0安装位置来源的权限	 

    private void instartApk(Activity activity, String downloadApkPath, String apkName) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //是否有安装位置来源的权限
            boolean haveInstallPermission = activity.getPackageManager().canRequestPackageInstalls();
            if (haveInstallPermission) {
                installApk(activity, downloadApkPath, apkName);
            } else {
            //com.example.mydemo.myapplication更改为你的包名
                Uri packageUri = Uri.parse("package:" + "com.example.mydemo.myapplication");
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageUri);
                getActivity().startActivityForResult(intent, downloadAPKRequestCode);
            }
        } else {
            installApk(activity, downloadApkPath, apkName);
        }
    }

    //根据安装包路径安装apk
    public static void installApk(Activity activity, String apkPath, String apkName) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        File apkFile = new File(apkPath + "/" + apkName);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

            Uri contentUri = FileProvider.getUriForFile(activity, "com.example.mydemo.myapplication.fileprovider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        activity.startActivity(intent);
    }

    //进度条dialog
    //进度
    private static int progressDialogNum = 0;
    private static void showProgressDialog(Context context, String title, final int max_progress) {

        final ProgressDialog progressDialog = new ProgressDialog(context);
        progressDialog.setProgress(0);
        progressDialog.setTitle(title);
        //设置样式
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(max_progress);
        //禁止通过点击屏幕和返回键来取消对话框
        progressDialog.setCancelable(false);
        progressDialog.show();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (progressDialogNum < max_progress){
                    try {
                        progressDialog.setProgress(progressDialogNum);
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                }
                // 进度达到最大值后,窗口消失
                progressDialog.cancel();
                progressDialogNum = 0;
            }
        }).start();
    }

    private String getDownloadAPKUrl() {
        return downloadAPKUrl;
    }

    private void setDownloadAPKUrl(String downloadAPKUrl) {
        this.downloadAPKUrl = downloadAPKUrl;
    }

    private String getFilePath() {
        return filePath;
    }

    private void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    private String getAPKName() {
        return APKName;
    }

    private void setAPKName(String APKName) {
        this.APKName = APKName;
    }

    public Activity getActivity() {
        return activity;
    }

    public void setActivity(Activity activity) {
        this.activity = activity;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值