一篇搞定AndroidM运行时权限_第1页
一篇搞定AndroidM运行时权限_第2页
一篇搞定AndroidM运行时权限_第3页
一篇搞定AndroidM运行时权限_第4页
一篇搞定AndroidM运行时权限_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、篇搞定AndroidM运行时权限从Android6.0(API23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。这种权限机制可以让用户更好的管理应用的权限,保障用户隐私。系统权限分为两类:正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。危险权限会授予应用访问用户机密数据的权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。需要注意的是:在Android5.1(API22)或更低版本,并且应用的targetSdkVersion是22或更低版本,则系统会在安装时要求用户授予权限。(沿用之前的权限系统)即使在安装时

2、已经授予应用所有权限,在Android6.0之后依然可以通过Setting来关闭已经授予的权限。在请求权限时,系统只告诉用户应用需要的权限组,而不告知具体权限。如果在未检查授权的情况下,直接使用危险权限,会导致程序Crash。使用v4包中的ContextCompat处理权限(v13包中的FragmentCompat),不需要考虑版本问题。相关APIintcheckSelfPermission()检查应用是否有指定权限。返回值为PackageManager.PERMISSION_GRANTED表示有权限,PackageManager.PERMISSION_DENIED表示无权限。voidrequ

3、estPermissions()请求指定权限,可以是多个,以数组的方式。booleanshouldShowRequestPermissionRationale()如果应用之前请求过此权限但用户拒绝了请求,此方法将返回true。*voidonRequestPermissionsResult()请求权限的结果回调。使用原生API因为以上列举的相关API都是在API23才有的,为了适配低版本,官方提供了v4v13兼容包。我们可以直接使用兼容包中的方法进行权限处理。步骤(以拨打电话为例)还是和以前一样,先在清单文件中申请所需要的权限。在使用到拨打电话的地方,进行权限检查if(ActivityCompa

4、t.checkSelfPermission(this,Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED)/应用没有授予拨打电话权限,请求权限requestCameraPermission();else/应用被授予拨打电话权限PackageManager.PERMISSION_GRANTEDmakeCall();说说薮敢狀说说薮敢狀说说薮敢狀说说薮敢狀说说薮说说薮?说说薮敢稳说说薮眾1ft说说薮?说说薮?ft说说苓MA.,.-r.Vr.Vr.”耳r.”宀.MA.V-,.Uf,.U”中,.*4如果有权限,直接拨打电

5、话,至此结束。如果没有权限,则请求权限ActivityCompat.requestPermissions(this,newStringManifest.permission.CALL_PHONE,REQUEST_CALLPHONE);在请求权限过程中可以使用shouldShowRequestPermissionRationale()检查是否被拒绝过,如果被拒绝过,可以给用户一个详细解释。if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)/向用户详细解释申请该权限的

6、原因newAlertDialog.Builder(this).setCancelable(false)setMessage(拨打电话需要使用电话权限如果不授予权限会导致该功能无法正常使用).setPositiveButton(好的newDialogInterface.OnClickListener()OverridepublicvoidonClick(Dialoglnterfacedialog,intwhich)ActivityCompat.requestPermissions(OriginalActivity.this,newStringManifest.permission.CALL_PH

7、ONE,REQUEST_CALLPHONE);).setNegativeButton(”不给,newDialogInterface.OnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)dialog.dismiss();).show();处理授权结果回调OverridepublicvoidonRequestPermissionsResult(intrequestCode,NonNullStringpermissions,NonNullintgrantResults)if(requestCode=REQ

8、UEST_CALLPHONE)if(grantResults.length=1&grantResults0=PackageManager.PERMISSION_GRANTED)/授予权限,拨打电话makeCall();elseToast.makeText(this,请求权限被拒绝,Toast.LENGTH_SHORT).show();elsesuper.onRequestPermissionsResult(requestCode,permissions,grantResults);使用轮子API简介该库使用apt技术,自然使用的就是注解。注解RuntimePermissions是否必须作用标记

9、Activity/Fragment,则注解解释器会生成对应类的代码NeedsPermissi标记需要授权才能执行的方法on注解OnShowRationale是否必须作用对应shouldShowRequestPermissionRationale(),当应用之前请求过此权限但用户拒绝了请求,再次请求时调用OnPermissionDenied当请求权限遭拒绝时调用OnNeverAskAgain当用户勾选不再提示,并拒绝权限时,再次请求时调用步骤(以使用相机为例)还是在清单文件中声明使用的权限配置依赖PermissionsDispatcher,这里不再赘述代码示例RuntimePermissions

10、publicclassPermissionsDispatcherActivityextendsAppCompatActivityprivateImageViewimageView;OverrideprotectedvoidonCreate(BundlesavedlnstanceState)super.onCreate(savedlnstanceState);setContentView(R.layout.activity_main);imageView=(ImageView)findViewByld(R.id.imageView);findViewByld(R.id.btn_camera).s

11、etOnClickListener(newView.OnClickListener()OverridepublicvoidonClick(Viewv)PermissionsDispatcherActivityPermissionsDispatcher.takePhotoWithCheck(PermissionsDispatcherActivity.this););NeedsPermission(Manifest.permission.CAMERA)voidtakePhoto()Intentintent=newlntent(MediaStore.ACTION_IMAGE_CAPTURE);启动系

12、统相机startActivityForResult(intent,100);OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)super.onActivityResult(requestCode,resultCode,data);if(resultCode=RESULT_OK)/如果返回数据if(requestCode=100)判断请求码是否为REQUEST_CAMERA,如果是代表是这个页面传过去的,需要进行获取Bundlebundle=data.getExtras();/从data中取

13、出传递回来缩略图的信息,图片质量差,适合传递小图片Bitmapbitmap=(Bitmap)bundle.get(data);将data中的信息流解析为Bitmap类型imageView.setlmageBitmap(bitmap);/显示图片OnShowRationale(Manifest.permission.CAMERA)voidshowRationaleForRecord(finalPermissionRequestrequest)newAlertDialog.Builder(this).setPositiveButton(”好的,newDialogInterface.OnClickL

14、istener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)ceed();ceed();).setNegativeButton(不给,newDialoglnterface.OnClickListener()OverridepublicvoidonClick(Dialoglnterfacedialog,intwhich)request.cancel();).setCancelable(false).setMessage(拍照需要相机权限,应用将要申请使用相机权限).show();OnPermissionDenied(Mani

15、fest.permission.CAMERA)voidshowCameraDenied()Toast.makeText(getApplicationContext(),权限被拒绝,Toast.LENGTH_LONG).show();OnNeverAskAgain(Manifest.permission.CAMERA)voidonRCameraNeverAskAgain()newAlertDialog.Builder(this).setPositiveButton(”好的newDialogInterface.OnClickListener()OverridepublicvoidonClick(D

16、ialoglnterfacedialog,intwhich)/打开系统应用设置Intentintent=newlntent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);intent.setData(Uri.parse(package:+getPackageName();intent.addCategory(lntent.CATEGORY_DEFAULT);intent.setFlags(lntent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);dialog.cancel();).setNegativ

17、eButton(取消newDialogInterface.OnClickListener()OverridepublicvoidonClick(DialogInterfacedialog,intwhich)dialog.cancel();).setCancelable(false).setMessage(您已经禁止了相机权限,是否现在去开启).show();OverridepublicvoidonRequestPermissionsResult(intrequestCode,NonNullStringpermissions,NonNullintgrantResults)super.onRequestPermissionsResult(requestCode,permissions,grantResults);PermissionsDispatcherActivityPermissionsDispatcher.onRequestPermissionsResult(this,requestCode,grantResults);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论