Android6.0運行時許可權管理

来源:http://www.cnblogs.com/guanmanman/archive/2016/12/19/6197148.html
-Advertisement-
Play Games

自從Android6.0發佈以來,在許可權上做出了很大的變動,不再是之前的只要在manifest設置就可以任意獲取許可權,而是更加的註重用戶的隱私和體驗,不會再強迫用戶因拒絕不該擁有的許可權而導致的無法安裝的事情,也不會再不征求用戶授權的情況下,就可以任意的訪問用戶隱私,而且即使在授權之後也可以及時的更改 ...


自從Android6.0發佈以來,在許可權上做出了很大的變動,不再是之前的只要在manifest設置就可以任意獲取許可權,而是更加的註重用戶的隱私和體驗,不會再強迫用戶因拒絕不該擁有的許可權而導致的無法安裝的事情,也不會再不征求用戶授權的情況下,就可以任意的訪問用戶隱私,而且即使在授權之後也可以及時的更改許可權。這就是6.0版本做出的更擁護和註重用戶的一大體現。

一、認知

今天我們就來學習下Android6.0的許可權管理。

Android6.0系統把許可權分為兩個級別:

一個是Normal Permissions,即普通許可權,這類許可權不會潛藏有侵害用戶隱私和安全的問題,比如,訪問網路的許可權,訪問WIFI的許可權等;

另一類是Dangerous Permissions,即危險許可權,這類許可權會直接的威脅到用戶的安全和隱私問題,比如說訪問簡訊,相冊等許可權。

但是到底哪些是普通許可權和危險許可權呢,這裡給出分類,大家在使用時以便參考。

1、Normal Permissions (普通許可權)

  • ACCESS_LOCATION_EXTRA_COMMANDS
  • ACCESS_NETWORK_STATE
  • ACCESS_NOTIFICATION_POLICY
  • ACCESS_WIFI_STATE
  • BLUETOOTH
  • BLUETOOTH_ADMIN
  • BROADCAST_STICKY
  • CHANGE_NETWORK_STATE
  • CHANGE_WIFI_MULTICAST_STATE
  • CHANGE_WIFI_STATE
  • DISABLE_KEYGUARD
  • EXPAND_STATUS_BAR
  • GET_PACKAGE_SIZE
  • INSTALL_SHORTCUT
  • INTERNET
  • KILL_BACKGROUND_PROCESSES
  • MODIFY_AUDIO_SETTINGS
  • NFC
  • READ_SYNC_SETTINGS
  • READ_SYNC_STATS
  • RECEIVE_BOOT_COMPLETED
  • REORDER_TASKS
  • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • REQUEST_INSTALL_PACKAGES
  • SET_ALARM
  • SET_TIME_ZONE
  • SET_WALLPAPER
  • SET_WALLPAPER_HINTS
  • TRANSMIT_IR
  • UNINSTALL_SHORTCUT
  • USE_FINGERPRINT
  • VIBRATE
  • WAKE_LOCK
  • WRITE_SYNC_SETTINGS

使用以上許可權是不會威脅到用戶安全的,所以這類許可權是可以直接的在manifest裡面直接的使用,而且在安裝後也會直接的生效了。

2、Dangerous Permissions (危險許可權)

  • SMS(簡訊)
    • SEND_SMS
    • RECEIVE_SMS
    • READ_SMS
    • RECEIVE_WAP_PUSH
    • RECEIVE_MMS
  • STORAGE(存儲卡)
    • READ_EXTERNAL_STORAGE
    • WRITE_EXTERNAL_STORAGE
  • CONTACTS(聯繫人)
    • READ_CONTACTS
    • WRITE_CONTACTS
    • GET_ACCOUNTS
  • PHONE(手機)
    • READ_PHONE_STATE
    • CALL_PHONE
    • READ_CALL_LOG
    • WRITE_CALL_LOG
    • ADD_VOICEMAIL
    • USE_SIP
    • PROCESS_OUTGOING_CALLS
  • CALENDAR(日曆)
    • READ_CALENDAR
    • WRITE_CALENDAR
  • CAMERA(相機)
    • CAMERA
  • LOCATION(位置)
    • ACCESS_FINE_LOCATION
    • ACCESS_COARSE_LOCATION
  • SENSORS(感測器)
    • BODY_SENSORS
  • MICROPHONE(麥克風)
    • RECORD_AUDIO

危險許可權和普通許可權也有區別,普通許可權是單條的許可權,而危險許可權是以組展示的,也就是說,當你接受一個危險許可權時,不但但接受的是界面上展示的這一個許可權,而是它所在這個組裡面的其他所有訪問許可權也將會被自動獲取許可權,比如,一旦WRITE_CONTACTS被授權了,App也有READ_CONTACTS和GET_ACCOUNTS的許可權了。
值得註意的是,這類許可權也是需要在manifest中註冊的。

ok,光說不練不是咱的風格,咱寫東西都是基於自己遇到的問題,然後認真的學習後才記錄下來的。一方面鞏固自己的知識,另一方面也希望能幫助他人提供一點解決方案。

二、實戰

實戰部分分為幾種情況,因為根據我們的目標SDK版本和Android真機版本的不同會有不同的情景,針對普通許可權大家都熟悉,就不介紹了,下麵一一介紹危險許可權的使用情景:

在介紹使用情景之前,先看下我的開發和真機的Android版本。

我們這裡以讀取簡訊息為例講解整個許可權的使用:

1、沒有訪問許可權的情況下:

首先我們先來設計下佈局,如下:

看下代碼,很簡單,就直接讀取短息:

然後,點擊界面上的“讀取收件箱中的簡訊”,相信大家都會知道發生什麼情況,果然不出意外的程式直接崩潰了,打下日誌:

日誌中很清晰的告訴我們,這個異常是因為沒有許可權而造成的,那麼我們就直接給它加上讀取簡訊的許可權來看看吧。

2、在manifest中添加了許可權:

在manifest中加了對讀取簡訊的許可權,你應該很高興的等待著總共有多少條簡訊出現在我們的界面上,但是,事實很讓人崩潰:

再次出現了沒有許可權的異常,這是為什麼呢?

這裡我們先不解決這個問題,先來想象一種實際的情況,假如你現有的APP裡面有很多使用到了危險許可權,有時候你並完全清楚到底在哪裡使用了,但是你的目標版本又是像我的版本一樣指向了6.0,而有可能用戶的手機是6.0以上的版本,那麼這時候你的APP就有可能會出現這種,那麼在你還沒查清楚有哪些地方使用了危險許可權是,該怎麼解決呢?

那麼你可以這麼解決:

修改你build.gradle 中的 targetSdkVersion 目標版本號:

然後手機版本還是6.0以上,來看看結果:

可以了,哈哈,你很高興,確實是可以了。

那麼聰明的你或許意識到什麼了,是的,以版本23,也就是android6.0位分割線,我們可以得出一個小結論:

當targetSdkVersion >= 23,且真機版本 >= 23時,即使在manifest中添加了相應的危險許可權,在沒有做相應的處理時(至於怎麼處理後面會講),還時會出現限權的異常,這時manifest中的危險許可權並沒有起作用,但是還必須聲明。

當targetSdkVersion < 23,且真機版本 >= 23時,我們並沒有做任何的相關處理,就得到了想要的訪問許可權,這說明在manifest中申請的危險許可權起作用了。

我們在來看另外一種情況,就是,假如我的手機比較舊,還沒更新6.0的系統,這種情況下又該是什麼情況呢?

這次我們用個4.4.4版本的模擬機

目標targetSdkVersion 為21 來看看結果:

也是可以的,0條信息是因為我的模擬機上沒簡訊,這個數字多少和我們沒有關係。假如targetSdkVersion 為23呢,來看看結果:

很清晰的看出,我們又得到了正確的結果。

由此我們也得到了一個小結論:

當我們的真機系統版本 < 23時,不管我們的targetSdkVersion 值是否大於23,都不會影響我們在manifest裡面申請的許可權,也就是說這時候真機的系統版本在起著主導作用。

由上面的幾條結論,我們應該很清晰的知道了訪問許可權在真機中的使用狀況,但是我們的手機在升級,版本也會越來越高,因此我們現在的應用不可能一直只支持低版本的使用也不考慮兼顧高版本。所以現在APP許可權升級是必然的趨勢。

那麼現在回來解決上面遺留的問題,當真機和目標版本都大於6.0時出現的許可權異常我們該怎麼解決呢?

主要分為三個步驟:

1:檢查是否擁有許可權

2:假如沒有許可權,則申請許可權

3:處理許可權回調

下麵我們分別來看看這幾個步驟。

1:檢查是否擁有許可權

檢查是否已擁有了許可權,可以使用ContextCompat.checkSelfPermission(Context context, String permission);

checkSelfPermission方法中有兩個參數,分別是上下文,以及所申請的許可權。

如果有許可權,請讓它直接去讀取簡訊信息。如果沒有許可權則去申請。

2:申請許可權

申請許可權則是使用:

public static void requestPermissions(final Activity activity,final String[] permissions, final int requestCode) {}

requestPermissions方法中需要三個參數,當前的activity,所申請的許可權,可以是多個,最後就是請求碼,既然有請求碼說明它會有一個回調,也就是我們下麵要講的處理回調。

3:處理許可權回調

處理許可權回調,需要在Activity中重寫onRequestPermissionsResult方法:

然後在方法內判斷用戶是授權了該許可權組還是拒絕授權,如果授權則就去獲取簡訊信息,否則,在這裡我只是顯示了一個toast提示框。

這裡再次說明下,許可權組內只要有一個被授權,其他的許可權也就有了許可權,這也是為什麼直接使用grantResults[0] == PackageManager.PERMISSION_GRANTED的原因。

ok,下麵來具體的界面顯示:

我們可以看到,當我們第一次點擊讀取簡訊時,它會先檢查該應用是否有許可權,如果沒有,就去申請,這裡在界面上對應的就是顯示一個授權的對話框,第一次我們選擇了拒絕授權,然後在回調裡面就會對應先列印了我們的一個toast消失提醒我們拒絕了授權,但是當我們再次需要讀取簡訊時,它還會去申請授權,這時我們允許授權,然後我們就看到了,在顯示簡訊條數的TextView顯示了簡訊的條數。(這裡0條是因為的用的模擬器沒有簡訊,這不是重點。)

值得提醒的事,當我們第一次選擇拒絕授權時,當再次點擊讀取簡訊時,這時在授權對話框中會多一個“不再提醒”的提示,當我們在拒絕了授權,並選擇不再提醒時,那麼會出現什麼情況呢?請看演示:

當多次拒絕並選擇不提提醒,那麼下次再去讀取就不會在去申請授權,而是直接在回調中說明用戶已拒絕授權。

那麼這時候假如用戶出於某種需要必須得給應用授權該怎麼做呢,其實很簡單,在回調中,提醒用戶去“設置”裡面手動給應用授權,或是發個廣播打開設置界面等等都可,這裡和我顯示的提醒“許可權已被拒絕”基本一樣,只需在稍微優化即可,這裡不在演示。

其實到這裡已經差不多講完,但是,有一個方法我們可以留一下,那就是shouldShowRequestPermissionRationale,這個方法預設返回false,但當用戶在上一次已經拒絕過這個許可權申請時,再次需要申請該許可權時,就會返回ture,它的寓意是你已經拒絕了一次,結果又彈出個授權框,你需要給我一個解釋,為什麼要授權,也就是說對多次授權這個許可權做出解釋,以便用戶知道為什麼必須授權了才能夠完成他操作。

下麵,來看看它的使用:

我這裡就簡單的彈出個對話框,說明下為什麼要用這個許可權,然後再次去調用這個申請的許可權的方法了,大家可以同回調的方法一起封裝下,可以更好的應用。

看下界面操作:

講到這裡基本差不地講完了,這裡只是講了單個申請許可權,多個一起也是可以的,大家可以自己試試,基本是一樣的操作,另外在說明一點,可能我們一個應用里,需要多出的使用到危險許可權,這樣就造成我們需要多次重寫一樣的代碼,很不便利,所以網上也就出現了很多關於許可權框架的開源代碼,大家可以自行的使用。

ok,到這裡就結束了,希望大家能學到點知識,同時也多自己的實操下,祝大家生活愉快。

更多資訊請關註微信平臺,有博客更新會及時通知。愛學習愛技術。




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

-Advertisement-
Play Games
更多相關文章
  • 微信小程式提交審核需要選擇資質服務範圍,如果服務範圍不對,審核會不通過, 開發小程式之前,最好先查詢所開發小程式的資質範圍,否則無法通過微信審核。 小程式的資質範圍查詢地址,數據同步微信官方 https://weixin.hotapp.cn/weixinmob ...
  • CocoaPods是什麼? 當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,“子子孫孫無窮盡也”,這也許是比較特殊的情況。總之小編的意思就是,手動一個個 ...
  • 多線程下載就是將同一個網路上的原始文件根據線程個數分成均等份,然後每個單獨的線程下載對應的一部分 ...
  • 概覽屏幕 概覽屏幕 概覽屏幕(也稱為最新動態屏幕、最近任務列表或最近使用的應用)是一個系統級別 UI,其中列出了最近訪問過的 Activity 和任務。 用戶可以瀏覽該列表並選擇要恢復的任務,也可以通過滑動清除任務將其從列表中移除。 對於 Android 5.0 版本(API 級別 21),包含不同 ...
  • 廣度優先搜索 在給定圖G=(V,E)和一個特定的源頂點s的情況下,廣度優先搜索系統地探索G中的邊,以期“發現”可從s 到達的所有頂點,並計算s 到所有這些可達頂點之間的距離(即最少的邊數)。該搜索演算法同時還能生成一棵根為s、且包括所有s 的可達頂點的廣度優先樹。對從s 可達的任意頂點v,廣度優先樹中 ...
  • 一、SQLite保存數據介紹 將資料庫保存在資料庫對於重覆或者結構化數據(比如契約信息)而言是理想之選。SQL資料庫的主要原則之一是架構:資料庫如何組織正式聲明。架構體現於用於創建資料庫的SQL語句。它有助於創建伴隨類,即契約類,其以一種系統性、自記錄的方式明確指定架構佈局。 契約類是用於定義URL ...
  • res/layout中的佈局文件太雜,沒有層次感,受不了的我治好想辦法解決這個問題。 前幾天看博客說可以使用插件分組,可惜我沒找到。知道看到另一篇博客時,才知道這個方法不能用了。 不能用插件,那就手動來吧。(http://blog.csdn.net/u011156012/article/detail ...
  • 使用Android Studio 一、在build.gradle(Module:app)添加代碼 下載,調用插件 1 apply plugin: 'com.android.application' 2 3 android { 4 compileSdkVersion 24 5 buildToolsVe ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...