最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
android系統(tǒng)權(quán)限,安卓系統(tǒng)軟件權(quán)限設(shè)置

android權(quán)限管理

從 Android 6.0 開始,按照是否需要?jiǎng)討B(tài)申請(qǐng)分為 普通權(quán)限 和 特殊權(quán)限

創(chuàng)新互聯(lián)長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為霍城企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,霍城網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

特殊權(quán)限 需要程序運(yùn)行時(shí)申請(qǐng)并通過之后才能使用,或者程序安裝為系統(tǒng)應(yīng)用或系統(tǒng)簽名。

注意:

1、動(dòng)態(tài)申請(qǐng)也需要在清單文件中配置(AndroidMenifest.xml)

2、權(quán)限是分組的,同一組的權(quán)限申請(qǐng)其中一個(gè),同組的權(quán)限就全部都申請(qǐng)了

特殊權(quán)限共有 9 組:

9 組具體權(quán)限列表:

普通權(quán)限在清單文件配置(AndroidMenifest.xml)即可使用

(1)在 AndroidMenifest.xml 清單文件中申請(qǐng)

(2)單個(gè)申請(qǐng)

(2)批量申請(qǐng)

(3)回調(diào)處理

Android權(quán)限機(jī)制

我們知道 Android 應(yīng)用程序是沙箱隔離的,每個(gè)應(yīng)用都有一個(gè)只有自己具有讀寫權(quán)限的專用數(shù)據(jù)目錄。但是如果應(yīng)用要訪問別人的組件或者一些設(shè)備上全局可訪問的資源,這時(shí)候權(quán)限機(jī)制就能系統(tǒng)化地規(guī)范并強(qiáng)制各類應(yīng)用程序的行為準(zhǔn)則。

Android 安全性概覽

在 Android 中,一個(gè)權(quán)限,本質(zhì)上是一個(gè)字符串,一個(gè)可以表示執(zhí)行特定操作的能力的字符串。比如說:訪問 SD 卡的能力,訪問通訊錄的能力,啟動(dòng)或訪問一個(gè)第三方應(yīng)用中的組件的能力。 權(quán)限被授予了之后,首先會(huì)在內(nèi)存和本地中有記錄,這在調(diào)用系統(tǒng)binder服務(wù)和其他應(yīng)用組件時(shí)做鑒權(quán)依據(jù),比如調(diào)用系統(tǒng)binder服務(wù)時(shí)會(huì)通過Binder.getCallingUid()拿到調(diào)用者的Uid,而Uid一般都是與應(yīng)用包名一一對(duì)應(yīng)的,再拿這個(gè)Uid到PMS里去查這個(gè)應(yīng)用對(duì)應(yīng)的權(quán)限。 其次會(huì)按被授予的權(quán)限將應(yīng)用分到某個(gè)組。 可以參考

自定義權(quán)限的應(yīng)用場(chǎng)景在于限制其它應(yīng)用對(duì)本應(yīng)用四大組件的訪問。具體用法可以參考

pm list permissions -f 命令可以詳細(xì)查看 Android 所有預(yù)定義的權(quán)限。

更詳細(xì)的權(quán)限信息參考

可以看到一個(gè)權(quán)限的信息包括:定義的包名、標(biāo)簽、描述、 權(quán)限組 和 保護(hù)級(jí)別 。

權(quán)限根據(jù)設(shè)備的功能或特性分為多個(gè)組。如果應(yīng)用已在相同權(quán)限組中被授予另一危險(xiǎn)權(quán)限,系統(tǒng)將立即授予該權(quán)限,如READ_CONTACTS和WRITE_CONTACTS。

SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 由于其特殊性,其申請(qǐng)方式與其它權(quán)限都不同。

其授予流程如下:

(關(guān)于 AppOpsManager 是什么可以參考: )

這里簡(jiǎn)要分析下ActivityCompat#requestPermissions的流程:

更詳細(xì)的權(quán)限授予流程源碼分析可以參考:

普通權(quán)限: 清單文件中聲明即可。

危險(xiǎn)權(quán)限: 方式一: pm grant application_package android.permission.CHANGE_CONFIGURATION 方式二:appops set application_package permission_num 0/1

appops可以授予的權(quán)限參考 android.app.AppOpsManager 中的聲明

系統(tǒng)簽名權(quán)限: 方式一:將app遷移到system/priv-app目錄中。 方式二:看不懂,參考

android 4.4 訪問sd卡需要申請(qǐng)權(quán)限。 您的應(yīng)用在 Android 4.4 上運(yùn)行時(shí)無(wú)法讀取外部存儲(chǔ)空間上的共享文件,除非您的應(yīng)用具有 READ_EXTERNAL_STORAGE 權(quán)限。也就是說,沒有此權(quán)限,您無(wú)法再訪問 getExternalStoragePublicDirectory() 返回的目錄中的文件。但是,如果您僅需要訪問 getExternalFilesDir() 提供的您的應(yīng)用特有目錄,那么,您不需要 READ_EXTERNAL_STORAGE `權(quán)限。

android 6.0 運(yùn)行時(shí)權(quán)限。 此版本引入了一種新的權(quán)限模式,如今,用戶可直接在運(yùn)行時(shí)管理應(yīng)用權(quán)限。這種模式讓用戶能夠更好地了解和控制權(quán)限,同時(shí)為應(yīng)用開發(fā)者精簡(jiǎn)了安裝和自動(dòng)更新過程。用戶可為所安裝的各個(gè)應(yīng)用分別授予或撤銷權(quán)限。 對(duì)于以 Android 6.0(API 級(jí)別 23)或更高版本為目標(biāo)平臺(tái)的應(yīng)用,請(qǐng)務(wù)必在運(yùn)行時(shí)檢查和請(qǐng)求權(quán)限。要確定您的應(yīng)用是否已被授予權(quán)限,請(qǐng)調(diào)用新增的 checkSelfPermission() 方法。要請(qǐng)求權(quán)限,請(qǐng)調(diào)用新增的 requestPermissions() 方法。即使您的應(yīng)用并不以 Android 6.0(API 級(jí)別 23)為目標(biāo)平臺(tái),您也應(yīng)該在新權(quán)限模式下測(cè)試您的應(yīng)用。 如需了解有關(guān)在您的應(yīng)用中支持新權(quán)限模式的詳情,請(qǐng)參閱 使用系統(tǒng)權(quán)限 。如需了解有關(guān)如何評(píng)估新模式對(duì)應(yīng)用的影響的提示,請(qǐng)參閱 權(quán)限最佳做法 。

android 7.+ 應(yīng)用間共享文件要使用FileProvider。 對(duì)于面向 Android 7.0 的應(yīng)用,Android 框架執(zhí)行的 StrictMode API 政策禁止在您的應(yīng)用外部公開 。如果一項(xiàng)包含文件 URI 的 intent 離開您的應(yīng)用,則應(yīng)用出現(xiàn)故障,并出現(xiàn) FileUriExposedException 異常。 要在應(yīng)用間共享文件,您應(yīng)發(fā)送一項(xiàng) content:// URI,并授予 URI 臨時(shí)訪問權(quán)限。進(jìn)行此授權(quán)的最簡(jiǎn)單方式是使用 FileProvider `類。如需了解有關(guān)權(quán)限和共享文件的詳細(xì)信息,請(qǐng)參閱 共享文件 。

android 8.+

同一權(quán)限組的權(quán)限在被授予了之后也需要顯式的再申請(qǐng)一次。

在 Android 8.0 之前,如果應(yīng)用在運(yùn)行時(shí)請(qǐng)求權(quán)限并且被授予該權(quán)限,系統(tǒng)會(huì)錯(cuò)誤地將屬于同一權(quán)限組并且在清單中注冊(cè)的其他權(quán)限也一起授予應(yīng)用。 對(duì)于針對(duì) Android 8.0 的應(yīng)用,此行為已被糾正。系統(tǒng)只會(huì)授予應(yīng)用明確請(qǐng)求的權(quán)限。然而,一旦用戶為應(yīng)用授予某個(gè)權(quán)限,則所有后續(xù)對(duì)該權(quán)限組中權(quán)限的請(qǐng)求都將被自動(dòng)批準(zhǔn)。 例如,假設(shè)某個(gè)應(yīng)用在其清單中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 。應(yīng)用請(qǐng)求 READ_EXTERNAL_STORAGE ,并且用戶授予了該權(quán)限。如果該應(yīng)用針對(duì)的是 API 級(jí)別 24 或更低級(jí)別,系統(tǒng)還會(huì)同時(shí)授予 WRITE_EXTERNAL_STORAGE ,因?yàn)樵摍?quán)限也屬于同一 STORAGE 權(quán)限組并且也在清單中注冊(cè)過。如果該應(yīng)用針對(duì)的是 Android 8.0,則系統(tǒng)此時(shí)僅會(huì)授予 READ_EXTERNAL_STORAGE ;不過,如果該應(yīng)用后來又請(qǐng)求 WRITE_EXTERNAL_STORAGE ,則系統(tǒng)會(huì)立即授予該權(quán)限,而不會(huì)提示用戶。

android 9

隱私權(quán)限變更。

為了增強(qiáng)用戶隱私,Android 9 引入了若干行為變更,如限制后臺(tái)應(yīng)用訪問設(shè)備傳感器、限制通過 Wi-Fi 掃描檢索到的信息,以及與通話、手機(jī)狀態(tài)和 Wi-Fi 掃描相關(guān)的新權(quán)限規(guī)則和權(quán)限組。

android 10

隱私權(quán)變更。

外部存儲(chǔ)訪問權(quán)限范圍限定為應(yīng)用文件和媒體,在后臺(tái)運(yùn)行時(shí)訪問設(shè)備位置信息需要權(quán)限,針對(duì)從后臺(tái)啟動(dòng) Activity 的限制等。

android 11

隱私權(quán)限變更。

更詳細(xì)的版本變更請(qǐng)參考

聊聊Android6.0 以上系統(tǒng)權(quán)限

一個(gè)新建的Android應(yīng)用默認(rèn)是沒有權(quán)限的,這意味著它不能執(zhí)行任何可能對(duì)用戶體驗(yàn)有不利影響的操作或者訪問設(shè)備數(shù)據(jù)。為了使用受保護(hù)的功能,你必須包含一個(gè)或者多個(gè)標(biāo)簽在你的app manifest中。

1、Android 6.0中權(quán)限分為兩種,普通權(quán)限和危險(xiǎn)權(quán)限(即運(yùn)行時(shí)權(quán)限,下面統(tǒng)稱運(yùn)行時(shí)權(quán)限)。

1.1普通權(quán)限

如果你的應(yīng)用manifest中只申明了普通權(quán)限(也就是說,這些權(quán)限對(duì)于用戶隱私和設(shè)備操作不會(huì)造成太多危險(xiǎn)),系統(tǒng)會(huì)自動(dòng)授予這些權(quán)限。

1.2運(yùn)行時(shí)權(quán)限

如果你的應(yīng)用manifest中聲明了運(yùn)行時(shí)權(quán)限(也就是說,這些權(quán)限可能會(huì)影響用戶隱私和設(shè)備的普通操作),系統(tǒng)會(huì)明確的讓用戶決定是否授予這些權(quán)限。系統(tǒng)請(qǐng)求用戶授予這些權(quán)限的方式是由當(dāng)前應(yīng)用運(yùn)行的系統(tǒng)版本來決定的。

1.2.1 Android6.0及以上的系統(tǒng)

如果你的設(shè)備運(yùn)行的是Android6.0(API level 23)及以上的系統(tǒng),并且你的應(yīng)用的targetSdkVersion也是23或者更高,那么應(yīng)用向用戶請(qǐng)求這些權(quán)限是實(shí)時(shí)的。這意味著用戶可以隨時(shí)取消 這些運(yùn)行時(shí)權(quán)限的授權(quán)。所以應(yīng)用在每次需要用到這些運(yùn)行時(shí)權(quán)限的時(shí)候都需要去檢查是否還有這些權(quán)限的授權(quán)。

1.2.2 Android 5.1及以下的系統(tǒng)

如果你的設(shè)備運(yùn)行在Android5.1(API level 22)及以下的系統(tǒng)中,或者你的app的targetSdkVersion是22或者更低。系統(tǒng)會(huì)請(qǐng)求用戶在apk安裝的時(shí)候授予這些權(quán)限。

如果你的應(yīng)用更新的時(shí)候添加了一個(gè)權(quán)限,系統(tǒng)會(huì)在用戶更新應(yīng)用的時(shí)候請(qǐng)求用戶授予這個(gè)權(quán)限 , 一旦用戶安裝了這個(gè)應(yīng)用,唯一可以取消授權(quán)的方式就是卸載掉這個(gè)應(yīng)用。 注意這句話的意思,想一下如果app的targetSdkVersion是22或者以下,但是運(yùn)行在Android6.0及以上的設(shè)備中會(huì)有什么問題?后面會(huì)分析這個(gè)問題 。

常常來說一個(gè)授權(quán)失敗會(huì)拋出SecurityException,然而這并不是在 所有情況下都會(huì)發(fā)生。比如,發(fā)送一個(gè)廣播去檢查授權(quán)(SendBroadcast(Intent)),數(shù)據(jù)會(huì)被發(fā)送給所有接收者,但是當(dāng)這個(gè)方法的請(qǐng)求返 回的時(shí)候,你不會(huì)收到任何一個(gè)因?yàn)槭跈?quán)失敗拋出的異常,其實(shí)在大多數(shù)情況下,授權(quán)失敗只會(huì)打印系統(tǒng)日志。

1.3自動(dòng)權(quán)限調(diào)整

簡(jiǎn)單的說,如果你的app targetSdkVersion是3,而你當(dāng)前運(yùn)行的系統(tǒng)版本是4,那么在android version 4 中新添加的權(quán)限會(huì)自動(dòng)添加到你的app中。

比如 WRITE_EXTERNAL_STORAGE權(quán)限是在api 4的時(shí)候添加的,而你的應(yīng)用的targetSdkVersion是3,那么這個(gè)權(quán)限會(huì)自動(dòng)添加到你的應(yīng)用中。而且在官方商店上這個(gè)權(quán)限也會(huì)列出來(盡管可能你并不需要這個(gè)權(quán)限)。

所以建議經(jīng)常更新你的targetSdkVersion到最新版本。

下面來回答上面的那個(gè)問題,如果app的targetSdkVersion是22或者以下,但是運(yùn)行在android 6.0或以上版本的手機(jī)中,會(huì)發(fā)生什么?

安裝過程中,會(huì)一起請(qǐng)求用戶授予所有 權(quán)限,如果用戶拒絕,將不能安裝這個(gè)app,只有用戶全部同意這些授權(quán),才能安裝這個(gè)應(yīng)用,但是問題來了,安裝好了這個(gè)應(yīng)用之后,android6.0以 上的系統(tǒng)中,用戶是可以去設(shè)置中取消授權(quán)的,而且是隨時(shí)都可以取消,所以很多運(yùn)行時(shí)權(quán)限可能也得不到,目前官方的做法是,如果用戶取消該項(xiàng)授權(quán),那么依賴 該項(xiàng)授權(quán)的方法的返回值為null,所以你的app可能會(huì)報(bào)空指針異常。以后是否會(huì)針對(duì)22以下的app做改變還不得而知,畢竟crash是很難讓人接受 的,但是crash是由用戶造成的,用戶應(yīng)該也可以理解。

2、普通權(quán)限和運(yùn)行時(shí)權(quán)限

系統(tǒng)權(quán)限會(huì)被傳遞給兩種不同的保護(hù)級(jí)別,我們所知道這兩種最重要的保護(hù)級(jí)別就是普通權(quán)限和運(yùn)行時(shí)權(quán)限。

2.1 普通權(quán)限

普通權(quán)限的覆蓋區(qū)域是在你的app需要訪問沙盒以外的數(shù)據(jù)和資源的時(shí)候,但是對(duì)用戶隱私和其他app的操作只有很少的影響,比如開啟手電筒的權(quán)限。這個(gè)時(shí)候,系統(tǒng)會(huì)自動(dòng)授權(quán)這些普通權(quán)限。

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_INSTALL_PACKAGES

SET_ALARM

SET_TIME_ZONE

SET_WALLPAPER

SET_WALLPAPER_HINTS

TRANSMIT_IR

UNINSTALL_SHORTCUT

USE_FINGERPRINT

VIBRATE

WAKE_LOCK

WRITE_SYNC_SETTINGS

2.2 運(yùn)行時(shí)權(quán)限

運(yùn)行時(shí)權(quán)限的覆蓋區(qū)域是你的app想要的數(shù)據(jù)和資源涉及用戶的隱私信息,或者是可能潛在的影響用戶的存儲(chǔ)數(shù)據(jù)或者其他app的操作。比如,請(qǐng)求獲取用戶聯(lián)系人信息的權(quán)限。如果一個(gè)app申明了運(yùn)行時(shí)權(quán)限,用戶必須明確的授權(quán)這些權(quán)限給app。

2.3 權(quán)限組

所有的運(yùn)行時(shí)權(quán)限都屬于對(duì)應(yīng)的權(quán)限組,如果你的app運(yùn)行在android6.0及以上系統(tǒng),下面的規(guī)則都適用:

2.3.1?如果一個(gè)app在manifest中請(qǐng)求了一個(gè)運(yùn)行時(shí)權(quán)限,而且app還沒有得到這個(gè)運(yùn)行時(shí)權(quán)限所在的權(quán)限組中的任何一個(gè)運(yùn)行時(shí)權(quán)限授權(quán),那么系統(tǒng)會(huì)彈出一個(gè)對(duì)話框,描述app想要訪問的運(yùn)行時(shí)權(quán)限的權(quán)限組,這個(gè)對(duì)話框不會(huì)描述這個(gè)權(quán)限組中某一個(gè)特定的權(quán)限。比如,你的app想要請(qǐng)求READ_CONTACT權(quán)限,對(duì)話框只會(huì)描述app想要請(qǐng)求設(shè)備的聯(lián)系人,如果用戶授權(quán)通過,系統(tǒng)會(huì)授予app所請(qǐng)求的該項(xiàng)權(quán)限。

2.3.2?如果一個(gè)app在manifest中請(qǐng)求一個(gè)運(yùn)行時(shí)權(quán)限,并且這個(gè)app已經(jīng)在相同的權(quán)限組中有了另一個(gè)運(yùn)行時(shí)權(quán)限的授權(quán),那么系統(tǒng)不會(huì)彈出對(duì)話框,而是會(huì)立即授予app該項(xiàng)運(yùn)行時(shí)權(quán)限的授權(quán)。比如,一個(gè)app之前請(qǐng)求過一個(gè)READ_CONTACT的權(quán)限并且被授權(quán)通過,之后又請(qǐng)求一個(gè)WRITE_CONTACT(在同一個(gè)權(quán)限組)權(quán)限,那么系統(tǒng)會(huì)自動(dòng)授予該權(quán)限。

其實(shí)所有權(quán)限(普通權(quán)限、運(yùn)行時(shí)權(quán)限、用戶自定義權(quán)限)都屬于特定的權(quán)限組,但是只有運(yùn)行時(shí)權(quán)限的權(quán)限組才會(huì)影響用戶體驗(yàn)。

2.3.3運(yùn)行時(shí)權(quán)限組和權(quán)限組列表

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

可以通過adb shell pm list permissions -d -g進(jìn)行查看。

看到上面的dangerous permissions,會(huì)發(fā)現(xiàn)一個(gè)問題,好像危險(xiǎn)權(quán)限都是一組一組的,恩,沒錯(cuò),的確是這樣的,那么有個(gè)問題:分組對(duì)我們的權(quán)限機(jī)制有什么影響嗎?的確是有影響的,如果app運(yùn)行在Android 6.x的機(jī)器上,對(duì)于授權(quán)機(jī)制是這樣的。如果你申請(qǐng)某個(gè)危險(xiǎn)的權(quán)限,假設(shè)你的app早已被用戶授權(quán)了 同一組 的某個(gè)危險(xiǎn)權(quán)限,那么系統(tǒng)會(huì)立即授權(quán),而不需要用戶去點(diǎn)擊授權(quán)。比如你的app對(duì)READ_CONTACTS已經(jīng)授權(quán)了,當(dāng)你的app申請(qǐng)WRITE_CONTACTS時(shí),系統(tǒng)會(huì)直接授權(quán)通過。此外,對(duì)于申請(qǐng)時(shí)彈出的dialog上面的文本說明也是對(duì)整個(gè)權(quán)限組的說明,而不是單個(gè)權(quán)限(ps:這個(gè)dialog是不能進(jìn)行定制的)。不過需要注意的是,不要對(duì)權(quán)限組過多的依賴,盡可能對(duì)每個(gè)危險(xiǎn)權(quán)限都進(jìn)行正常流程的申請(qǐng),因?yàn)樵诤笃诘陌姹局羞@個(gè)權(quán)限組可能會(huì)產(chǎn)生變化。

3、相關(guān)API

3.1 在AndroidManifest文件中添加需要的權(quán)限。

這個(gè)步驟和我們之前的開發(fā)并沒有什么變化,試圖去申請(qǐng)一個(gè)沒有聲明的權(quán)限可能會(huì)導(dǎo)致程序崩潰。

3.2 檢查權(quán)限

if (ContextCompat.checkSelfPermission(thisActivity,

Manifest.permission.READ_CONTACTS)

!= PackageManager.PERMISSION_GRANTED) {

}else{

//

}

這里涉及到一個(gè)API,ContextCompat.checkSelfPermission,主要用于檢測(cè)某個(gè)權(quán)限是否已經(jīng)被授予,方法返回值為PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。當(dāng)返回DENIED就需要進(jìn)行申請(qǐng)授權(quán)了

3.3 申請(qǐng)授權(quán)

ActivityCompat.requestPermissions(thisActivity,

new String[]{Manifest.permission.READ_CONTACTS},

MY_PERMISSIONS_REQUEST_READ_CONTACTS);

該方法是異步的,第一個(gè)參數(shù)是Context;第二個(gè)參數(shù)是需要申請(qǐng)的權(quán)限的字符串?dāng)?shù)組;第三個(gè)參數(shù)為requestCode,主要用于回調(diào)的時(shí)候檢測(cè)。可以從方法名requestPermissions以及第二個(gè)參數(shù)看出,是支持一次性申請(qǐng)多個(gè)權(quán)限的,系統(tǒng)會(huì)通過對(duì)話框 逐一 詢問用戶是否授權(quán)。

3.4 處理權(quán)限申請(qǐng)回調(diào)

@Override

publicvoidonRequestPermissionsResult(intrequestCode,

String permissions[],int[] grantResults) {

switch(requestCode) {

case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {

// If request is cancelled, the result arrays are empty.

if(grantResults.length 0 grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted, yay! Do the contacts-related task you need to do.

}else{

// permission denied, boo! Disable the functionality that depends on this permission.

}

return;

}

}

}

ok,對(duì)于權(quán)限的申請(qǐng)結(jié)果,首先驗(yàn)證requestCode定位到你的申請(qǐng),然后驗(yàn)證grantResults對(duì)應(yīng)于申請(qǐng)的結(jié)果,這里的數(shù)組對(duì)應(yīng)于申請(qǐng)時(shí)的第二個(gè)權(quán)限字符串?dāng)?shù)組。如果你同時(shí)申請(qǐng)兩個(gè)權(quán)限,那么grantResults的length就為2,分別記錄你兩個(gè)權(quán)限的申請(qǐng)結(jié)果。如果申請(qǐng)成功,就可以做你的事情了!

那么將上述幾個(gè)步驟結(jié)合到一起就是:

// Here, thisActivity is the current activity

if (ContextCompat.checkSelfPermission(thisActivity,

Manifest.permission.READ_CONTACTS)

!= PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,

Manifest.permission.READ_CONTACTS)) {

// Show an expanation to the user *asynchronously* -- don't block

// this thread waiting for the user's response! After the user

// sees the explanation, try again to request the permission.

} else {

// No explanation needed, we can request the permission.

ActivityCompat.requestPermissions(thisActivity,

new String[]{Manifest.permission.READ_CONTACTS},

MY_PERMISSIONS_REQUEST_READ_CONTACTS);

// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an

// app-defined int constant. The callback method gets the

// result of the request.

}

}

謝幕,至此有關(guān)于android6.0 以上權(quán)限相關(guān)的內(nèi)容已經(jīng)詳細(xì)講完了!


文章標(biāo)題:android系統(tǒng)權(quán)限,安卓系統(tǒng)軟件權(quán)限設(shè)置
轉(zhuǎn)載源于:http://fisionsoft.com.cn/article/dsdgcjh.html