美文网首页
Android 踩坑记1---------Android8.0自

Android 踩坑记1---------Android8.0自

作者: 迷途小顽童 | 来源:发表于2018-08-01 15:31 被阅读193次

最近发布版本测试发现部分手机无法升级安装问题,查询手机系统发现都是8.0+设备,后查看代码发现没有最8.0新特性适配,所以出现这种问题。

Android 8.0为了防止手机安装一些不安全软件,在安装非市场来源软件的时候需要请求安装未知应用来源的权限,故在安装软件之前需要用户允许此权限才可以进行安装。

具体操作如下:

1、首先在Mainfest文件中添加该权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

2、在需要升级下载软件前判断版本是否是8.0或8.0+,如果不是则执行自己之前正常下载逻辑,如果是则需要判断是否允许安apk

getPackageManager().canRequestPackageInstalls()

如果没有允许则需要去申请这个权限,这里要注意,网上有蛮多文章介绍使用

ActivityCompat.requestPermissions((Activity) context, new String[]{android.Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);

经测试这个方法在调用的时候没有弹出申请权限提示框,原因不明,所以考虑使用让用户手动去设置权限的方法去请求

Uri packageURI = Uri.parse("package:" + getPackageName());//直接跳转到自己的app页,如果不加会跳转到应用列表页
//注意这个是8.0新APIIntent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);

用户设置完之后在onActivityResult方法中根据自己设置的code去做逻辑处理,我这里使用的是GET_UNKNOWN_APP_SOURCES

完整代码如下

/**
     * 需要判断是否是Android8.0版本
     */
    private void checkIsAndroidO() {
        if (Build.VERSION.SDK_INT >= 26) {
            boolean b = MkzApplication.getInstance().getPackageManager().canRequestPackageInstalls();
            if (b) {
                dialog.doUpdate();//安装应用的逻辑(写自己的就可以)
            } else {
                //请求安装未知应用来源的权限,这里加了弹框提示
                MkzDialogUtils.showDialogWithBtn(SettingActivity.this, "", "安装应用需要打开未知来源权限,请去设置中开启权限", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Uri packageURI = Uri.parse("package:" + getPackageName());
                        //注意这个是8.0新API
                        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
                        startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
                    }
                }, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
            }
        } else {
            dialog.doUpdate();
        }
    }
 
 
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == GET_UNKNOWN_APP_SOURCES && resultCode == Activity.RESULT_OK){
            checkIsAndroidO();
        }
    }

至此权限申请就完成了

下载逻辑按照自己的处理,如果你的下载逻辑中有通知栏,你会发现通知栏没有弹出来,因为8.0还是要继续进行适配,具体方案移步至我的下一篇文章 Android 踩坑记2---------Android8.0系统通知创建坑

相关文章

  • Android 踩坑记1---------Android8.0自

    最近发布版本测试发现部分手机无法升级安装问题,查询手机系统发现都是8.0+设备,后查看代码发现没有最8.0新特性适...

  • Android Material Design 踩坑记(2)

    Android Material Design 踩坑记(1) CoordinatorLayout Behav...

  • Android 日常踩坑

    1、Android NDK开发踩坑 踩坑环境 Android Studio 3.4.1,JDK 1.8 1、为什么...

  • Android WebView 踩坑记

    js中点击按钮跳转界面时跳用android中修改UI界面的方法。android的方法可以调用的到,但是h5中的页面...

  • Android Kotlin踩坑记

    只有真的入了坑,才知道坑有多深 null问题 Kotlin中属性在声明的时候会遇到这几种情况: 属性声明var p...

  • Android开发踩坑记

    RecyclerView踩坑 position RecyclerView中position和ListView中po...

  • Cordova踩坑日记

    Cordova踩坑日记 1.配置环境 ​ 配置SDK踩了很多坑,其实只需要下载一个 android studi...

  • Android Paint XferMode踩坑记

    前言 某天,在网上看到一个水波纹ProgressView的例子,N天之后突然想自己实现一个,由于之前做过一个圆形I...

  • Android通知栏踩坑记

    1.动态注册广播无法触发点击事件 场景:通知栏的点击事件通常会采用PendingIntent.getBroadca...

  • Android面试踩坑记(一)

    工作了这么久,在一家有问题的公司(公司名字不提)工作了这么久,终于到了下决心离职的时刻,心情低落的同时也有些期待!...

网友评论

      本文标题:Android 踩坑记1---------Android8.0自

      本文链接:https://www.haomeiwen.com/subject/jflrvftx.html