Android API23以上的时候,出现了动态请求权限的APP行为,敏感权限要求用户自己选择允许或拒绝,以及如何提示用户开启相关服务。此文章以定位权限和服务为例。

在AS开发中,可能会遇到一个坑,就是即使写明了动态请求逻辑,还是唤不起系统的权限请求弹窗。在经过漫长的查找过程后,终于发现了原因:必须在build-config.gradle文件中将targetSDKVersion声明为23或者以上:

ext {config = [//app、sdk版本信息compileSdkVersion          : 25,minSdkVersion              : 14,targetSdkVersion           : 23,//22multidex                   : "1.0.3",gsonVersion                : "2.8.4",supportLibVersion          : "25.3.1",constraintLayoutVersion    : "1.1.2",orgApacheCommonsLangVersion: "2.6",baseLibrary                : ":uhome_base",]
}

升级之后要注意,所有原本清单里声明的敏感权限在应用安装之后都是默认关闭的,都需要进行动态申请。动态申请的权限,在清单文件里也必须声明。

Activity中权限处理流程(在判断有定位权限的情况下,再判断是否开启了定位服务,因定位服务的判断会同时判断定位权限,顺序不能颠倒):

 @TargetApi(Build.VERSION_CODES.M)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.community_my);initView();initDatas();checkPermissions();//判断定位权限和服务,然后定位}

checkPermissions()方法定义如下:

/*** 获取定位权限*/@RequiresApi(api = Build.VERSION_CODES.M)private void checkPermissions() {PackageManager pm = getPackageManager();List<String> needRequestPermissonList = new ArrayList<>();for (String perm : permissions2) {if (pm.checkPermission(perm, getPackageName()) != PackageManager.PERMISSION_GRANTED) {//ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED || ActivityCompat.shouldShowRequestPermissionRationale(this, perm)needRequestPermissonList.add(perm);}}
//        show("size : " + needRequestPermissonList.size());//调用系统弹窗if (needRequestPermissonList.size() > 0) {ActivityCompat.requestPermissions(this,needRequestPermissonList.toArray(new String[needRequestPermissonList.size()]),PERMISSON_REQUESTCODE);}else {//有定位权限的情况下,再判断是否开启了定位服务,因定位服务的判断会同时判断定位权限,顺序不能颠倒checkLocationServices();}}

其中permissions2取自百度定位文档中提出的需要动态获取权限 :

private String[] permissions2 = {"android.permission.CALL_PHONE","android.permission.ACCESS_COARSE_LOCATION","android.permission.ACCESS_FINE_LOCATION","android.permission.WRITE_EXTERNAL_STORAGE","android.permission.READ_EXTERNAL_STORAGE"};

checkLocationServices()定义如下:

/*** 判断是否有定位服务*/private void checkLocationServices() {LocationManager locationManager = (LocationManager) getSystemService(this.LOCATION_SERVICE);//获取所有可用的位置提供器List<String> providers = locationManager.getProviders(true);String locationProvider = null;boolean hasGPS = providers.contains(LocationManager.GPS_PROVIDER);boolean hasNETWORK = providers.contains(LocationManager.NETWORK_PROVIDER);//show("GPS : " + hasGPS + "; NETWORK : " + hasNETWORK);if (hasGPS || hasNETWORK) {//开启了定位服务和获取了定位权限startLocation();} else {showDialog(R.string.request_locat_service, new OnDailogListener() {@Overridepublic void onPositiveButton() {//跳转开启定位服务页Intent i = new Intent();i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivityForResult(i, SETTING_REQUESTCODE);}@Overridepublic void onNegativeButton() {stopLocation();//拒绝打开定位服务,缺省是深圳市curCity.setText("深圳市");}});}}

回调:

/*** 权限获取回调*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] paramArrayOfInt) {if (requestCode == PERMISSON_REQUESTCODE) {//获得权限if (verifyPermissions(paramArrayOfInt)) {startLocation();}else {//没有权限时的操作}}}/*** 检测是否所有的权限都已经授权*/private boolean verifyPermissions(int[] grantResults) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}

ps:此Activity封装了百度定位的操作: 

/*** 定位基类Activity*/
public abstract class BaseLocationActivity extends BaseActivity {protected LocationService locationService;protected MyOrientationListener orientationListener;protected BDLocation mLocation;@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();// -----------location config ------------locationService = UHomeApp.mLocationClient;//获取locationservice实例,建议应用中只初始化1个location实例,然后使用,可以参考其他示例的activity,都是通过此种方式获取locationservice实例的locationService.registerListener(mListener);//注册监听locationService.setLocationOption(locationService.getDefaultLocationClientOption());}@Overrideprotected void onResume() {super.onResume();locationService.registerListener(mListener);}@Overrideprotected void onPause() {super.onPause();locationService.unregisterListener(mListener); //注销掉监听stopLocation(); //停止定位服务}@Overrideprotected void onStop() {super.onStop();stopLocation();}@Overridepublic void onDestroy() {super.onDestroy();locationService.unregisterListener(mListener);}/*** 定位成功回调* @param location*/protected abstract void locationSuccessResult(BDLocation location);/*** 定位失败回调* @param location*/protected abstract void locationFailResult(BDLocation location);/*** 开启定位*/protected void startLocation() {if (null != locationService) {locationService.start();// 定位SDK}}/*** 关闭定位*/protected void stopLocation() {if (null != locationService) {locationService.stop();// 定位SDK}}/*** 设置方向传感器监听*/protected void setOrientationListener() {orientationListener = new MyOrientationListener(this);orientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener(){@Overridepublic void onOrientationChanged(float x){if(null != mLocation){
//                          addMyLocation((int) x);}}});// 开启方向传感器orientationListener.start();}/****** 61 : GPS定位结果,GPS定位成功。* 62 : 无法获取有效定位依据,定位失败,请检查运营商网络或者wifi网络是否正常开启,尝试重新请求定位。* 63 : 网络异常,没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位。* 65 : 定位缓存的结果。* 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。* 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。* 68 : 网络连接失败时,查找本地离线定位时对应的返回结果。* 161: 网络定位结果,网络定位定位成功。* 162: 请求串密文解析失败。* 167: 服务端定位失败,请您检查是否禁用获取位置信息权限,尝试重新请求定位。* 502: key参数错误,请按照说明文档重新申请KEY。* 505: key不存在或者非法,请按照说明文档重新申请KEY。* 601: key服务被开发者自己禁用,请按照说明文档重新申请KEY。* 602: key mcode不匹配,您的ak配置过程中安全码设置有问题,请确保:sha1正确,“;”分号是英文状态;且包名是您当前运行应用的包名,请按照说明文档重新申请KEY。* 501~700:key验证失败,请按照说明文档重新申请KEY。* 定位结果回调,重写onReceiveLocation方法,可以直接拷贝如下代码到自己工程中修改**/private BDLocationListener mListener = new BDLocationListener() {@Overridepublic void onReceiveLocation(BDLocation location) {mLocation = location;if (location.getLocType() == BDLocation.TypeServerError|| location.getLocType() == BDLocation.TypeNetWorkException|| location.getLocType() == BDLocation.TypeCriteriaException) {locationFailResult(location);}else{locationSuccessResult(location);}}};}

【Android】权限请求处理相关推荐

  1. android 一个字符串分两行显示_重新梳理Android权限管理

    Android Developer指南中,对Android安全体系结构的核心有这么一个说法:默认情况下,任何应用程序都无权执行任何会对其他应用程序.操作系统或者用户产生负面影响的操作.这句话其实就很好 ...

  2. 麦克风android权限管理,android权限处理详解

    写在前面 对于android 6.0来说,增加了权限的管理,能够更好的保护用户的隐私,当用户需要某权限时,才动态的去申请.用户也可以在应用权限管理里面关闭和打开.为了方便以后使用,这里对权限使用相关做 ...

  3. Xamarin Android权限请求

    Xamarin Android权限请求 Android权限规定了App是否可以访问特定的资源,如网络.电话和短信.在原有API 6.0之前,App在安全的时候,会请求一次权限.一旦安装后,App就可以 ...

  4. 【Android 逆向】Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )

    文章目录 一.Android 权限相关的重要的系统属性 1.ro.product.cpu.abi 属性 2.ro.zygote 属性 3.dhcp.eth0 属性 4.net.* 属性 一.Andro ...

  5. android权限控制泄露,Android应用的权限泄露分析

    摘要: 随着智能移动终端功能和用户体验的日益完善,智能手机已经被越来越多的用户使用.研究数据表明,Android手机的购买量正在逐步超越个人电脑.Android系统被应用在越来越多的智能手机上面,但是 ...

  6. Android权限申请的学习实践

    1.引子 在换到Android手机之前,对Android系统的印象是这系统app的跑马场,app可以任意索取各种权限,随意窃取各种隐私,换手机后才知道Android系统对权限的管理已有很大的改观,索取 ...

  7. android普通权限说明,Android权限说明.doc

    Android权限说明 Android权限说明 程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 各种权限说明如下: android.permission. ...

  8. android 跳转权限管理的代码,Android权限管理

    Android权限管理 说明 在targetSdkVersion的值为23或者更高,就要进行权限管理,否则如果运行在Android6.0或以上的设备会没有相应权限而导致崩溃 请求权限后,在onRequ ...

  9. Android权限Uri.parse总结

    Android权限Uri.parse的详细资料 刚整理了份Android权限Uri.parse的资料 1,调web浏览器 Uri myBlogUri = Uri.parse("http:// ...

  10. android权限--android开发中的权限及含义(下)

    android权限--android开发中的权限及含义(下) android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权 ...

最新文章

  1. Jmeter --- 分布式测试
  2. java自学手记——继承
  3. python字典添加主键_python 字典相关操作
  4. 集群系统 刀片服务器,刀片服务器集群原理
  5. ejb 2.0 3.0_Java EE 6测试第I部分– EJB 3.1可嵌入API
  6. mysql创建索引以及进程过程中出现的问题
  7. archlinux php imagemagick,如何用ImageMagick将SVG转换为PNG?
  8. 证明一下拉普拉斯的《概率分析论》观点
  9. 码上致富(APP+H5+小程序)淘宝客APP源码导购APP源码代理淘客APP源码
  10. 基于Java保险员工管理系统的设计与实现
  11. 【Paper】2015_Coordinated cruise control for high-speed train movements based on a multi-agent model
  12. 二十一个微信公众号推广技巧
  13. 如何使用数据分析客户购买意愿
  14. error C4716 必须返回一个值 处理
  15. 适合各种创业者借鉴的案例,老板创业2个小时卖了9万元!
  16. Python 3.8 官网文档(中文版附下载)
  17. SQL1 从 Customers 表中检索所有的 ID
  18. html背景音乐加载太慢,HTML插入背景音乐方法【全】
  19. 模拟电路笔记(三)放大器
  20. mysql 提升tps_MYSQL的TPS优化

热门文章

  1. 海外众筹 | Kickstarter热门众筹项目汇总
  2. android之 MAT、DDMS 等内存查看工具
  3. 为什么微信的文件助手不是点对点传输?
  4. oppo云服务器网站,开启OPPO云服务 个人数据轻松管理
  5. window下eslipse搭建django遇到的问题以及解决方法积累(持续更新)
  6. 香港银行牌照申请日记-1
  7. 在cpolar客户端部署网页安全协议 (群晖7.X版)
  8. iWO(联通3G详单及套餐使用情况查询工具)更新至v0.5
  9. 关于使用map,for等遍历数组获取其中每一项的值在调用接口只取到最后一个值的问题
  10. TurnKey linux安装(附iso安装文件)