Android开发APP内自动更新不会安装的问题(适配Android8.0以上系统)

430 阅读3分钟

文章目录

适配说明

自动更新很多APP都会有,也有很多第三方的库,但是这些库很多也都是两三年之前写的,当时并没有8.0,9.0这些高版本的手机,如果贸然使用,在测试的时候发现没有问题,到了新版本上就会在很多手机上发现自动更新下载完成后并不会自动安装,这样就会重复下载,但每次下载都不会安装,这时候线上已经有很多版本了,一旦强制更新,这些新手机上就会出现问题,很难弥补,所以第三方库一定要慎用,出现这个问题是因为在api26以后,Android系统增加了一个权限,那就是允许位置应用安装的权限,默认是关闭的,在8.0以上系统手机中,没有打开这个权限就不会出现应用更新下载完成后的安装界面。所以就要引导用户在自动更新下载完成后引导用户打开8.0以上手机的允许位置应用安装的权限。

打开允许未知应用安装的权限

manifest文件中配置权限:

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
private void openAllowedPermission() {
        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(HomeActivity1.this);
        alertDialog.setIcon(R.mipmap.logo);
        alertDialog.setTitle("版本更新");
        alertDialog.setMessage("未避免程序安装异常,请设置应用授权");
        alertDialog.setCancelable(false);
        alertDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        alertDialog.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            //8.0允许位置应用安装权限申请
                **Uri packageURI = Uri.parse("package:"+HomeActivity1.this.getPackageName());
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);
                startActivityForResult(intent, INSTALL_APK_REQUESTCODE);**
            }
        });
        alertDialog.show();

    }


 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == INSTALL_APK_REQUESTCODE && resultCode ==0){
            if (requestCode ==0){
               installApkFile(context, file);//file就是下载的apk文件
            }else {
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
                startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
                ToastUtils.showToast2(this,"请打开允许安装未知应用的权限");
            }

        }
    }

//安装
 public static void installApkFile(Context context, File file) {
        Intent intent1 = new Intent(Intent.ACTION_VIEW);
        if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ) {
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent1.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
            intent1.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent1.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        if ( context.getPackageManager().queryIntentActivities(intent1, 0).size() > 0 ) {
            context.startActivity(intent1);
        }

判断应用是否已经安装

package com.lab.web.entity;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;

import static android.app.Activity.RESULT_OK;

/**
 * Created by ppg on 2017/12/19.
 */

public class CheckApkExist {
    private static String facebookPkgName = "com.tencent.android.qqdownloader ";//应用宝包名

    public static boolean checkApkExist(Context context, String packageName){
        if (TextUtils.isEmpty(packageName))
            return false;
        try {
            ApplicationInfo info = context.getPackageManager()
                    .getApplicationInfo(packageName,
                            PackageManager.GET_UNINSTALLED_PACKAGES);
//            Timber.d(info.toString());
            return true;
        } catch (PackageManager.NameNotFoundException e) {
//          Timber.d(e.toString());
            return false;
        }
    }

    public static boolean checkFacebookExist(Context context){
        return checkApkExist(context, facebookPkgName);
    }

    public static boolean isAppInstalled(Context context,String packagename)
    {
        PackageInfo packageInfo;
        try {
            packageInfo = context.getPackageManager().getPackageInfo(packagename, 0);
        }catch (PackageManager.NameNotFoundException e) {
            packageInfo = null;
            e.printStackTrace();
        }
        if(packageInfo ==null){
            //System.out.println("没有安装");
            return false;
        }else{
            //System.out.println("已经安装");
            return true;
        }
    }

}

普通浏览器下载apk

 boolean b = CheckApkExist.(this, packeName.toString());//com.android.app.quanmama_5.0.3_503
                if (b) {//已经安装打开劵妈妈
//                    Uri uri = Uri.parse("market://details?id=" + "com.android.app.quanmama");
                    Uri uri = Uri.parse("market://details?id=" + packeName.toString());
                    Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
                    try {
                        Constants.yingyonbbao = true;
//                       goToMarket.setClassName("com.tencent.android.qqdownloader", "com.android.app.quanmama");
                        myContext.startActivity(goToMarket);
                    } catch (ActivityNotFoundException e) {
                        e.printStackTrace();
                    }

                } else {
                    Constants.yingyonbbao = true;
//                    Uri uri = Uri.parse("market://details?id=com.android.app.quanmama");//id为包名
                    Uri uri = Uri.parse("market://details?id=" + packeName.toString());//id为包名
                    Intent it = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(it);

                }

安全下载(应用宝市场下载apk)

boolean b = CheckApkExist.isAppInstalled(this, "com.tencent.android.qqdownloader");
                if (b) {//已经安装打开应用宝的劵妈妈下载页面
//                   Uri uri = Uri.parse("market://details?id=" + "com.android.app.quanmama");
                    Uri uri = Uri.parse("market://details?id=" + packeName.toString());
                    Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
                    try {
//                      goToMarket.setClassName("com.tencent.android.qqdownloader", "com.tencent.pangu.link.LinkProxyActivity");
                        myContext.startActivity(goToMarket);
                        Constants.yingyonbbao = true;
                    } catch (ActivityNotFoundException e) {
                        e.printStackTrace();
                    }
Toast.LENGTH_SHORT).show();
                } else {//未安装应用宝去下载
                    Constants.yingyonbbao = true;
                    Uri uri = Uri.parse("market://details?id="+packeName.toString());//id为包名
                    Intent it = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(it);
                }