版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、篇搞定AndroidM運(yùn)行時(shí)權(quán)限從Android6.0(API23)開(kāi)始,用戶開(kāi)始在應(yīng)用運(yùn)行時(shí)向其授予權(quán)限,而不是在應(yīng)用安裝時(shí)授予。這種權(quán)限機(jī)制可以讓用戶更好的管理應(yīng)用的權(quán)限,保障用戶隱私。系統(tǒng)權(quán)限分為兩類:正常權(quán)限不會(huì)直接給用戶隱私權(quán)帶來(lái)風(fēng)險(xiǎn)。如果您的應(yīng)用在其清單中列出了正常權(quán)限,系統(tǒng)將自動(dòng)授予該權(quán)限。危險(xiǎn)權(quán)限會(huì)授予應(yīng)用訪問(wèn)用戶機(jī)密數(shù)據(jù)的權(quán)限。如果您列出了危險(xiǎn)權(quán)限,則用戶必須明確批準(zhǔn)您的應(yīng)用使用這些權(quán)限。需要注意的是:在Android5.1(API22)或更低版本,并且應(yīng)用的targetSdkVersion是22或更低版本,則系統(tǒng)會(huì)在安裝時(shí)要求用戶授予權(quán)限。(沿用之前的權(quán)限系統(tǒng))即使在安裝時(shí)
2、已經(jīng)授予應(yīng)用所有權(quán)限,在Android6.0之后依然可以通過(guò)Setting來(lái)關(guān)閉已經(jīng)授予的權(quán)限。在請(qǐng)求權(quán)限時(shí),系統(tǒng)只告訴用戶應(yīng)用需要的權(quán)限組,而不告知具體權(quán)限。如果在未檢查授權(quán)的情況下,直接使用危險(xiǎn)權(quán)限,會(huì)導(dǎo)致程序Crash。使用v4包中的ContextCompat處理權(quán)限(v13包中的FragmentCompat),不需要考慮版本問(wèn)題。相關(guān)APIintcheckSelfPermission()檢查應(yīng)用是否有指定權(quán)限。返回值為PackageManager.PERMISSION_GRANTED表示有權(quán)限,PackageManager.PERMISSION_DENIED表示無(wú)權(quán)限。voidrequ
3、estPermissions()請(qǐng)求指定權(quán)限,可以是多個(gè),以數(shù)組的方式。booleanshouldShowRequestPermissionRationale()如果應(yīng)用之前請(qǐng)求過(guò)此權(quán)限但用戶拒絕了請(qǐng)求,此方法將返回true。*voidonRequestPermissionsResult()請(qǐng)求權(quán)限的結(jié)果回調(diào)。使用原生API因?yàn)橐陨狭信e的相關(guān)API都是在API23才有的,為了適配低版本,官方提供了v4v13兼容包。我們可以直接使用兼容包中的方法進(jìn)行權(quán)限處理。步驟(以撥打電話為例)還是和以前一樣,先在清單文件中申請(qǐng)所需要的權(quán)限。在使用到撥打電話的地方,進(jìn)行權(quán)限檢查if(ActivityCompa
4、t.checkSelfPermission(this,Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED)/應(yīng)用沒(méi)有授予撥打電話權(quán)限,請(qǐng)求權(quán)限r(nóng)equestCameraPermission();else/應(yīng)用被授予撥打電話權(quán)限PackageManager.PERMISSION_GRANTEDmakeCall();說(shuō)說(shuō)藪敢狀說(shuō)說(shuō)藪敢狀說(shuō)說(shuō)藪敢狀說(shuō)說(shuō)藪敢狀說(shuō)說(shuō)藪說(shuō)說(shuō)藪?說(shuō)說(shuō)藪敢穩(wěn)說(shuō)說(shuō)藪眾1ft說(shuō)說(shuō)藪?說(shuō)說(shuō)藪?ft說(shuō)說(shuō)苓M(jìn)A.,.-r.Vr.Vr.”耳r.”宀.MA.V-,.Uf,.U”中,.*4如果有權(quán)限,直接撥打電
5、話,至此結(jié)束。如果沒(méi)有權(quán)限,則請(qǐng)求權(quán)限ActivityCompat.requestPermissions(this,newStringManifest.permission.CALL_PHONE,REQUEST_CALLPHONE);在請(qǐng)求權(quán)限過(guò)程中可以使用shouldShowRequestPermissionRationale()檢查是否被拒絕過(guò),如果被拒絕過(guò),可以給用戶一個(gè)詳細(xì)解釋。if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)/向用戶詳細(xì)解釋申請(qǐng)?jiān)摍?quán)限的
6、原因newAlertDialog.Builder(this).setCancelable(false)setMessage(撥打電話需要使用電話權(quán)限如果不授予權(quán)限會(huì)導(dǎo)致該功能無(wú)法正常使用).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();處理授權(quán)結(jié)果回調(diào)OverridepublicvoidonRequestPermissionsResult(intrequestCode,NonNullStringpermissions,NonNullintgrantResults)if(requestCode=REQ
8、UEST_CALLPHONE)if(grantResults.length=1&grantResults0=PackageManager.PERMISSION_GRANTED)/授予權(quán)限,撥打電話makeCall();elseToast.makeText(this,請(qǐng)求權(quán)限被拒絕,Toast.LENGTH_SHORT).show();elsesuper.onRequestPermissionsResult(requestCode,permissions,grantResults);使用輪子API簡(jiǎn)介該庫(kù)使用apt技術(shù),自然使用的就是注解。注解RuntimePermissions是否必須作用標(biāo)記
9、Activity/Fragment,則注解解釋器會(huì)生成對(duì)應(yīng)類的代碼NeedsPermissi標(biāo)記需要授權(quán)才能執(zhí)行的方法on注解OnShowRationale是否必須作用對(duì)應(yīng)shouldShowRequestPermissionRationale(),當(dāng)應(yīng)用之前請(qǐng)求過(guò)此權(quán)限但用戶拒絕了請(qǐng)求,再次請(qǐng)求時(shí)調(diào)用OnPermissionDenied當(dāng)請(qǐng)求權(quán)限遭拒絕時(shí)調(diào)用OnNeverAskAgain當(dāng)用戶勾選不再提示,并拒絕權(quán)限時(shí),再次請(qǐng)求時(shí)調(diào)用步驟(以使用相機(jī)為例)還是在清單文件中聲明使用的權(quán)限配置依賴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);啟動(dòng)系
12、統(tǒng)相機(jī)startActivityForResult(intent,100);OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)super.onActivityResult(requestCode,resultCode,data);if(resultCode=RESULT_OK)/如果返回?cái)?shù)據(jù)if(requestCode=100)判斷請(qǐng)求碼是否為REQUEST_CAMERA,如果是代表是這個(gè)頁(yè)面?zhèn)鬟^(guò)去的,需要進(jìn)行獲取Bundlebundle=data.getExtras();/從data中取
13、出傳遞回來(lái)縮略圖的信息,圖片質(zhì)量差,適合傳遞小圖片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(拍照需要相機(jī)權(quán)限,應(yīng)用將要申請(qǐng)使用相機(jī)權(quán)限).show();OnPermissionDenied(Mani
15、fest.permission.CAMERA)voidshowCameraDenied()Toast.makeText(getApplicationContext(),權(quán)限被拒絕,Toast.LENGTH_LONG).show();OnNeverAskAgain(Manifest.permission.CAMERA)voidonRCameraNeverAskAgain()newAlertDialog.Builder(this).setPositiveButton(”好的newDialogInterface.OnClickListener()OverridepublicvoidonClick(D
16、ialoglnterfacedialog,intwhich)/打開(kāi)系統(tǒng)應(yīng)用設(shè)置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(您已經(jīng)禁止了相機(jī)權(quán)限,是否現(xiàn)在去開(kāi)啟).show();OverridepublicvoidonRequestPermissionsResult(intrequestCode,NonNullStringpermissions,NonNullintgrantResults)super.onRequestPermissionsResult(requestCode,permissions,grantResults);PermissionsDispatcherActivityPermissionsDispatcher.onRequestPermissionsResult(this,requestCode,grantResults);
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 皮膚淋巴瘤CAR-T治療的聯(lián)合溶瘤病毒策略
- 白癜風(fēng)聯(lián)合治療的個(gè)體化方案制定
- 登革熱疫苗與突發(fā)輿情應(yīng)對(duì)策略
- 癲癇持續(xù)狀態(tài)多藥聯(lián)合用藥原則
- 癲癇外科治療的神經(jīng)調(diào)控輔助方案-1
- 癌癥早篩風(fēng)險(xiǎn)預(yù)警:多模態(tài)AI預(yù)測(cè)模型
- 癡呆篩查中的共病管理策略
- 病理診斷與患者溝通改進(jìn)
- 病原體變異逃逸免疫記憶與疫苗更新策略
- 電子病歷隱私泄露風(fēng)險(xiǎn)與區(qū)塊鏈防護(hù)策略
- 植入式靜脈給藥裝置(輸液港)-中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)2023
- GB/T 2988-2023高鋁磚
- 東風(fēng)7電路圖解析
- 數(shù)字填圖系統(tǒng)新版(RgMap2.0)操作手冊(cè)
- YY/T 1778.1-2021醫(yī)療應(yīng)用中呼吸氣體通路生物相容性評(píng)價(jià)第1部分:風(fēng)險(xiǎn)管理過(guò)程中的評(píng)價(jià)與試驗(yàn)
- FZ/T 73009-2021山羊絨針織品
- JJF 1069-2012 法定計(jì)量檢定機(jī)構(gòu)考核規(guī)范(培訓(xùn)講稿)
- 2011-2015廣汽豐田凱美瑞維修手冊(cè)wdl
- DFMEA編制作業(yè)指導(dǎo)書(shū)新版
- DB35∕T 1844-2019 高速公路邊坡工程監(jiān)測(cè)技術(shù)規(guī)程
- 城市管理綜合執(zhí)法局城管執(zhí)法與執(zhí)法程序PPT模板
評(píng)論
0/150
提交評(píng)論