Android 6.0之前,只有在app第一次安裝的時候纔會詢問用戶一次(之後不再詢問了),這樣很容易致使app安裝後給用戶帶來的危險行爲.而在6.0之後,當app須要咱們授予不恰當的權限的時候,咱們能夠予以拒絕.html
首先強調一點,必須是用android
compileSdkVersion >= 23
不然並不須要對權限進行任何處理git
舉個例子, 點擊上面那個button按鈕的時候會調用撥打電話這個功能,()github
Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:" + "110); intent.setData(data); startActivity(intent);
撥打電話這權限是Dangerous Permissions, 若是在6.0之前的系統中,因爲用戶第一次安裝的時候已經默認勾選了全部所須要的權限,因此正常執行. 可6.0後, 由於撥打電話是一個Dangerous Permissions,根據安卓6.0規定,咱們必須對權限進行適配,適配後當用戶第一次點擊頂部的button按鈕後會彈出以上圖片的權限申請適配的dialog, 只有用戶勾選"容許"選項後纔可以直接撥打電話.網絡
新的權限機制更好的保護了用戶的隱私,Google將權限分爲兩類,一類是Normal Permissions,這類權限通常不涉及用戶隱私,是不須要用戶進行受權的,好比手機震動、訪問網絡等;另外一類是Dangerous Permission,通常是涉及到用戶隱私的,須要用戶進行受權,好比讀取sdcard、訪問通信錄等. app
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_BROADCASTSui
Android 6.0 權限申請權限步驟以下:this
1 和之前同樣,首先在AndroidManifest 中進行註冊;orm
2 檢查權限, 好比上面點擊button按鈕進行撥打電話時 咱們先檢查權限:
ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED)
3 申請權限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { // 沒有授予權限,進行申請權限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE); }else{ // 用戶已經申請過了權限,直接撥打電話 Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:" + "10086"); intent.setData(data); startActivity(intent); }
4 申請權限的回調:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == CALL_PHONE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { callPhone(); } else { // 拒絕權限 Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
詳細代碼:
public class MainActivity extends AppCompatActivity { private static final int CALL_PHONE = 1 ; private Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt = (Button) findViewById(R.id.bt); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { callPhone(); } }); } public void callPhone() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE); }else{ Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:" + "10086"); intent.setData(data); startActivity(intent); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == CALL_PHONE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { callPhone(); } else { // 拒絕權限 Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
其實權限適配很簡單,就這麼幾個簡單的步驟,不過寫起來會比較複雜,有不少重複的代碼,這裏推薦鴻陽大神的一個開源庫 https://github.com/hongyangAndroid/MPermissions.