說說Android6.0動態申請許可權的那些坑

来源:http://www.cnblogs.com/BobGo/archive/2016/10/31/6017538.html
-Advertisement-
Play Games

白天在做SDK23版本的適配,遇到了不少坑,現在抽空記下來,以此為戒。 首先要知道哪些坑,就得先瞭解一些定義和基本使用方式。 那麼先介紹一下動態申請的許可權分組情況。 下麵的許可權組是由谷歌官方定義的,目的是在申請許可權時,只要用戶允許同一許可權組的任意一條許可權,那麼該組的其他許可權也就預設是允許的。不過據高 ...


白天在做SDK23版本的適配,遇到了不少坑,現在抽空記下來,以此為戒。

  首先要知道哪些坑,就得先瞭解一些定義和基本使用方式。

那麼先介紹一下動態申請的許可權分組情況。

  下麵的許可權組是由谷歌官方定義的,目的是在申請許可權時,只要用戶允許同一許可權組的任意一條許可權,那麼該組的其他許可權也就預設是允許的。不過據高人介紹,在使用時最好是用到哪個許可權就具體的請求該許可權,因為保不齊哪天谷歌一高興就把許可權組換了甚至刪了、

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

 

其實許可權組的定義很簡單,下麵簡單介紹下動態申請許可權的步驟。

第一步,檢查app擁有的許可權。 

1 if(ContextCompat.checkSelfPermission(
2     mActivity,Manifest.permisson.READ_CONTACTS)
3     != PackageManager.PERMISSION_GRANTED) {
4     //當前Activity沒有獲得READ_CONTACTS許可權時
5 }else{
6     //否則已允許
7 }

第二步,申請許可權。

1 ActivityCompat.requestPermissions(
2     mActivity,
3     new String[]{Manifest.permission.READ_CONTACTS},
4     REQUEST_CODE_PERMISSION_CONTACTS);

 

第三步,許可權申請回調方法。

 1 @Override
 2 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
 3     switch (requestCode) {
 4         case REQUEST_CODE_PERMISSION_CONTACTS: {
 5             if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 6                 //用戶已授權
 7             } else {
 8                 //用戶拒絕許可權
 9             }
10             return;
11         }
12     }
13 }

 

如此三步,看上去很簡單,可真要用起來可就沒有那麼簡單了。下麵就說說這裡邊的坑吧。

 

坑一、許可權申請只能在Activity或者Fragment的上下文中,不能用getApplicationContext()。

  由於我們項目在應用初始化時要獲取記憶體的存儲路徑並創建一系列文件緩存,這些操作都是寫在Application的onCreate()中調用不同的Util工具類進行的,所以在Android6.0以上這麼寫就有點不太靠譜了。目前我的解決措施是在應用程式初始化時,先判斷SDK版本,只對版本號小於23的app創建緩存文件,高於23的則在進入Activity之後再初始化。

 

坑二、許可權申請時使用的請求碼必須小於16。

  至於什麼原因不太清楚,可能谷歌公司認為許可權本來就不多,沒必要將請求碼弄得很大占用多餘的記憶體吧。說到請求碼,也就是上面代碼中未定義的常量值REQUEST_CODE_PERMISSION_CONTACTS,如果你定義的這個值超過了15,運行時就會報安全異常,提示請求碼必須小於16。

 

目前來說這兩個坑就夠我忙活一天的了,看來還是經驗不足啊,以後還要多多吸取經驗。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 上篇博文AngularJs之directive中說了Scope作用域是個大坑,所以拿出來作為重點總結! 什麼是scope AngularJS 中,作用域是一個指嚮應用模型的對象,它是表達式的執行環境。作用域有層次結構,這個層次和相應的 DOM 幾乎是一樣的。作用域能監控表達式和傳遞事件。 在 ...
  • 就web元素排版佈局而言,在此之前,Web設計師需對Document元素完全按照HTML/CSS語言語法來編寫Web頁面,這意味著所有Web設計師都必須遵循許多瀏覽器的非標準差異來編寫頁面,而W3C又遲遲未統一這一標準,長久以來,導致編寫網頁Web設計師需處理不同瀏覽器之間的各種差異,一但排版佈局稍... ...
  • 方案一 水平居中和垂直居中,並且父容器的寬度高度都是未知的,裡面的子容器大小也是不一定的 DEMO 方案二 水平居中和垂直居中 absolute_transform DEMO 方案三 水平居中和垂直居中flex_justify-content_... ...
  • 已測適用於ios,某些安卓手機微信下播放視頻會出現播放器控制項(這個實在是無力吐槽了,因為之前還遇到過微信播放完視頻後竟然無法退出全屏出現廣告的情況,只有播放完後刷新頁面並且要放到框架頁里才能屏蔽微信視頻廣告!),之前用canvans渲染,感覺不夠太完美,又弄成背景切換形式得(用背景切換形式可以完美解 ...
  • 目錄: 創建canvas。 繪製直線、多邊形和七巧板。 繪製弧和圓。 (有些圖過於寬,被擠壓了。可以去相冊【canvas用到的圖。】看原圖。) 創建canvas。 HTML5的新標簽<canvas></canvas> 在使用時會添加id,通過id來獲取canvas元素來進行繪圖操作。 可以添加樣式。 ...
  • 1.只舍不如,保留小數點後兩位 NSString *leavemoney = @"4661998.08"; NSString *restinterest = @"44818.1283"; NSString *totalmoney = @"16808934.4083"; NSString *money ...
  • 目前開發只想最低版本支持iOS8了,iOS8以前的就不管了,然後現在iOS9和iOS10出來以後,有些新的API,也有些棄用的API,為了相容,有時候代碼裡面需要編寫判斷不同iOS版本,或者只允許指定的iOS版本才可以編譯或者執行。 需要用到以下方式,以下方式只針對OC(Swift的寫法暫時還不清楚 ...
  • 用戶點擊的時候的處理 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...