Android6.0权限管理
在Android6.0棉花糖,app将不会在安装的时候授予权限。 取而代之的是, app不得不在运行时一个一个询问用户授予权限。并且这些询问用户是否授予权限的弹框必须由开发者在使用API之前来主动调用。
注意权限询问对话框不会自己弹出来。 开发者不得不自己调用。 如果开发者要调用的一些函数需要某权限而用户又拒绝授权的话, 函数将
抛出异常直接导致程序崩溃。
如果项目targetSDKVersion>23,当使用需要下列权限的API之前就需要写个方法检查有没有权限。否则当没有权限时直接调用API程序就会崩溃。
Permission Group | Permission |
---|---|
android.permission-group.CONTACTS | permission:android.permission.WRITE_CONTACTS |
permission:android.permission.GET_ACCOUNTS | |
permission:android.permission.READ_CONTACTS | |
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 | |
android.permission-group.CALENDAR | permission:android.permission.READ_CALENDAR |
permission:android.permission.WRITE_CALENDAR | |
android.permission-group.CAMERA | permission:android.permission.CAMERA |
android.permission-group.SENSORS | permission:android.permission.BODY_SENSORS |
android.permission-group.LOCATION | permission:android.permission.ACCESS_FINE_LOCATION |
permission:android.permission.ACCESS_COARSE_LOCATION | |
android.permission-group.STORAGE | permission:android.permission.READ_EXTERNAL_STORAGE |
permission:android.permission.WRITE_EXTERNAL_STORAGE | |
android.permission-group.MICROPHONE | permission:android.permission.RECORD_AUDIO |
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 |
app在调用API前请求相应权限例子(插入新联系人):
首先写一下联系人权限检测方法:
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
private void insertDummyContactWrapper() {
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
//向手机写入联系人
insertDummyContact();
}
向手机写入联系人方法
private static final String TAG = "Contacts";
private void insertDummyContact() {
// Two operations are needed to insert a new contact.
Toast.makeText(this,"insertDummy",Toast.LENGTH_SHORT).show();
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(2);
// First, set up a new raw contact.
Builder op =
newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null);
operations.add(op.build());
// Next, set the name for the contact.
op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
"__DUMMY CONTACT from runtime permissions sample");
operations.add(op.build());
// Apply the operations.
ContentResolver resolver = getContentResolver();
try {
resolver.applyBatch(ContactsContract.AUTHORITY, operations);
} catch (RemoteException e) {
Log.d(TAG, "Could not add a new contact: " + e.getMessage());
} catch (OperationApplicationException e) {
Log.d(TAG, "Could not add a new contact: " + e.getMessage());
}
}
接收用户对请求权限弹窗的处理结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
insertDummyContact();
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
.show();
}break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}