6.0 Marshmallow 23
6.0 动态申请权限
private void checkAppPermission() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)//
{
//伪代码
/*ArrayList permissons =new ArrayList();
permissons.add(Manifest.permission.RECORD_AUDIO);
permissons.add(Manifest.permission.READ_EXTERNAL_STORAGE);
permissons.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
permissons.add(Manifest.permission.CAMERA);*/
//通过ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED判断相关权限是否允许
//若尚未允许则ActivityCompat.requestPermissions(activity, permissions.toArray(new String[permissions.size()]), permissionRequestCode);
//int requestCode=0x00000001;
}
}
6.0 位置权限
蓝牙扫描也需要位置权限。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
7.0 Nougat 24-25
7.0 应用间共享文件
https://blog.csdn.net/lmj623565791/article/details/72859156
去AndroidManifest.xml声明provider,provider里边有meta-data属性,里边需要指向设有子节点一个xml文件。
核心代码FileProvider.getUriForFile(this, "com.zhy.android7.fileprovider", file);
7.0 PopupWindow位置不正确
代码来源:https://blog.csdn.net/qq_17766199/article/details/77404712
if (Build.VERSION.SDK_INT >= 24) { // Android 7.x中,PopupWindow高度为match_parent时,会出现兼容性问题,需要处理兼容性
int[] location = new int[2]; // 记录anchor在屏幕中的位置
anchor.getLocationOnScreen(location);
int offsetY = location[1] + anchor.getHeight();
if (Build.VERSION.SDK_INT >= 25) { // Android 7.1 ,8.0中,PopupWindow高度为 match_parent 时,会占据整个屏幕
// 故而需要在 Android 7.1上再做特殊处理
int screenHeight = ScreenUtils.getScreenHeight(context); // 获取屏幕高度
popupWindow.setHeight(screenHeight - offsetY); // 重新设置 PopupWindow 的高度
}
popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY);
} else {
popupWindow.showAsDropDown(anchor);
}
7.0 三个广播被禁止监听或发送
8.0 Oreo 26-27
8.0 安装apk
安卓8.0去除了“允许未知来源”选项,如果apk里边有安装apk的功能(如应用更新),需用canRequestPackageInstalls()
查询是否有此权限,没有的话用Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES
这个action引导用户到安装未知来源应用界面去授权。
代码示例来源:https://blog.csdn.net/qq_17766199/article/details/80965631
private static final int REQUEST_CODE_UNKNOWN_APP = 100;
private void installAPK(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
if (hasInstallPermission) {
//安装应用
} else {
//跳转至“安装未知应用”权限界面,引导用户开启权限
Uri selfPackageUri = Uri.parse("package:" + this.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri);
startActivityForResult(intent, REQUEST_CODE_UNKNOWN_APP);
}
}else {
//安装应用
}
}
//接收“安装未知应用”权限的开启结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_UNKNOWN_APP) {
installAPK();
}
}
8.0广播
静态广播无法清单注册,动态的可以。
8.0通知权限Notification
代码来源:https://blog.csdn.net/yinhaide/article/details/103295050
/**
* 判断通知权限是否开启
* @param context 上下文
*/
public static boolean isNotificationEnabled(Context context){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE)).areNotificationsEnabled();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.uid;
try {
Class<?> appOpsClass = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod = appOpsClass.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE, String.class);
Field opPostNotificationValue = appOpsClass.getDeclaredField("OP_POST_NOTIFICATION");
int value = (Integer) opPostNotificationValue.get(Integer.class);
return (Integer) checkOpNoThrowMethod.invoke(appOps, value, uid, pkg) == 0;
} catch (NoSuchMethodException | NoSuchFieldException | InvocationTargetException | IllegalAccessException | RuntimeException | ClassNotFoundException ignored) {
return true;
}
} else {
return true;
}
}
//前往设置开启权限
/**
* 打开设置页面打开权限
*
* @param activity activity
* @param requestCode 这里的requestCode和onActivityResult中requestCode要一致
*/
public static void startSettingActivity(@NonNull Activity activity, int requestCode) {
try {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + activity.getPackageName()));
intent.addCategory(Intent.CATEGORY_DEFAULT);
activity.startActivityForResult(intent, requestCode);
} catch (Exception e) {
e.printStackTrace();
}
}
————————————————
版权声明:本文为CSDN博主「尹海德」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yinhaide/article/details/103295050
9.0 Pie 28
10.0 Q 29
最大的变化是用户隐私权
10.0 存储权限
·访问自己程序的文件,不需要请求权限,取消了READ_EXTERNAL_STORAGE
和 WRITE_EXTERNAL_STORAGE
权限
·访问沙盒外的媒体共享文件,需申请新的媒体权限,READ_MEDIA_IMAGES
,READ_MEDIA_AUDIO
和READ_MEDIA_IMAGES
。
·