一、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不自动安装问题