色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用鴻蒙系統上權限請求框架桃夭

OpenHarmony技術社區 ? 來源:簡書 ? 作者:裴云飛 ? 2021-11-10 09:34 ? 次閱讀

桃夭是鴻蒙系統上的一款權限請求框架,對請求權限的代碼進行高度封裝,極大的簡化了申請權限的代碼邏輯,同時支持在 Ability、FractionAbility、AbilitySlice、Fractiion 里面申請權限。

建議大家把源碼下載下來看看:
https://gitee.com/zhongte/TaoYao

申請權限

申請權限的一般步驟如下

  • 判斷是否有權限,如果有權限,直接進行下一步。

  • 如果沒有權限,可以彈窗告知用戶申請權限的原因。

  • 彈窗告知用戶后,如果用戶同意申請權限,則判斷用戶是否點擊了不再提醒。

  • 如果用戶沒有點擊不再提醒,則開始申請權限。

  • 如果用戶點擊了不再提醒,則彈窗告知用戶去設置頁面開啟權限,用戶點擊彈窗后,跳轉到設置頁面。

  • 重寫 onRequestPermissionsFromUserResult 方法,判斷用戶是否授予權限。

每次申請權限的時候,都需要經過以上幾個步驟,當申請的權限越來越多,大量的重復代碼就出現了。

為了減少重復代碼,我封裝了一個權限請求框架,權限請求框架取名為桃夭。

桃夭的使用方式

如下代碼,先添加依賴,然后你只需要告知權限請求框架你需要什么權限,權限請求框架就會告知你權限申請成功還是失敗。

你不需要手動判斷是否有權限,不需要彈窗告知用戶申請權限的原因,不需要判斷用戶是否點擊了不再提醒,不需要跳轉設置頁面讓用戶開啟權限,不需要重寫 onRequestPermissionsFromUserResult 方法。

框架把這些代碼邏輯都給做了,你只需要關注權限申請成功還是失敗。申請權限變得如此之簡單。

添加依賴:

api'io.gitee.zhongte1.0.1'

申請權限:

//申請多設備協同權限
EasyPermission.requestPermission(this,EasyPermission.DISTRIBUTED_DATASYNC,newPermissionAction(){
@Override
publicvoidonGranted(Listpermissions){
//權限申請成功

}

@Override
publicvoidonDenied(Listpermissions){
//權限申請失敗
}
},SystemPermission.DISTRIBUTED_DATASYNC);

申請權限的時候可能會涉及到兩個彈窗,一個彈窗是用來告知用戶申請權限的原因,另一個彈窗是用來告知用戶去設置頁面開啟權限。

這兩個彈窗在不同的應用里面可能長得不一樣,所以這兩個彈窗并沒有被封裝到桃夭框架里面,而是需要使用者根據你的彈窗樣式對桃夭進行二次封裝。

我在源碼里面對桃夭框架進行了二次封裝,大家可以把源碼下載下來,參考下我是如何對桃夭框架進行二次封裝的。二次封裝完成后,就可以愉快的使用上面的代碼申請權限了。

實現原理

檢測申請的權限是否在配置文件中聲明

申請的權限必須在配置文件中聲明,否則桃夭會直接拋異常。如何檢測申請的權限是否在配置文件中聲明。

如下代碼,獲取 bundleManager 對象,通過 bundleManager 對象獲取應用信息,之后就可以獲取應用在配置文件中聲明的權限了。

/**
*獲取在配置文件中聲明的權限
*
*@paramcontext上下文
*@return在配置文件中聲明的權限
*/
privateListgetConfigPermissions(Contextcontext){
//獲取bundleManager對象
IBundleManagerbundleManager=context.getBundleManager();
StringbundleName=context.getBundleName();
try{
//獲取應用信息
BundleInfobundleInfo=bundleManager.getBundleInfo(bundleName,IBundleManager.GET_BUNDLE_WITH_REQUESTED_PERMISSION);
//獲取應用在配置文件中聲明的權限
ListreqPermissionDetails=bundleInfo.reqPermissions;
if(reqPermissionDetails==null||reqPermissionDetails.isEmpty()){
thrownewIllegalStateException("請在配置文件中聲明要申請的權限");
}
returnreqPermissionDetails;
}catch(RemoteExceptione){
e.printStackTrace();
}
returnnewArrayList<>();
}

獲取到在配置文件中聲明的權限后,就可以判斷申請的權限是否在配置文件中了。

/**
*檢查申請的權限是否在配置文件中聲明
*
*@parampermissions要申請的權限
*/
privatevoidcheckPermissions(String...permissions){
if(permissions==null||permissions.length==0){
thrownewIllegalArgumentException("請至少申請一個權限");
}
//獲取在配置文件中聲明的權限
mReqPermissions=getConfigPermissions(mOrigin.getContext());
if(mReqPermissions.isEmpty()){
thrownewIllegalStateException("請在配置文件中聲明要申請的權限");
}
for(Stringtarget:permissions){
if(!mReqPermissions.contains(target)){
//沒有在配置中聲明要申請的權限,直接拋異常
thrownewIllegalStateException(String.format("%1$s權限沒有配置文件中聲明",target));
}
}
}

②判斷是否有權限

檢測完權限是否在配置中聲明后,就可以判斷是否有權限了。這里就是通過上下文對象的 verifySelfPermission 方法來判斷是否有權限,如果沒有權限,可以彈窗告知用戶申請的原因。

/**
*是否有權限
*
*@paramcontext
*@parampermissions
*@return
*/
@Override
publicbooleanhasPermission(Contextcontext,Listpermissions){
for(Stringpermission:permissions){
intresult=context.verifySelfPermission(permission);
if(result==IBundleManager.PERMISSION_DENIED){
//沒有權限
returnfalse;
}
}
returntrue;
}

③判斷用戶是否點擊了不再提醒

通過上下文對象的 canRequestPermission 方法來判斷用戶是否點擊了不再提醒。

/**
*用戶是否點擊了不在提醒
*
*@parampermission權限
*@return
*/
@Override
publicbooleancanRequestPermission(Stringpermission){
returnmContext.canRequestPermission(permission);
}

④跳轉到設置頁面

如果用戶點擊了不再提醒,則可以跳轉到設置頁面讓用戶開啟權限。

/**
*跳轉到設置頁面
*/
@Override
publicvoidgotoSetting(){
try{
Intentintent=newIntent();
intent.setAction(IntentConstants.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setUri(Uri.parse("package:"+mOrigin.getContext().getBundleName()));
mOrigin.startAbility(intent);
}catch(Exceptione){
e.printStackTrace();
}
}

⑤啟動透明的 Ability 申請權限

如果沒有權限,用戶頁面沒有點擊不再提醒,那就可以申請權限了。為了不讓調用者重寫 onRequestPermissionsFromUserResult 方法,桃夭內部啟動了一個 Ability。

如下代碼:

/**
*開啟一個透明的Ability來申請權限,這樣外界就不需要重寫onRequestPermissionsFromUserResult方法
*/
publicclassPermissionAbilityextendsAbility{

privatestaticfinalintREQUEST_CODE=0X10;
publicstaticfinalStringKEY_PERMISSION="key_permission";
publicstaticfinalStringKEY_TYPE="key_type";
publicstaticfinalStringSENSITIVE_PERMISSION="sensitive_permission";

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
getWindow().setTransparent(true);
super.setUIContent(ResourceTable.Layout_ability_permission);
Listpermissions=intent.getSerializableParam(KEY_PERMISSION);
StringpermissionType=intent.getStringParam(KEY_TYPE);
//請求權限
requestPermissionsFromUser(permissions.toArray(newString[0]),REQUEST_CODE);
}

@Override
publicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){
super.onRequestPermissionsFromUserResult(requestCode,permissions,grantResults);
//權限的回調方法
Postman.send(permissions,grantResults);
terminateAbility();
}

@Override
protectedvoidonAbilityResult(intrequestCode,intresultCode,IntentresultData){
super.onAbilityResult(requestCode,resultCode,resultData);
}
}

直接啟動一個 Ability 會發生頁面跳轉,為了不讓頁面發生跳轉,這里啟動了一個透明的 Ability。

如何將 Ability 設置透明,如下代碼。在 abilities 節點添加 metaData,這里最關鍵的是 Translucent,也就是透明。

"abilities":[
{
"orientation":"unspecified",
"name":"com.poetry.taoyao.ability.PermissionAbility",
"icon":"$media:icon",
"description":"$string:permissionability_description",
"label":"$string:taoyao_PermissionAbility",
"type":"page",
"launchType":"standard",
"metaData":{
"customizeData":[
{
"name":"hwc-theme",
"value":"androidhwext:style/Theme.Emui.Translucent.NoTitleBar"
}
]
}
}

僅僅有上面的步驟好不夠,需要在 Ability 或者 AbilitySlice 里面將窗口設置成透明。

如下代碼:

getWindow().setTransparent(true);

經過上面兩步,也就是將 Ability 的主題和窗口都設置成透明,這樣就能將 Ability 變成透明的了,同時也不會發生頁面跳轉。

⑥判斷用戶是否授予權限

判斷用戶是否授予權限,可以使用標準的方式來判斷。也就是通過 grantResult 來判斷用戶是否授予權限。

@Override
publicbooleanhasPermission(int[]grantResults,String...permissions){
if(grantResults==null||grantResults.length<=?0){
returnfalse;
}
for(intgrantResult:grantResults){
if(grantResult==IBundleManager.PERMISSION_DENIED){
returnfalse;
}
}
returntrue;
}

其實還有另外的方式來判斷用戶是否授予權限。也就是不管用戶是否授權,直接訪問相關業務。

比如,申請錄音權限,當系統回調 onRequestPermissionsFromUserResult 方法時,直接去錄音,如果發生異常,捕獲異常說明沒有權限。

如下代碼:

/**
*通過直接錄音的方式來判斷是否有錄音權限
*
*@paramcontext
*@return
*@throwsThrowable
*/
@Override
publicbooleantest(Contextcontext)throwsThrowable{
AudioStreamInfoaudioStreamInfo=newAudioStreamInfo.Builder().encodingFormat(
AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT)
.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_STEREO)
.sampleRate(AUDIO_SAMPLE_RATE)
.build();
AudioCapturerInfoaudioCapturerInfo=newAudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo).build();
try{
AudioCapturercapturer=newAudioCapturer(audioCapturerInfo);
//錄音
capturer.start();
newTimer().schedule(newTimerTask(){
@Override
publicvoidrun(){
capturer.stop();
}
},AUDIO_RECORDING_TIME);
//沒有發生異常,有權限
returntrue;
}catch(Exceptione){
//發生異常,無權限
returnfalse;
}
}

桃夭在判斷用戶是否授權時,上面的兩種方式都使用了。至此,桃夭框架的原理基本上講完。有興趣的同學可以去看看源碼。

要看懂源碼,需要熟悉申請權限的一般步驟,桃夭其實就對這些步驟進行封裝。另外還需熟悉面向接口編程、熟悉策略模式等常見設計模式。
責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    6889

    瀏覽量

    123602
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2638

    瀏覽量

    66600
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30423

原文標題:一款好用的鴻蒙權限請求框架!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙系統生態設備突破10億臺 超過15000個鴻蒙原生應用和元服務

    從操作系統內核、文件系統,到編程語言、人工智能框架和大模型等全部實現自研;放棄了傳統的Linux內核以及安卓開源代碼項目AOSP,僅支持鴻蒙內核和
    的頭像 發表于 10-23 16:43 ?970次閱讀

    瑞芯微RK3568鴻蒙開發板OpenHarmony系統修改cfg文件權限方法

    本文適用于OpenHarmony開源鴻蒙系統修改cfg文件權限方法,深圳觸覺智能研發的RK3566、RK3568、RK3588等開發板、主板等產品均適用此教程
    的頭像 發表于 09-11 13:26 ?1049次閱讀
    瑞芯微RK3568<b class='flag-5'>鴻蒙</b>開發板OpenHarmony<b class='flag-5'>系統</b>修改cfg文件<b class='flag-5'>權限</b>方法

    鴻蒙開發Ability Kit程序框架服務:應用權限管控概述 程序訪問控制

    系統提供了一種允許應用訪問系統資源(如:通訊錄等)和系統能力(如:訪問攝像頭、麥克風等)的通用權限訪問方式,來保護系統數據(包括用戶個人數據
    的頭像 發表于 07-01 10:21 ?507次閱讀
    <b class='flag-5'>鴻蒙</b>開發Ability Kit程序<b class='flag-5'>框架</b>服務:應用<b class='flag-5'>權限</b>管控概述 程序訪問控制

    鴻蒙開發Ability Kit程序框架服務:選擇申請權限的方式

    應用在訪問數據或者執行操作時,需要評估該行為是否需要應用具備相關的權限。如果確認需要目標權限,則需要在應用安裝包中申請目標權限
    的頭像 發表于 07-01 09:50 ?411次閱讀
    <b class='flag-5'>鴻蒙</b>開發Ability Kit程序<b class='flag-5'>框架</b>服務:選擇申請<b class='flag-5'>權限</b>的方式

    鴻蒙開發Ability Kit程序框架服務:聲明權限

    應用在申請權限時,需要在項目的配置文件中,逐個聲明需要的權限,否則應用將無法獲取授權。
    的頭像 發表于 07-01 09:22 ?377次閱讀
    <b class='flag-5'>鴻蒙</b>開發Ability Kit程序<b class='flag-5'>框架</b>服務:聲明<b class='flag-5'>權限</b>

    鴻蒙開發Ability Kit程序框架服務:向用戶申請授權

    當應用需要訪問用戶的隱私信息或使用系統能力時,例如獲取位置信息、訪問日歷、使用相機拍攝照片或錄制視頻等,應該向用戶請求授權,這部分權限是user_grant權限
    的頭像 發表于 07-01 09:18 ?631次閱讀
    <b class='flag-5'>鴻蒙</b>開發Ability Kit程序<b class='flag-5'>框架</b>服務:向用戶申請授權

    鴻蒙開發組件:DataAbility權限控制

    DataAbility提供數據服務,并不是所有的Ability都有權限讀寫它,DataAbility有一套權限控制機制來保證數據安全。分為靜態權限控制和動態權限控制兩部分。
    的頭像 發表于 06-21 10:30 ?375次閱讀
    <b class='flag-5'>鴻蒙</b>開發組件:DataAbility<b class='flag-5'>權限</b>控制

    鴻蒙跨平臺框架:【ArkUi-X】創建工程

    鴻蒙推出了鴻ArkUi-X 框架所以就寫個文章分享一下
    的頭像 發表于 05-13 17:48 ?1032次閱讀
    <b class='flag-5'>鴻蒙</b>跨平臺<b class='flag-5'>框架</b>:【ArkUi-X】創建工程

    鴻蒙開發接口Ability框架:【 (Context模塊)】

    Context模塊提供了ability或application的上下文的能力,包括允許訪問特定于應用程序的資源、請求和驗證權限等。
    的頭像 發表于 05-13 16:04 ?751次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口Ability<b class='flag-5'>框架</b>:【 (Context模塊)】

    鴻蒙原生應用元服務開發-Web管理位置權限

    ohos.permission.LOCATION權限。 在下面的示例中,用戶點擊前端頁面\"獲取位置\"按鈕,Web組件通過彈窗的形式通知應用側位置權限請求消息,示例代碼如下
    發表于 04-28 16:57

    鴻蒙原生應用元服務-訪問控制(權限)開發等級和類型

    的接口,系統彈框由用戶授權,用戶結合應用運行場景的上下文,識別出應用申請相應敏感權限的合理性,從而做出正確的選擇。 即使用戶向應用授予過請求權限,應用在調用受此
    發表于 04-17 15:29

    鴻蒙OS開發實例:【HarmonyHttpClient】網絡框架

    鴻蒙上使用的Http網絡框架,里面包含純Java實現的HttpNet,類似okhttp使用,支持同步和異步兩種請求方式;還有鴻蒙版retrofit,和Android版Retrofit相
    的頭像 發表于 04-12 16:58 ?879次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發實例:【HarmonyHttpClient】網絡<b class='flag-5'>框架</b>

    鴻蒙OS開發實例:【窺探網絡請求

    HarmonyOS 平臺中使用網絡請求,需要引入 "@ohos.net.http", 并且需要在 module.json5 文件中申請網絡權限, 即 “ohos.permission.INTERNET” 本篇文章將嘗試使用 @ohos.net.http 來實現網絡
    的頭像 發表于 04-01 16:11 ?823次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發實例:【窺探網絡<b class='flag-5'>請求</b>】

    純血鴻蒙系統,拿什么與安卓、iOS比?

    、數碼、車載等等一系列生態閉環。 而華為鴻蒙是全棧自研底座,從AI大模型、AI框架、安全隱私、集成開發環境、設計系統、編程框體、編譯器、編程語言和文件系統,到操作
    發表于 02-21 21:04

    如何在鴻蒙系統安裝Google Play

    隨著鴻蒙(HarmonyOS)系統的逐漸普及和用戶基數的增加,一些用戶希望能在鴻蒙系統使用Google Play商店以獲取更多應用。然而,
    的頭像 發表于 01-31 17:13 ?1.7w次閱讀
    主站蜘蛛池模板: 精品国产福利在线视频 | 久久久久久久尹人综合网亚洲 | 手机伊在人线香蕉2 | 狠狠色丁香婷婷久久综合五月 | 青青草原国产在线观看 | 海角国精产品一区一区三区糖心 | 青青青青青青草 | 亚洲日韩欧美国产中文在线 | 好大好硬好爽好深好硬视频 | 99re8热视频这在线视频 | 日韩欧美精品有码在线播放免费 | 国产久爱青草视频在线观看 | 亚洲色婷婷久久精品AV蜜桃久久 | 久久中文字幕无码A片不卡 久久中文字幕人妻熟AV女蜜柚M | www.黄色| 久久AV国产麻豆HD真实乱 | 国产 日韩 欧美 综合 激情 | 欧美国产日韩久久久 | 国产精品永久免费视频 | 丝瓜影院观看免费高清国际观察 | 欧美三级不卡在线观线看 | 嘟嘟嘟WWW在线观看视频高清 | 国产欧美一本道无码 | 国产精品久久久久激情影院 | 久久久久国产精品嫩草影院 | 国产人妻XXXX精品HD电影 | 丝瓜视频在线免费 | 国内精品乱码卡一卡2卡三卡 | 日本午夜精品久久久无码 | 啊…嗯啊好深男男高h文总受 | 超碰在线视频公开 | 男子扒开美女尿口做羞羞的事 | 国产精品久久久久a影院 | 久久久久九九 | 久久免费看少妇高潮A片特爽 | 国产精品99久久久久久人韩国 | 伊久久 | 视频一区国产第一页 | 美女pk精子2小游戏 美女MM131爽爽爽 | 韩国伦理片2018在线播放免费观看 | 天天狠狠色噜噜 |