Android6.0以后府树,為了更好的保護(hù)用戶隱私俐末,谷歌添加了運(yùn)行時(shí)權(quán)限機(jī)制。在6.0以前奄侠,我們安裝APP的時(shí)候卓箫,都需要接受一大堆權(quán)限。在6.0以后垄潮,谷歌規(guī)定危險(xiǎn)權(quán)限需要在使用APP的時(shí)候根據(jù)用戶自身需要進(jìn)行手動(dòng)授權(quán)烹卒。
在6.0以后闷盔,主要有兩類權(quán)限。一類是Normal Permissions旅急,這類權(quán)限不涉及個(gè)人隱私逢勾,不需要用戶進(jìn)行授權(quán),比如手機(jī)震動(dòng)坠非,訪問(wèn)網(wǎng)絡(luò)敏沉;一類是Dangerous Permissions,這類權(quán)限涉及個(gè)人隱私炎码,需要用戶進(jìn)行授權(quán)盟迟,比如讀取SD卡,訪問(wèn)通訊錄等潦闲。在用戶操作方面:當(dāng)執(zhí)行敏感操作之前彈出對(duì)話框攒菠,請(qǐng)求權(quán)限,可以拒絕歉闰,可以同意辖众;可以在設(shè)置頁(yè)面對(duì)APP的權(quán)限進(jìn)行查看,以及對(duì)單個(gè)權(quán)限進(jìn)行授權(quán)或者解除授權(quán)和敬。
下面是這兩種權(quán)限的詳細(xì)列表凹炸。
NormalPermissions
WRITE_SYNC_SETTINGS 寫(xiě)同步設(shè)置
WAKE_LOCK 喚醒鎖
VIBRATE 顫動(dòng)
USE FINGERPRINT 使用指紋
UNINSTALL_SHORTCUT 卸載快捷方式
TRANSMIT_IR 紅外傳輸
SET_WALLPAPER_HINTS 壁紙?jiān)O(shè)置提示
SET_WALLPAPER 設(shè)置壁紙
SET_TIME_ZONE 設(shè)置時(shí)區(qū)
SET_ALARM 設(shè)置鬧鐘
REQUEST_INSTALL_PACKAGES 請(qǐng)求安裝包
REORDER_TASKS 重新排序的任務(wù)
RECEIVE_BOOT_COMPLETED 收到啟動(dòng)完成
READ_SYNC_STATS 讀同步數(shù)據(jù)
NFC
MODIFY_AUDIO_SETTINGS 修改音頻設(shè)置
KILL_BACKGROUND_PROCESSES 殺死后臺(tái)進(jìn)程
INTERNET 網(wǎng)絡(luò)
INSTALL_SHORTCUT 安裝快捷方式
GET PACKAGE SIZE 得到包的大小
EXPAND_STATUS_BAR 擴(kuò)大狀態(tài)欄
DISABLE_KEYGUARD 禁用鍵盤(pán)守衛(wèi)
CHANGE_WIFI_STATE 更改無(wú)限網(wǎng)絡(luò)狀態(tài)
CHANGE_WIFI_MULTICAST_STATE 改變無(wú)限多播狀態(tài)
CHANGE_NETWORK_STATE 改變網(wǎng)絡(luò)狀態(tài)
BROADCAST_STICKY 粘性廣播
BLUETOOTH_ADMIN 藍(lán)牙管理
BLUETOOTH 藍(lán)牙技術(shù)
ACCESS_WIFI_STATE 訪問(wèn)無(wú)限網(wǎng)絡(luò)狀態(tài)
ACCESS_NOTIFICATION_POLICY 訪問(wèn)通知策略
ACCESS_NETWORK_STATE 訪問(wèn)網(wǎng)絡(luò)狀態(tài)
ACCESS_LOCATION_EXTRA_COMMANDS 訪問(wèn)地點(diǎn)額外的命令
Dangerous Permissions(9組24個(gè)):
group:android.permission-group.CONTACTS 通訊錄方面
permission:android.permission.WRITE_CONTACTS 寫(xiě)入通訊錄
permission:android.permission.GET_ACCOUNTS 訪問(wèn)通訊錄權(quán)限
permission:android.permission.READ_CONTACTS 讀取通訊錄
group:android.permission-group.PHONE 電話方面
permission:android.permission.READ_CALL_LOG 看電話記錄
permission:android.permission.READ_PHONE_STATE 讀取手機(jī)狀態(tài)
permission:android.permission.CALL_PHONE 打電話
permission:android.permission.WRITE_CALL_LOG 編寫(xiě)調(diào)用日志
permission:android.permission.USE_SIP 使用SIP
permission:android.permission.PROCESS_OUTGOING_CALLS 過(guò)程輸出調(diào)用 permission:com.android.voicemail.permission.ADD_VOICEMAIL 添加語(yǔ)音信箱
group:android.permission-group.CALENDAR 日歷
permission:android.permission.READ_CALENDAR 讀取日歷
permission:android.permission.WRITE_CALENDAR 寫(xiě)入日歷
group:android.permission-group.CAMERA 照相機(jī)
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 存儲(chǔ)
permission:android.permission.READ_EXTERNAL_STORAGE 讀取外部存儲(chǔ)器
permission:android.permission.WRITE_EXTERNAL_STORAGE 寫(xiě)外部存儲(chǔ)器
group:android.permission-group.MICROPHONE 擴(kuò)音器;麥克風(fēng)
permission:android.permission.RECORD_AUDIO 錄音
group:android.permission-group.SMS 信息
permission:android.permission.READ_SMS 讀取信息
permission:android.permission.RECEIVE_WAP_PUSH 收到WAP推送
permission:android.permission.RECEIVE_MMS 接收彩信
permission:android.permission.RECEIVE_SMS 收信息
permission:android.permission.SEND_SMS 發(fā)信息
permission:android.permission.READ_CELL_BROADCASTS 讀細(xì)胞廣播
注:Dangerous Permissions 列表的權(quán)限是有分組的昼弟。
當(dāng)申請(qǐng)某個(gè)危險(xiǎn)權(quán)限的時(shí)候啤它,假如早已經(jīng)對(duì)同一組權(quán)限里面的某個(gè)權(quán)限進(jìn)行了授權(quán),那么系統(tǒng)會(huì)立即授權(quán)舱痘,而不需要再次點(diǎn)擊授權(quán)变骡。不過(guò)需要注意的是,不要對(duì)權(quán)限組過(guò)多的依賴芭逝,盡可能對(duì)每個(gè)危險(xiǎn)權(quán)限都進(jìn)行正常流程的申請(qǐng)塌碌,因?yàn)樵诤笃诘陌姹局羞@個(gè)權(quán)限組可能會(huì)產(chǎn)生變化。
Demo
package apps.gzgi.com.android6permission;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity{
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.call);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
call();
}
}
});
}
private void call(){
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
代碼中模擬了打電話旬盯,首先判斷用戶是不是已經(jīng)給我們授權(quán)了台妆,借助的是ContextCompat.checkSelfPermission方法。方法接收兩個(gè)參數(shù)胖翰,第一個(gè)參數(shù)是Context频丘,第二個(gè)參數(shù)是具體的權(quán)限名Manifest.permission.CALL_PHONE,然后使用方法的返回值和PackageManager.PERMISSION_GRANTED(權(quán)限準(zhǔn)許)做比較泡态,相等則表示已經(jīng)授權(quán)搂漠,不相等表示沒(méi)有授權(quán)。
已經(jīng)授權(quán)就去執(zhí)行撥打電話的操作某弦,沒(méi)有授權(quán)則借助ActivityCompat.requestPermissions方法向客戶申請(qǐng)授權(quán)桐汤,接收三個(gè)參數(shù)而克,第一個(gè)參數(shù)是Activity的實(shí)例,第二個(gè)參數(shù)是一個(gè)String數(shù)組怔毛,我們把要申請(qǐng)的權(quán)限名放在數(shù)組中即可员萍,第三個(gè)參數(shù)是請(qǐng)求碼,只要唯一值就可以了拣度,這里傳入了1碎绎。
調(diào)用完了ActivityCompat.requestPermissions方法之后,系統(tǒng)會(huì)彈出一個(gè)權(quán)限申請(qǐng)的對(duì)話框抗果,然后用戶可以選擇同意或者拒絕我們的權(quán)限申請(qǐng)筋帖。不管選擇哪個(gè),都會(huì)調(diào)用onRequestPermissionsResult方法冤馏,授權(quán)的結(jié)果會(huì)封裝在grantResults參數(shù)當(dāng)中日麸,grantResults中存放的就是我們的申請(qǐng)權(quán)限時(shí)數(shù)組里面的內(nèi)容:new String[]{Manifest.permission.CALL_PHONE},如果grantResults的長(zhǎng)度大于0逮光,并且其中的權(quán)限等于PackageManager.PERMISSION_GRANTED代箭,那就表示授權(quán)成功。
那這里我們只需要判斷一下授權(quán)結(jié)果就可以了涕刚,如果用戶同意則調(diào)用call方法撥打電話嗡综,如果不同意就彈出一個(gè)失敗的提示即可。如果我們對(duì)剛才同意的權(quán)限后悔了杜漠,只需要在設(shè)置-應(yīng)用程序-權(quán)限管理里面去除我們想刪除的權(quán)限即可极景。