android 版本更新6.0、7.0和8.0权限适配

本文详细介绍Android系统中6.0权限(动态权限)的管理方法,包括权限检查与申请流程。同时,针对7.0及8.0系统,讲解了安装应用的具体步骤,涵盖了从权限设置到使用FileProvider实现安全的文件访问,以及处理8.0系统中未知应用来源权限的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、6.0权限(动态权限)
private static final int PERMISSION_CODE = 1001;
/**
 * 预备下载 进行 6.0权限检查
 */
private void preDownLoad() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        showLoadProgress();
    } else {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            showLoadProgress();

        } else {//申请权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_CODE);
        }
    }
}

/**
 * 权限请求结果
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case PERMISSION_CODE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                showLoadProgress();
            } else {
                AlertDialog showSettingDialog = new AlertDialog.Builder(this)
                        .setTitle("您好")
                        .setPositiveButton("确定", (dialog, which) -> {
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            intent.setData(Uri.parse("package:" + getPackageName())); // 根据包名打开对应的设置界面
                            startActivityForResult(intent, PACKAGE_SETTING_CODE);
                        })
                        .setNegativeButton("取消", (dialog, which) -> {
                            dialog.dismiss();
                            this.finish();
                        })
                        .setMessage("暂无读写SD卡权限\n是否前往设置?")
                        .create();
                showSettingDialog.show();
                showSettingDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(context.getResources().getColor(R.color.colorPrimary));
                showSettingDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(context.getResources().getColor(R.color.colorPrimary));
            }
            break;
    }
}

二、7.0安装应用

(1)

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", apkFile); 
intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); 

} else { 

intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); 

} 
context.startActivity(intent);

(2)AndroidMainfest.xml文件

<!--版本更新服务--> 

<provider android:name="android.support.v4.content.FileProvider" 
android:authorities="包名.fileprovider" 
android:exported="false" 
android:grantUriPermissions="true"> 
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> 
</provider>

(3)res/xml/file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <root-path
            path="属性值"
            name="属性值" />
    </paths>
</resources>

注意:属性值根据自己的需要进行设置

 

3、Android 8.0安装apk不自动安装问题

(1)在AndroidMainfest.xml文件加权限

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

增加申请权限,有这一句足矣,如果想写的更好的话,加上权限判断呗

/**
 * 判断是否是8.0,8.0需要处理未知应用来源权限问题,否则直接安装
 */
private void checkIsAndroidO() {
    if (Build.VERSION.SDK_INT >= 26) {
        boolean b = getPackageManager().canRequestPackageInstalls();
        if (b) {
            //安装应用的逻辑
            installApp();
        } else {
            //设置安装未知应用来源的权限
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
            startActivityForResult(intent, 10012);
        }
    } else {
        installApp();
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 10012) {
        checkIsAndroidO();
    }
}

详细描述见:关于Android8.0安装apk不自动安装问题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值