一篇搞定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

提交評論