Android平臺應用啟動時讀寫手機儲存、訪問裝置資訊(如IMEI)等許可權策略及提示資訊
說明
Android平臺從6.0(API23)開始系統對許可權的管理更加嚴格,所有涉及敏感許可權都需要使用者授權允許才能獲取。
因此一些應用基礎業務邏輯需要的許可權會在應用啟動時申請,並引導使用者允許。
讀寫手機儲存許可權
HBuilderX3.0+版本調整申請讀寫手機儲存許可權策略預設值為 once
應用需要儲存執行狀態等資料到手機SD卡中,啟動時需要獲取讀寫手機儲存許可權,此許可權為基礎許可權,影響真機執行、wgt升級。
- 注意:此許可權目標不是要訪問相簿,是Android把相簿寫入許可權和儲存寫入許可權合併在一個許可權裡了。
- 注意:wgt熱更新是應用市場不樂見的,不建議明顯提示給使用者或告知應用市場。
申請讀寫手機儲存需要使用者授權,會彈出如下提示框:
- HBuilderX2.4.2及以下版本,使用者拒絕此許可權則直接退出應用。
- HBuilderX2.4.3+版本,使用者拒絕後鍵會彈出以下提示框引導使用者重新允許
點選“取消”退出應用;
點選“確定”重新彈出授權框,如果使用者已經勾選“不再詢問”則開啟應用的設定介面。
此提示語可在manifest.json中配置 - HBuilderX2.5.0+開始支援配置應用啟動時申請獲取手機儲存許可權,支援以下三種策略
- none
應用啟動時不申請 - once
應用第一次啟動時申請,使用者可以拒絕 - always
應用每次啟動都申請,並且使用者必須允許,使用者拒絕時會彈出以下提示框引導使用者重新允許
- none
原始碼檢視配置
開啟manifest.json檔案,切換到“原始碼檢視”項
- uni-app專案
在"app-plus" -> "distribute" -> "android" 節點下新增 permissionExternalStorage 節點 - 5+ App專案
在 "plus" -> "distribute" -> "google" 節點下新增 permissionExternalStorage 節點
permissionExternalStorage節點資料格式如下:
複製程式碼 "permissionExternalStorage": {
"request": "always",
"prompt": "應用儲存執行狀態等資訊,需要獲取讀寫手機儲存(系統提示為訪問裝置上的照片、媒體內容和檔案)許可權,請允許。"
}
- request
字串型別,必填,申請讀寫手機儲存許可權策略,可取值none、once、always。- HBuilderX3.0+版本預設值調整為once
- HBuilderX3.0以下版本預設值always
- prompt
字串型別,可選,使用者拒絕時彈出提示框上的內容。
預設值為:應用儲存執行狀態等資訊,需要獲取讀寫手機儲存(系統提示為訪問裝置上的照片、媒體內容和檔案)許可權,請允許。
國際化配置參考:https://ask.dcloud.net.cn/article/35860#strings
設定自定義鍵名稱為“dcloud_permission_write_external_storage_message”。
儲存後提交雲端打包生效
訪問裝置資訊許可權
Android平臺應用獲取裝置資訊(如IMEI、IMSI等),統計、推送、廣告等業務功能依賴這些資訊。
此許可權不是必選,拒絕此許可權不影響App端基座執行。但擁有本許可權可以給開發者提供更準確的統計報表。
而申請獲取這些資訊需要使用者授權,會彈出如下提示框:
華為手機應用的設定中許可權列表中為“電話”許可權
HBuilderX2.3.8+開始支援配置應用啟動時申請獲取裝置資訊許可權,支援以下三種策略
- none
應用啟動時不申請 - once
應用第一次啟動時申請,使用者可以拒絕 - always
應用每次啟動都申請,並且使用者必須允許,使用者拒絕時會彈出以下提示框引導使用者重新允許
此提示框刪的文字可自定義,參考下面的prompt欄位
預設策略為once,即應用第一次啟動時申請
原始碼檢視配置
開啟manifest.json檔案,切換到“原始碼檢視”項
- uni-app專案
在 "app-plus" -> "distribute" -> "android" 節點下新增 permissionPhoneState 節點 - 5+ App專案
在 "plus" -> "distribute" -> "google" 節點下新增 permissionPhoneState 節點
permissionPhoneState節點資料格式如下:
複製程式碼 "permissionPhoneState": {
"request": "always",
"prompt": "為保證您正常、安全地使用,需要獲取裝置識別碼(部分手機提示為獲取手機號碼)使用許可權,請允許。"
}
- request
字串型別,必填,申請裝置資訊許可權策略,可取值none、once、always。預設值為once。 - prompt
字串型別,可選,使用者拒絕時彈出提示框上的內容。
預設值為:為保證您正常、安全地使用,需要獲取裝置識別碼(部分手機提示為獲取手機號碼)使用許可權,請允許。
國際化配置參考:https://ask.dcloud.net.cn/article/35860#strings
設定自定義鍵名稱為“dcloud_permission_read_phone_state_message”。
儲存後提交雲端打包生效
離線打包提示語配置及彈窗配置。
提示語配置
在主專案的strings.xml中新增如下欄位。strings.xml位於 專案目錄/src/main/res/values下,如果檔案或資料夾不存在,直接新建即可。
儲存許可權提示語配置
複製程式碼<resources>
<string name="dcloud_permission_write_external_storage_message">儲存許可權提示語</string>
</resources>
讀取手機狀態許可權配置
複製程式碼<resources>
<string name="dcloud_permission_read_phone_state_message">讀取手機狀態許可權提示語</string>
</resources>
彈窗配置
在androidManifest.xml的application節點下新增如下欄位。
儲存許可權彈窗配置
複製程式碼<application>
<meta-data android:name="DCLOUD_WRITE_EXTERNAL_STORAGE" android:value="once"/>
</application>
value可取值為 none、once、always。
讀取手機狀態彈窗配置
複製程式碼<application>
<meta-data android:name="DCLOUD_READ_PHONE_STATE" android:value="once"/>
</application>
value可取值為 none、once、always。
補充
溝通發現,部分開發者在main.js裡面呼叫了plus.device.getInfo這類方法。
但是其實API操作與permissionExternalStorage設定無關,permissionExternalStorage用於設定應用內部邏輯是否申請訪問SD卡許可權
開發者是因為在啟動的時候呼叫API觸發了許可權申請,誤以為permissionExternalStorage設定無效(其實設定是生效的)。
其它API操作會根據功能需求來申請許可權,比如作業系統相簿也會申請訪問SDK卡許可權、定位操作會申請定位許可權等。
https://ask.dcloud.net.cn/article/36549