欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android6.0運(yùn)行時權(quán)限管理

 更新時間:2016年12月19日 14:49:53   作者:管滿滿  
自從Android6.0發(fā)布以來,在權(quán)限上做出了很大的變動,不再是之前的只要在manifest設(shè)置就可以任意獲取權(quán)限,而是更加的注重用戶的隱私和體驗(yàn)。本文詳細(xì)介紹了Android6.0運(yùn)行時權(quán)限管理。需要的朋友一起來看下吧

自從Android6.0發(fā)布以來,在權(quán)限上做出了很大的變動,不再是之前的只要在manifest設(shè)置就可以任意獲取權(quán)限,而是更加的注重用戶的隱私和體驗(yàn),不會再強(qiáng)迫用戶因拒絕不該擁有的權(quán)限而導(dǎo)致的無法安裝的事情,也不會再不征求用戶授權(quán)的情況下,就可以任意的訪問用戶隱私,而且即使在授權(quán)之后也可以及時的更改權(quán)限。這就是6.0版本做出的更擁護(hù)和注重用戶的一大體現(xiàn)。

一、認(rèn)知

今天我們就來學(xué)習(xí)下Android6.0的權(quán)限管理。

Android6.0系統(tǒng)把權(quán)限分為兩個級別:

一個是Normal Permissions,即普通權(quán)限,這類權(quán)限不會潛藏有侵害用戶隱私和安全的問題,比如,訪問網(wǎng)絡(luò)的權(quán)限,訪問WIFI的權(quán)限等;

另一類是Dangerous Permissions,即危險權(quán)限,這類權(quán)限會直接的威脅到用戶的安全和隱私問題,比如說訪問短信,相冊等權(quán)限。

但是到底哪些是普通權(quán)限和危險權(quán)限呢,這里給出分類,大家在使用時以便參考。

1、Normal Permissions (普通權(quán)限)

  • 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

使用以上權(quán)限是不會威脅到用戶安全的,所以這類權(quán)限是可以直接的在manifest里面直接的使用,而且在安裝后也會直接的生效了。

2、Dangerous Permissions (危險權(quán)限)

SMS(短信)

  • SEND_SMS
  • RECEIVE_SMS
  • READ_SMS
  • RECEIVE_WAP_PUSH
  • RECEIVE_MMS

STORAGE(存儲卡)

  • READ_EXTERNAL_STORAGE
  • WRITE_EXTERNAL_STORAGE

CONTACTS(聯(lián)系人)

  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS

PHONE(手機(jī))

  • READ_PHONE_STATE
  • CALL_PHONE
  • READ_CALL_LOG
  • WRITE_CALL_LOG
  • ADD_VOICEMAIL
  • USE_SIP
  • PROCESS_OUTGOING_CALLS

CALENDAR(日歷)

  • READ_CALENDAR
  • WRITE_CALENDAR

CAMERA(相機(jī))

  • CAMERA

LOCATION(位置)

  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION

SENSORS(傳感器)

  • BODY_SENSORS

MICROPHONE(麥克風(fēng))

  • RECORD_AUDIO

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

ok,光說不練不是咱的風(fēng)格,咱寫東西都是基于自己遇到的問題,然后認(rèn)真的學(xué)習(xí)后才記錄下來的。一方面鞏固自己的知識,另一方面也希望能幫助他人提供一點(diǎn)解決方案。

二、實(shí)戰(zhàn)

實(shí)戰(zhàn)部分分為幾種情況,因?yàn)楦鶕?jù)我們的目標(biāo)SDK版本和Android真機(jī)版本的不同會有不同的情景,針對普通權(quán)限大家都熟悉,就不介紹了,下面一一介紹危險權(quán)限的使用情景:

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

我們這里以讀取短信息為例講解整個權(quán)限的使用:

1、沒有訪問權(quán)限的情況下:

首先我們先來設(shè)計下布局,如下:

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

然后,點(diǎn)擊界面上的“讀取收件箱中的短信”,相信大家都會知道發(fā)生什么情況,果然不出意外的程序直接崩潰了,打下日志:

日志中很清晰的告訴我們,這個異常是因?yàn)闆]有權(quán)限而造成的,那么我們就直接給它加上讀取短信的權(quán)限來看看吧。

2、在manifest中添加了權(quán)限:

在manifest中加了對讀取短信的權(quán)限,你應(yīng)該很高興的等待著總共有多少條短信出現(xiàn)在我們的界面上,但是,事實(shí)很讓人崩潰:

再次出現(xiàn)了沒有權(quán)限的異常,這是為什么呢?

這里我們先不解決這個問題,先來想象一種實(shí)際的情況,假如你現(xiàn)有的APP里面有很多使用到了危險權(quán)限,有時候你并完全清楚到底在哪里使用了,但是你的目標(biāo)版本又是像我的版本一樣指向了6.0,而有可能用戶的手機(jī)是6.0以上的版本,那么這時候你的APP就有可能會出現(xiàn)這種,那么在你還沒查清楚有哪些地方使用了危險權(quán)限是,該怎么解決呢?

那么你可以這么解決:

修改你build.gradle 中的 targetSdkVersion 目標(biāo)版本號:

然后手機(jī)版本還是6.0以上,來看看結(jié)果:

可以了,哈哈,你很高興,確實(shí)是可以了。

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

當(dāng)targetSdkVersion >= 23,且真機(jī)版本 >= 23時,即使在manifest中添加了相應(yīng)的危險權(quán)限,在沒有做相應(yīng)的處理時(至于怎么處理后面會講),還時會出現(xiàn)限權(quán)的異常,這時manifest中的危險權(quán)限并沒有起作用,但是還必須聲明。

當(dāng)targetSdkVersion < 23,且真機(jī)版本 >= 23時,我們并沒有做任何的相關(guān)處理,就得到了想要的訪問權(quán)限,這說明在manifest中申請的危險權(quán)限起作用了。

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

這次我們用個4.4.4版本的模擬機(jī)

目標(biāo)targetSdkVersion 為21 來看看結(jié)果:

也是可以的,0條信息是因?yàn)槲业哪M機(jī)上沒短信,這個數(shù)字多少和我們沒有關(guān)系。假如targetSdkVersion 為23呢,來看看結(jié)果:

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

由此我們也得到了一個小結(jié)論:

當(dāng)我們的真機(jī)系統(tǒng)版本 < 23時,不管我們的targetSdkVersion 值是否大于23,都不會影響我們在manifest里面申請的權(quán)限,也就是說這時候真機(jī)的系統(tǒng)版本在起著主導(dǎo)作用。

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

那么現(xiàn)在回來解決上面遺留的問題,當(dāng)真機(jī)和目標(biāo)版本都大于6.0時出現(xiàn)的權(quán)限異常我們該怎么解決呢?

主要分為三個步驟:

1:檢查是否擁有權(quán)限

2:假如沒有權(quán)限,則申請權(quán)限

3:處理權(quán)限回調(diào)

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

1:檢查是否擁有權(quán)限

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

checkSelfPermission方法中有兩個參數(shù),分別是上下文,以及所申請的權(quán)限。

如果有權(quán)限,請讓它直接去讀取短信信息。如果沒有權(quán)限則去申請。

2:申請權(quán)限

申請權(quán)限則是使用:

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

requestPermissions方法中需要三個參數(shù),當(dāng)前的activity,所申請的權(quán)限,可以是多個,最后就是請求碼,既然有請求碼說明它會有一個回調(diào),也就是我們下面要講的處理回調(diào)。

3:處理權(quán)限回調(diào)

處理權(quán)限回調(diào),需要在Activity中重寫onRequestPermissionsResult方法:

然后在方法內(nèi)判斷用戶是授權(quán)了該權(quán)限組還是拒絕授權(quán),如果授權(quán)則就去獲取短信信息,否則,在這里我只是顯示了一個toast提示框。

這里再次說明下,權(quán)限組內(nèi)只要有一個被授權(quán),其他的權(quán)限也就有了權(quán)限,這也是為什么直接使用grantResults[0] == PackageManager.PERMISSION_GRANTED的原因。

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

我們可以看到,當(dāng)我們第一次點(diǎn)擊讀取短信時,它會先檢查該應(yīng)用是否有權(quán)限,如果沒有,就去申請,這里在界面上對應(yīng)的就是顯示一個授權(quán)的對話框,第一次我們選擇了拒絕授權(quán),然后在回調(diào)里面就會對應(yīng)先打印了我們的一個toast消失提醒我們拒絕了授權(quán),但是當(dāng)我們再次需要讀取短信時,它還會去申請授權(quán),這時我們允許授權(quán),然后我們就看到了,在顯示短信條數(shù)的TextView顯示了短信的條數(shù)。(這里0條是因?yàn)榈挠玫哪M器沒有短信,這不是重點(diǎn)。)

值得提醒的事,當(dāng)我們第一次選擇拒絕授權(quán)時,當(dāng)再次點(diǎn)擊讀取短信時,這時在授權(quán)對話框中會多一個“不再提醒”的提示,當(dāng)我們在拒絕了授權(quán),并選擇不再提醒時,那么會出現(xiàn)什么情況呢?請看演示:

當(dāng)多次拒絕并選擇不提提醒,那么下次再去讀取就不會在去申請授權(quán),而是直接在回調(diào)中說明用戶已拒絕授權(quán)。

那么這時候假如用戶出于某種需要必須得給應(yīng)用授權(quán)該怎么做呢,其實(shí)很簡單,在回調(diào)中,提醒用戶去“設(shè)置”里面手動給應(yīng)用授權(quán),或是發(fā)個廣播打開設(shè)置界面等等都可,這里和我顯示的提醒“權(quán)限已被拒絕”基本一樣,只需在稍微優(yōu)化即可,這里不在演示。

其實(shí)到這里已經(jīng)差不多講完,但是,有一個方法我們可以留一下,那就是shouldShowRequestPermissionRationale,這個方法默認(rèn)返回false,但當(dāng)用戶在上一次已經(jīng)拒絕過這個權(quán)限申請時,再次需要申請?jiān)摍?quán)限時,就會返回ture,它的寓意是你已經(jīng)拒絕了一次,結(jié)果又彈出個授權(quán)框,你需要給我一個解釋,為什么要授權(quán),也就是說對多次授權(quán)這個權(quán)限做出解釋,以便用戶知道為什么必須授權(quán)了才能夠完成他操作。

下面,來看看它的使用:

我這里就簡單的彈出個對話框,說明下為什么要用這個權(quán)限,然后再次去調(diào)用這個申請的權(quán)限的方法了,大家可以同回調(diào)的方法一起封裝下,可以更好的應(yīng)用。

看下界面操作:

講到這里基本差不地講完了,這里只是講了單個申請權(quán)限,多個一起也是可以的,大家可以自己試試,基本是一樣的操作,另外在說明一點(diǎn),可能我們一個應(yīng)用里,需要多出的使用到危險權(quán)限,這樣就造成我們需要多次重寫一樣的代碼,很不便利,所以網(wǎng)上也就出現(xiàn)了很多關(guān)于權(quán)限框架的開源代碼,大家可以自行的使用。

ok,到這里就結(jié)束了,希望大家能學(xué)到點(diǎn)知識,同時也多自己的實(shí)操下,祝大家生活愉快。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • Android OKHttp源碼解析Https安全處理

    Android OKHttp源碼解析Https安全處理

    這篇文章主要為大家介紹了Android OKHttp源碼解析Https安全處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android ContentResolver使用說明

    Android ContentResolver使用說明

    這篇文章主要介紹了Android ContentResolver使用說明,需要的朋友可以參考下
    2016-01-01
  • Android編程實(shí)現(xiàn)開機(jī)自動運(yùn)行的方法

    Android編程實(shí)現(xiàn)開機(jī)自動運(yùn)行的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)開機(jī)自動運(yùn)行的方法,分析了Android開機(jī)運(yùn)行的原理并結(jié)合實(shí)例形式給出了Android基于廣播實(shí)現(xiàn)開機(jī)運(yùn)行的技巧,需要的朋友可以參考下
    2016-10-10
  • Android視頻加水印之FFmpeg的簡單應(yīng)用實(shí)例

    Android視頻加水印之FFmpeg的簡單應(yīng)用實(shí)例

    最近有個需求,需要錄制視頻,能添加水印,所以下面這篇文章主要給大家介紹了關(guān)于Android視頻加水印之FFmpeg的簡單應(yīng)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Android自定義控件實(shí)現(xiàn)邊緣凹凸的卡劵效果

    Android自定義控件實(shí)現(xiàn)邊緣凹凸的卡劵效果

    這篇文章主要介紹了Android自定義控件實(shí)現(xiàn)邊緣凹凸的卡劵效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android中startService基本使用方法概述

    Android中startService基本使用方法概述

    這篇文章主要介紹了Android中startService基本使用方法,詳細(xì)解釋了startService的基本使用概述及其生命周期,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 適配Android 8.0版本更新安裝與通知欄的一些坑

    適配Android 8.0版本更新安裝與通知欄的一些坑

    這篇文章主要給大家介紹了關(guān)于Android適配8.0版本更新安裝與通知欄的一些坑,文中通過示例代碼將這些坑介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Android中Split()字符串分割特殊用法案例詳解

    Android中Split()字符串分割特殊用法案例詳解

    本文通過案例的形式給大家詳細(xì)介紹了android中split()字符串分割特殊用法的知識,非常不錯具有參考借鑒價值,感興趣的朋友參考下
    2016-11-11
  • Android實(shí)現(xiàn)電子羅盤(指南針)方向傳感器的應(yīng)用

    Android實(shí)現(xiàn)電子羅盤(指南針)方向傳感器的應(yīng)用

    今天小編就為大家分享一篇關(guān)于Android實(shí)現(xiàn)電子羅盤(指南針)方向傳感器的應(yīng)用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Flutter倒計時/計時器的實(shí)現(xiàn)代碼

    Flutter倒計時/計時器的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Flutter倒計時/計時器的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論