W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
HarmonyOS 支持開發(fā)者自定義權(quán)限來保護能力或接口,同時開發(fā)者也可申請權(quán)限來訪問受權(quán)限保護的對象。
開發(fā)者需要在 config.json 文件中的“reqPermissions”字段中聲明所需要的權(quán)限。
{
"reqPermissions": [{
"name": "ohos.permission.CAMERA",
"reason": "$string:permreason_camera",
"usedScene": {
"ability": ["com.mycamera.Ability", "com.mycamera.AbilityBackground"],
"when": "always"
}
},{
...
}]
}
權(quán)限申請格式采用數(shù)組格式,可支持同時申請多個權(quán)限,權(quán)限個數(shù)最多不能超過 1024 個。
鍵 | 值說明 | 類型 | 取值范圍 | 默認值 | 規(guī)則約束 |
---|---|---|---|---|---|
name | 必須,填寫需要使用的權(quán)限名稱。 | 字符串 | 自定義 | 無 | 未填寫時,解析失敗。 |
reason | 可選,當申請的權(quán)限為 user_grant 權(quán)限時此字段必填。描述申請權(quán)限的原因。 | 字符串 | 顯示文字長度不能超過 256 個字節(jié)。 | 空 | user_grant 權(quán)限必填,否則不允許在應用市場上架。需做多語種適配。 |
usedScene | 可選,當申請的權(quán)限為 user_grant 權(quán)限時此字段必填。描述權(quán)限使用的場景和時機。場景類型有:ability、when(調(diào)用時機)??膳渲枚鄠€ability。 | ability:字符串數(shù)組 when:字符串 | ability:ability 的名稱 when:inuse(使用時)、always(始終) | ability:空 when:inuse | user_grant權(quán)限必填 ability,可選填when。 |
如果聲明使用的權(quán)限的 grantMode 是 system_grant, 則權(quán)限會在當應用安裝的時候被自動授予。
如果聲明使用的權(quán)限的 grantMode 是 user_grant,則必須經(jīng)用戶手動授權(quán)(用戶在彈框中授權(quán)或進入權(quán)限設(shè)置界面授權(quán))才可使用。用戶會看到 reason 字段中填寫的理由,來幫助用戶決定是否給予授權(quán)。
說明
對于授權(quán)方式為 user_grant 的權(quán)限,每一次執(zhí)行需要這一權(quán)限的操作時,都需要檢查自身是否有該權(quán)限。當自身具有權(quán)限時,才可繼續(xù)執(zhí)行,否則應用需要請求用戶授予權(quán)限。示例參見[動態(tài)申請權(quán)限開發(fā)步驟]。
開發(fā)者需要在 config.json 文件中的“defPermissions”字段中自定義所需的權(quán)限:
{
"defPermissions": [{
"name": "com.myability.permission.MYPERMISSION",
"grantMode": "system_grant",
"availableScope": ["signature"]
}, {
...
}]
}
權(quán)限定義格式采用數(shù)組格式,可支持同時定義多個權(quán)限,自定義的權(quán)限個數(shù)最多不能超過 1024個。權(quán)限定義的字段描述詳見[表2]。
鍵 | 值說明 | 類型 | 取值范圍 | 默認值 | 規(guī)則約束 |
---|---|---|---|---|---|
name | 必填,權(quán)限名稱。為最大可能避免重名,采用反向域公司名+應用名+權(quán)限名組合。 | 字符串 | 自定義 | 無 | 第三方應用不允許填寫系統(tǒng)存在的權(quán)限,否則安裝失敗。未填寫解析失敗。權(quán)限名長度不能超過 256 個字符。 |
grantMode | 必填,權(quán)限授予方式。 | 字符串 | user_grant(用戶授權(quán))system_grant(系統(tǒng)授權(quán))取值含義參見:[表3]。 | system_grant | 未填值或填寫了取值范圍以外的值時,自動賦予默認值;不允許第三方應用填寫 user_grant,填寫后會自動賦予默認值。 |
availableScope | 選填,權(quán)限限制范圍。不填則表示此權(quán)限對所有應用開放。 | 字符串數(shù)組 | signatureprivilegedrestricted 可參見。取值含義請見:[表4]。 | 空 | 填寫取值范圍以外的值時,權(quán)限限制范圍不生效。由于第三方應用并不在 restricted 的范圍內(nèi),很少會出現(xiàn)權(quán)限定義者不能訪問自身定義的權(quán)限的情況,所以不允許三方應用填寫restricted。 |
label | 選填,權(quán)限的簡短描述,若未填寫,則使用到簡短描述的地方由權(quán)限名取代。 | 字符串 | 自定義 | 空 | 需要多語種適配。 |
description | 選填,權(quán)限的詳細描述,若未填寫,則使用到詳細描述的地方由 label 取代。 | 字符串 | 自定義 | 空 | 需要多語種適配。 |
授予方式(grantMode) | 說明 | 自定義權(quán)限是否可指定該級別 | 取值樣例 |
---|---|---|---|
system_grant | 在“config.json”里面聲明,安裝后系統(tǒng)自動授予。 | 是 | GET_NETWORK_INFO 、GET_WIFI_INFO |
user_grant | 在“config.json”里面聲明,并在使用時動態(tài)申請,用戶授權(quán)后才可使用。 | 否,如自定義則強制修改為 system_grant。 | CAMERA、MICROPHONE |
權(quán)限范圍(availableScope) | 說明 | 自定義權(quán)限是否可指定該級別 | 取值樣例 |
---|---|---|---|
restricted | 需要開發(fā)者向華為申請后才能被使用的特殊權(quán)限。 | 否 | ANSWER_CALL、READ_CALL_LOG、RECEIVE_SMS |
signature | 權(quán)限定義方和使用方的簽名一致。需在“config.json”里面聲明后,由權(quán)限管理模塊負責簽名校驗一致后,可使用。 | 是 | 對應用(或 Ability)操作的系統(tǒng)接口上由系統(tǒng)定義權(quán)限以及應用自定義的權(quán)限。如:find某Ability,連接某Ability。 |
privileged | 預置在系統(tǒng)版本中的特權(quán)應用可申請的權(quán)限。 | 是 | SET_TIME、MANAGE_USER_STORAGE |
在 config.json 中填寫“abilities”到“permissions”字段,即只有擁有該權(quán)限的應用可訪問此Ability。下面的例子表明只有擁有“ohos.permission.CAMERA”權(quán)限的應用可以訪問此ability。
"abilities": [{
"name": ".MainAbility",
"description": "$string:description_main_ability",
"icon": "$media:hiworld.png",
"label": "HiCamera",
"launchType": "standard",
"orientation": "portrait",
"visible": false,
"permissions": [
"ohos.permission.CAMERA"
],
}]
鍵 | 值說明 | 類型 | 取值范圍 | 默認值 | 規(guī)則約束 |
---|---|---|---|---|---|
permissions | 選填,權(quán)限名稱。用以表示此 ability 受哪個權(quán)限保護,即只有擁有此權(quán)限的應用可訪問此 ability。 | 字符串 | 自定義 | 無 | 目前僅支持填寫一個權(quán)限名,若填寫多個權(quán)限名,僅第一個權(quán)限名稱有效。 |
在 Ability 實現(xiàn)中,如需要對特定接口對調(diào)用者做訪問控制,可在服務側(cè)的接口實現(xiàn)中,主動通過 verifyCallingPermission、 verifyCallingOrSelfPermission 來檢查訪問者是否擁有所需要的權(quán)限。
if (verifyCallingPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
// 調(diào)用者無權(quán)限,做錯誤處理
}
// 調(diào)用者權(quán)限校驗通過,開始提供服務
接口原型 | 接口詳細描述 |
---|---|
public int verifyPermission(String permissionName, int pid, int uid) | 接口功能:查詢指定 PID、UID 的應用是否已被授予某權(quán)限輸入?yún)?shù):permissionName:權(quán)限名;pid:進程id;uid:uid 輸出參數(shù):無返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
public int verifyCallingPermission(String permissionName) | 接口功能:查詢 IPC 跨進程調(diào)用方的進程是否已被授予某權(quán)限輸入?yún)?shù):permissionName:權(quán)限名輸出參數(shù):無返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
public int verifySelfPermission(String permissionName) | 接口功能:查詢自身進程是否已被授予某權(quán)限輸入?yún)?shù):permissionName:權(quán)限名輸出參數(shù):無返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
public int verifyCallingOrSelfPermission(String permissionName) | 接口功能:當有遠端調(diào)用檢查遠端是否有權(quán)限,否則檢查自身是否擁有權(quán)限輸入?yún)?shù):permissionName:權(quán)限名輸出參數(shù):無返回值: IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
public boolean canRequestPermission(String permissionName) | 接口功能:向系統(tǒng)權(quán)限管理模塊查詢某權(quán)限是否不再彈框授權(quán)了輸入?yún)?shù):permissionName:權(quán)限名輸出參數(shù):無返回值:true 允許彈框,false 不允許彈框 |
void requestPermissionsFromUser (String[] permissions, int requestCode) | 接口功能:向系統(tǒng)權(quán)限管理模塊申請權(quán)限(接口可支持一次申請多個。若下一步操作涉及到多個敏感權(quán)限,可以這么用,其他情況建議不要這么用。因為彈框還是按權(quán)限組一個個去彈框,耗時比較長。用到哪個權(quán)限就去申請哪個)輸入?yún)?shù): permissionNames:權(quán)限名列表;requestCode: 請求應答會帶回此編碼以匹配本次申請的權(quán)限請求輸出參數(shù):無返回值:無 |
void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults) | 接口功能:調(diào)用 requestPermissionsFromUser 后的應答接口輸入?yún)?shù):requestCode:requestPermission 中傳入的requestCode;permissions:申請的權(quán)限名;grantResults:申請權(quán)限的結(jié)果輸出參數(shù):無返回值:無 |
{
" reqPermissions": [{
"name": "ohos.permission.CAMERA",
"reason": "$string:permreason_camera",
"usedScene": {
"ability": ["com.mycamera.Ability", "com.mycamera.AbilityBackground"],
"when": "always"}
}, {
...
}]
}]
}
樣例代碼如下:
if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
// 應用未被授予權(quán)限
if (canRequestPermission("ohos.permission.CAMERA")) {
// 是否可以申請彈框授權(quán)(首次申請或者用戶未選擇禁止且不再提示)
requestPermissionsFromUser(
new String[] { "ohos.permission.CAMERA" } , MY_PERMISSIONS_REQUEST_CAMERA);
} else {
// 顯示應用需要權(quán)限的理由,提示用戶進入設(shè)置授權(quán)
}
} else {
// 權(quán)限已被授予
}
@override
public void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults){
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
// 匹配requestPermissions的requestCode
if (grantResults.length > 0
&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
// 權(quán)限被授予
// 注意:因時間差導致接口權(quán)限檢查時有無權(quán)限,所以對那些因無權(quán)限而拋異常的接口進行異常捕獲處理
} else {
// 權(quán)限被拒絕
}
return;
}
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: