Android6.0之前的动态权限管理模型及原理--AppOpsManager(Android4.3引入),Android6.0及之后的运行权限模型、动态权限管理原理--runtime permission。
1. SDK 6.0:动态权限管理、过度动画、支付、指纹等;
2. SDK 6.0 开发者及用户权限控制。
3. 对Android系统来说,指纹解锁是Android6.0才添加的新功能,到Android P系统还会强化指纹解锁的功能,提供越来越便捷的API。
4. SDK 6.0删除了HttpClient。
-- android 权限开发者官网也有相关描述:
http://developer.android.com/training/permissions/requesting.html
http://developer.android.com/guide/topics/security/permissions.html
Android 6.0开始,Google将权限分为两类,一类是Normal Permission, 这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。Android所有的危险权限,剩余的权限就都是普通权限。
> Android 6.0新特性
1.锁屏下语音搜索
用户可以直接在锁屏状态下进行语音搜索,虽然现在的一些安卓手机支持语音唤醒功能,但这些语音唤醒都是第三方厂商开发的,而此次的Android 6.0在系统层面加入锁屏下语音搜索,这无疑会在体验上有一个明显的提升。
2.指纹识别
说到指纹识别,很多用户都会觉得现在的中高端安卓手机都支持,但事实上这些安卓手机的指纹识别都是各个厂商自行开发的并没有系统底层的支持。Android 6.0则在系统层面加入指纹识别,能提供原生指纹识别API,这不但降低了厂商开发指纹识别模块的成本,最重要的是原生指纹识别将会大大提升安卓手机的指纹识别支付安全性。
3.更完整的应用权限管理
在此前的原生安卓系统中有应用通知管理功能,但更为深入的应用权限管理只能靠第三方应用实现。Android 6.0进一步强化应用权限管理,应用权限管理也成为系统级的功能,不过这对于那些权限管理软件来说并不是什么好消息。
4.Doze电量管理
Android 6.0自带Doze电量管理功能,在“Doze”模式下,手机会在一段时间未检测到移动时,让应用休眠清杀后台进程减少功耗,谷歌表示,当屏幕处于关闭状态,平均续航时间提高30%。
5.Now on Tap功能
Now on Tap功能是和Google搜索紧密结合的功能,它可以让谷歌从任何应用中进行搜索。例如,在微信中聊天的时候提到餐馆,那么就可以在不跳转的情况下进行谷歌搜索。
6.App Links
通过App Links功能,Android平台能够向网络服务器提出申请,自主识别链接内容。直接跳转到App客户端中,改善用户体验,有利于让用户在体验更完善的App客户端完成更多操作。
此外,在Android 6.0谷歌还加入了Android Pay进一步强化移动支付,同时也是为了对抗Apple Pay。在发布会上谷歌表示Android 6.0将在下周开始推送,Nexus5/6/7/9以及Nexus Player将能够在第一时间得到升级。
> Android6.0 动态权限
Android6.0 动态权限详解及动态申请权限- https://www.jianshu.com/p/250daeee8b99
Android6.0 动态权限详解及动态申请权限- https://github.com/summerHearts/AndroidPermission
android权限的变化- https://www.cnblogs.com/slyfox/p/6814978.html
android6.0获取通讯录权限(权限组)- https://blog.csdn.net/zhuyu19911016520/article/details/53519405/
Android6.0权限适配- https://blog.csdn.net/zhangquanit/article/details/52735791
Android 6.0权限适配,采用Annotation的方式、targetSdkVersion 23 、targetSdkVersion=23的权限适配方案
Android6.0权限适配及兼容库的实现- https://github.com/happylishang/PermissionCompat
将build.gradle中的API targetSdkVersion设置为23。
-- 6.0之前Android的权限都是在安装的时候授予的,6.0之后,为了简化安装流程,并且方便用户控制权限,Android允许在运行的时候动态控制权限。对于开发而言就是将targetSdkVersion设置为23,当运行在Android 6.0 +的手机上时,就会调用6.0相关的API,达到动态控制权限的目的。但是,如果仅仅是将targetSdkVersion设置为23,而在代码层面没有针对Android 6.0做适配,就可能在申请系统服务的时候,由于权限不足,引发崩溃。
-- 最近发现一个问题,我在使用ContextCompat.CheckSelfPermission()时无论如何开关权限返回值都是PackageManager.PERMISSION_GRANTED,而使用PackageManager.checkPermission()的时候返回值又始终都是PackageManager.PERMISSION_DENIED;
经过多番尝试和查找资料发现原因:
If your application is targeting an API level before 23 (Android M) then both:ContextCompat.CheckSelfPermission and Context.checkSelfPermission doesn't work and always returns 0 (PERMISSION_GRANTED). Even if you run the application on Android 6.0 (API 23).
在targetSdkVersion小于23(Android M)的时候,ContextCompat.CheckSelfPermission 和Context.checkSelfPermission方法都不能正常工作并且始终返0(PERMISSION_GRANTED),即使你的应用运行在Android6.0(API 23)的设备上。
解决办法:
As I said in the 1st point, if you targeting an API level before 23 on Android 6.0 then ContextCompat.CheckSelfPermission and Context.checkSelfPermission doesn't work. Fortunately you can use PermissionChecker.checkSelfPermission to check run-time permissions.
-- 最近发现一个问题,我在使用ContextCompat.CheckSelfPermission()时无论如何开关权限返回值都是PackageManager.PERMISSION_GRANTED,而使用PackageManager.checkPermission()的时候返回值又始终都是PackageManager.PERMISSION_DENIED;
只要App的targetSDKVersion < 23,那么ContextCompat.CheckSelfPermission()无论什么请款都返回PackageManager.PERMISSION_GRANTED,就算是运行在Android 6.0以上版本的系统中也不行。
解决办法:使用PermissionChecker.checkSelfPermission() 方法检查权限。 这个方法在 android.support.v4.content 包下。官网的描述这个对象专门就是用于在targetSDKVersion < 23的情况下检查权限使用的。对比android.support.v4 类库代码后发现也是在23.0.0这个版本中加入的,所以必须要有android-23的SDK包才能使用。如果找不到这个类请升级一下SDK后再看看。或者检查一下引用的android.support.v4 类库版本。
> Android 6.0动态权限兼容封装库,权限模型,权限申请
(Google 原生权限 API)- https://pan.baidu.com/s/1dnaugm
--(推荐)针对运行时权限管理,开源的管理库- https://github.com/yanzhenjie/AndPermission
1.Requesting runtime permissions on Android 6.0 or higher.
2.Sharing private files on Android 7.0 or higher.
3.Installing unknown source apk on Android 8.0 or higher,android.permission.REQUEST_INSTALL_PACKAGES
android6.0获取通讯录权限及权限组- https://blog.csdn.net/zhuyu19911016520/article/details/53519405
Android权限操作之uses-permission详解- https://www.cnblogs.com/fnlingnzb-learner/p/7239614.html
Android动态权限管理模型(4.3-6.0)- https://segmentfault.com/a/1190000009214983
Android 6.0 申请权限- http://blog.csdn.net/u012881042/article/details/52191392
谷歌官方的 googlesamples/easypermissions- https://github.com/googlesamples/easypermissions
谷歌官方的RuntimePermissions- https://github.com/googlesamples/android-RuntimePermissions
Android6.0动态权限申请: https://github.com/qianxiaoai/RuntimePermissionsDemo ,
基于编译期注解的permissions-dispatcher/PermissionsDispatcher- https://github.com/permissions-dispatcher/PermissionsDispatcher
动态权限- https://github.com/parkingwang/hey-permission
2016-12-27郭霖-6.0运行时权限源码- http://download.csdn.net/detail/donkor_/9722986
permissions4m- https://github.com/jokermonn/permissions4m
Android 6.0 运行时权限处理完全解析- https://github.com/lovedise/PermissionGen
Android 6.0 运行时权限处理完全解析- https://github.com/hongyangAndroid/MPermissions.
-- android 6.0权限全面详细分析和解决方案- https://blog.csdn.net/hudashi/article/details/50775180
int hasWriteContactsPermission = ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasWriteContactsPermission == PackageManager.PERMISSION_GRANTED) {
startGetImageThread();
}
Activity中授予权限:
ContextCompat.checkSelfPermission(); ActivityCompat.requestPermissions();
ActivityCompat.OnRequestPermissionsResultCallback; ActivityCompat.shouldShowRequestPermissionRationale()
Fragment中授予权限:
FragmentCompat.requestPermissions();FragmentCompat.shouldShowRequestPermissionRationale()
-- Android 动态权限设计 (权限的申请与处理)(Google 原生权限 API)- https://pan.baidu.com/s/1dnaugm
https://pan.baidu.com/s/1dnaugm?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=
ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED;
ActivityCompat.requestPermissions(activity, permissions, resultCode);
onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
//联系人/通讯录权限
permissions.put("android.permission.WRITE_CONTACTS","--通讯录/联系人");
permissions.put("android.permission.GET_ACCOUNTS","--通讯录/联系人");
permissions.put("android.permission.READ_CONTACTS","--通讯录/联系人");
//电话权限
permissions.put("android.permission.READ_CALL_LOG","--电话");
permissions.put("android.permission.READ_PHONE_STATE","--电话");
permissions.put("android.permission.CALL_PHONE","--电话");
permissions.put("android.permission.WRITE_CALL_LOG","--电话");
permissions.put("android.permission.USE_SIP","--电话");
permissions.put("android.permission.PROCESS_OUTGOING_CALLS","--电话");
permissions.put("com.android.voicemail.permission.ADD_VOICEMAIL","--电话");
//日历权限
permissions.put("android.permission.READ_CALENDAR","--日历");
permissions.put("android.permission.WRITE_CALENDAR","--日历");
//相机拍照权限
permissions.put("android.permission.CAMERA","--相机/拍照");
//传感器权限
permissions.put("android.permission.BODY_SENSORS","--传感器");
//定位权限
permissions.put("android.permission.ACCESS_FINE_LOCATION","--定位");
permissions.put("android.permission.ACCESS_COARSE_LOCATION","--定位");
//文件存取
permissions.put("android.permission.READ_EXTERNAL_STORAGE","--文件存储");
permissions.put("android.permission.WRITE_EXTERNAL_STORAGE","--文件存储");
//音视频、录音权限
permissions.put("android.permission.RECORD_AUDIO","--音视频/录音");
//短信权限
permissions.put("android.permission.READ_SMS","--短信");
permissions.put("android.permission.RECEIVE_WAP_PUSH","--短信");
permissions.put("android.permission.RECEIVE_MMS","--短信");
permissions.put("android.permission.RECEIVE_SMS","--短信");
permissions.put("android.permission.SEND_SMS","--短信");
permissions.put("android.permission.READ_CELL_BROADCASTS","--短信");
-- 一般判断是否有拍照权限(Android6.0之前的)的办法:
1.通过Camera.open()之后判断camera==null?
2.有些手机即使禁掉拍照权限获取到的camera也不为null(比如魅族),这时可以通过捕获camera.getParameters()产生的异常,来判断。
3.还有的(比如VIVO),在禁止拍照权限的情况下,camera!=null并且camera.getParameters()还捕获不到异常。但是通过对比授予和禁止权限之后得到的camera发现有一个mHasPermission的属性对应是否获取权限。但是没法直接获取到这个属性的值。所以通过反射获取。Android6.0之前Vivo获取照相机权限问题:
/**
* Created by zhangyc on 2018/6/5.
* 针对6.0以下某些定制rom需要动态授权引发的异常处理
*/
public class CameraCheckUtil {
public static boolean isHas(){
try {
Camera camera = Camera.open(0);
camera.getParameters();
camera.release();
camera=null;
return true;
}catch (Exception e){
return false;
}
}
}
private static final String MARK = Build.MANUFACTURER.toLowerCase();
private boolean hasCameraPermission() {
Field fieldPassword = null;
try {
Camera camera = Camera.open();
fieldPassword = camera.getClass().getDeclaredField("mHasPermission");
fieldPassword.setAccessible(true);
return (boolean) fieldPassword.get(camera);
} catch (Exception e) {
e.printStackTrace();
return true;
}
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if(hasCameraPermission()){
LogUtil.e("desaco","onEvent hasCameraPermission() true");
}else{
LogUtil.e("desaco","onEvent hasCameraPermission() false");
return;
}
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M && Build.MANUFACTURER.toLowerCase().contains("vivo")) {}
> 权限设置页面跳转
Android各大手机品牌手机跳转到权限管理界面- https://www.jianshu.com/p/b5c494dba0bc;
Android 跳转权限设置界面的终极适配(适配各大定制 ROM)- https://www.jianshu.com/p/58c6ca8173c4;
整理并收集各种常用的覆盖面广的工具类- https://github.com/SenhLinsh/Utils-Everywhere;
Android 跳转权限设置界面的终极适配(适配各大定制 ROM)- https://blog.csdn.net/donkor_/article/details/79374442
> Android 6.0新控件和新特性
Android 6.0 Marshmallow 中的 android:extractNativeLibs="false" 选项提供支持,并允许应用使用较少的设备空间,同时在 Play 商店上产生较小的更新。
Android高级第十一讲之不同系统间的区别-http://blog.csdn.net/reboot123/article/details/52461897
Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用: http://blog.csdn.net/feiduclear_up/article/details/46514791
Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用: http://blog.csdn.net/feiduclear_up/article/details/46500865
android6.0进入Material Design时代 http://blog.csdn.net/cao861544325/article/details/48223587
Android 6.0 中新的新技术 http://android.jobbole.com/81272/
Android6.0系统增加那些新特性: http://www.2cto.com/kf/201604/499603.html
Android 启动系统相机,相册,裁剪图片及6.0权限管理-http://blog.csdn.net/gdutxiaoxu/article/details/53411790
> 应用自动启动”和“关联启动”权限,后台保活
Android后台保活实践总结:即时通讯应用无法根治的“顽疾”- http://www.52im.net/thread-429-1-1.html
APP MarsDaemon进程保活- https://github.com/52im/MarsDaemon
Android进程保活的一般套路- http://www.sohu.com/a/128467009_608959
进程保活的一般套路- https://github.com/herojing/KeepProcessLive
android引导用户开启自启动权限- https://blog.csdn.net/qq_29612963/article/details/77841075
/**
* 跳转到自启动页面
*
* 华为 com.huawei.systemmanager/com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity
* 小米 com.miui.securitycenter/com.miui.permcenter.autostart.AutoStartManagementActivity
* vivo com.iqoo.secure/.ui.phoneoptimize.AddWhiteListActivity
* oppo com.coloros.oppoguardelf/com.coloros.powermanager.fuelgaue.PowerUsageModelActivity
*
*/
private void selfStartManagerSettingIntent(Context context){
String system = EquipmentSystemUtils.getSystem();
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName componentName = new ComponentName("com.huawei.systemmanager","com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity");
intent.setComponent(componentName);
try{
context.startActivity(intent);
}catch (Exception e){//抛出异常就直接打开设置页面
intent=new Intent(Settings.ACTION_SETTINGS);
context.startActivity(intent);
}
}
> Android 6.0 SDK 找不到HttpClient的解决方法:
Google在6.0版本里面删除了HttpClient相关API...
android6.0SDK 删除HttpClient的相关类的解决方法- http://blog.csdn.net/yangqingqo/article/details/48214865
1.在eclipse添加HttpClient jar
libs中加入 org.apache.http.legacy.jar
上面的jar包在:**\android-sdk-windows\platforms\android-23\optional下(需要下载android 6.0的SDK)
2.在android studio添加HttpClient jar
在相应的,module下的build.gradle中加入:
android{
useLibrary 'org.apache.http.legacy'
}
> 权限与权限组,权限成组授权
Android6.0权限组 动态申请所有权限详细介绍- https://blog.csdn.net/qq_25804863/article/details/53517129
> android 6.0采用新的权限机制来保护用户的隐私,将权限分为Normal Permissions和Dangerous Permission;
1.Normal Permissions一般不涉及用户隐私,是不需要用户授权的,具体如下:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
Dangerous Permissions
2.Dangerous Permissions涉及到用户隐私,在使用时需要用户实时授权才行;
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS