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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM