1. 程式人生 > 實用技巧 >uni-app開發經驗分享十二: Android平臺應用啟動時讀寫手機儲存、訪問裝置資訊(如IMEI)等許可權策略及提示資訊

uni-app開發經驗分享十二: Android平臺應用啟動時讀寫手機儲存、訪問裝置資訊(如IMEI)等許可權策略及提示資訊

Android平臺從6.0(API23)開始系統對許可權的管理更加嚴格,所有涉及敏感許可權都需要使用者授權允許才能獲取。
因此一些應用基礎業務邏輯需要的許可權會在應用啟動時申請,並引導使用者允許。

讀寫手機儲存許可權

應用需要儲存執行狀態等資料到手機SD卡中,啟動時需要獲取讀寫手機儲存許可權,此許可權為基礎許可權,影響真機執行、wgt升級。

  • 注意:此許可權目標不是要訪問相簿,是Android把相簿寫入許可權和儲存寫入許可權合併在一個許可權裡了。
  • 注意:wgt熱更新是應用市場不樂見的,不建議明顯提示給使用者或告知應用市場。

申請讀寫手機儲存需要使用者授權,會彈出如下提示框:

  • HBuilderX2.4.2及以下版本,使用者拒絕此許可權則直接退出應用。
  • HBuilderX2.4.3+版本,使用者拒絕後鍵會彈出以下提示框引導使用者重新允許

    • 點選“取消”退出應用;
      點選“確定”重新彈出授權框,如果使用者已經勾選“不再詢問”則開啟應用的設定介面。
      此提示語可在manifest.json中配置
    • HBuilderX2.5.0+開始支援配置應用啟動時申請獲取手機儲存許可權,支援以下三種策略
      • none
        應用啟動時不申請
      • once
        應用第一次啟動時申請,使用者可以拒絕
      • always
        應用每次啟動都申請,並且使用者必須允許,使用者拒絕時會彈出以下提示框引導使用者重新允許

原始碼檢視配置

開啟manifest.json檔案,切換到“原始碼檢視”項

  • uni-app專案
    在"app-plus" -> "distribute" -> "android" 節點下新增 permissionExternalStorage 節點
  • 5+ App專案
    在 "plus" -> "distribute" -> "google" 節點下新增 permissionExternalStorage 節點

permissionExternalStorage節點資料格式如下:

    "permissionExternalStorage": {  
        "request": "always",  
        "prompt": "應用儲存執行狀態等資訊,需要獲取讀寫手機儲存(系統提示為訪問裝置上的照片、媒體內容和檔案)許可權,請允許。"  
     }
  • equest
    字串型別,必填,申請裝置資訊許可權策略,可取值none、once、always。預設值為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>  

alue可取值為 none、once、always。

補充

溝通發現,部分開發者在main.js裡面呼叫了plus.device.getInfo這類方法。

但是其實API操作與permissionExternalStorage設定無關,permissionExternalStorage用於設定應用內部邏輯是否申請訪問SD卡許可權

開發者是因為在啟動的時候呼叫API觸發了許可權申請,誤以為permissionExternalStorage設定無效(其實設定是生效的)。

其它API操作會根據功能需求來申請許可權,比如作業系統相簿也會申請訪問SDK卡許可權、定位操作會申請定位許可權等。

轉載於https://ask.dcloud.net.cn/article/36549