2017-3-24
對(duì)于有的手機(jī)在第一次安裝 app 時(shí),會(huì)自動(dòng)彈出權(quán)限請(qǐng)求嵌溢;但有的卻不會(huì)弥虐,例如 android 6.0 系統(tǒng)漓踢。
[1] 需求--做一個(gè)例如下圖的權(quán)限請(qǐng)求
自定義的包涵多個(gè)權(quán)限請(qǐng)求
一般一個(gè) app 有多種權(quán)限請(qǐng)求,基本的包括WRITE_EXTERNAL_STORAGE疚颊、WRITE_CONTACTS狈孔、READ_PHONE_STATE等。下面以請(qǐng)求CAMERA材义、WRITE_EXTERNAL_STORAGE均抽、WRITE_CONTACTS為例。
單獨(dú)的權(quán)限請(qǐng)求
[2] 實(shí)現(xiàn)過程
[2.1] 在 Manifest 文件中添加你需要申請(qǐng)的權(quán)限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
[2.2] 在 Activity 中
final private int MY_PERMISSIONS_REQUEST_READ_CONTACTS=124;
private static final String TAGLOG = "Contacts";
private void insertDummyContact() {
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(2);
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null);
operations.add(op.build());
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());
ContentResolver resolver = getContentResolver();
try {
resolver.applyBatch(ContactsContract.AUTHORITY, operations);
} catch (RemoteException e) {
} catch (OperationApplicationException e) {
}
}
private void insertDummyContactWrapper() {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.CAMERA))
permissionsNeeded.add("Camera");
if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE))
permissionsNeeded.add("Storage");
if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))
permissionsNeeded.add("Write Contacts");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
String message = "You need to grant access to " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(StartActivity.this,permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
});
return;
}
ActivityCompat.requestPermissions(StartActivity.this,permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
return;
}
insertDummyContact();
}
private boolean addPermission(List<String> permissionsList, String permission) {
int hasWriteContactsPermission = ContextCompat.checkSelfPermission(StartActivity.this,
Manifest.permission.CAMERA);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
if (!ActivityCompat.shouldShowRequestPermissionRationale(StartActivity.this,permission))
return false;
}
return true;
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(StartActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
@Overrid
public void onRequestPermissionsResult(int requestCode,String permissions[],int[]grantResults){
switch(requestCode){
case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
{
Map<String, Integer> perms = new HashMap<String, Integer>();
perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED);
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
insertDummyContact();
} else {
Toast.makeText(StartActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
.show();
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
[2.3]記得在 onCreate() 方法下調(diào)用哦
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start)其掂;
insertDummyContactWrapper();
L.d(TAG,"請(qǐng)求權(quán)限");
}
[3] 分享
最近看了一本書--《柴靜的氣場(chǎng)法則》油挥,沒有看《看見》時(shí)的那種心跳的感覺,但卻有平淡中的強(qiáng)大力量款熬。喜歡書中的這樣一句話
內(nèi)心獨(dú)立深寥,倔強(qiáng)生長