普通权限(不用在用的的地方动态申请)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
危险权限(安卓6.0及之后需要动态请求)Dangerous Permissions:
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
1、Activity中动态申请权限
//定位动态申请权限
private boolean gpsPermission() {
if (ContextCompat.checkSelfPermission(MyActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//只是拒绝
if (ActivityCompat.shouldShowRequestPermissionRationale(MyActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)) {
ActivityCompat.requestPermissions(MyActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 2);// 动态请求权限
} else {//拒绝后不再询问
DialogUtils.showDialog(MyActivity.this, "权限提醒", "由于无法获取定位权限,不能正常使用此功能,请到以下路径进行设置:\n设置->应用名称->权限", "去设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
PermissionUtil.openSetting(MyActivity.this);
}
});//该功能需要获取定位权限,
}
return false;
}
return true;
}
//通讯录动态申请权限
private boolean directoriesPermission() {
if (ContextCompat.checkSelfPermission(MyActivity.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
//只是拒绝
if (ActivityCompat.shouldShowRequestPermissionRationale(MyActivity.this, Manifest.permission.READ_CONTACTS)) {
ActivityCompat.requestPermissions(MyActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 1);// 动态请求权限
} else {//拒绝后不再询问
DialogUtils.showDialog(MyActivity.this, "权限提醒", "由于无法获取读取通讯录权限,不能正常使用此功能,请到以下路径进行设置:\n设置->应用名称->权限", "去设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
PermissionUtil.openSetting(MyActivity.this);
}
});//该功能需要读取通讯录权限,
}
return false;
}
return true;
}
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.item_points_directories:
//使用 调通讯录
if (directoriesPermission()) {
startActivityForResult(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI), S_DIR);
}
break;
default:
break;
}}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case 1: //通讯录回调
getDirectories(data);
break;
default:
break;
}
}
}
/**
* 调取通讯录
*
* @param data
* @param isSend
*/
public void getDirectories(Intent data) {
// ContentProvider展示数据类似一个单个数据库表
// ContentResolver实例带的方法可实现找到指定的ContentProvider并获取到ContentProvider的数据
ContentResolver reContentResolverol = getContentResolver();
//URI,每个ContentProvider定义一个唯一的公开的URI,用于指定到它的数据集
Uri contactData = data.getData();
//查询就是输入URI等参数,其中URI是必须的,其他是可选的,如果系统能找到URI对应的ContentProvider将返回一个Cursor对象.
// Cursor cursor = managedQuery(contactData, null, null, null, null);
Cursor cursor;
if (Build.VERSION.SDK_INT < 11) {
cursor = managedQuery(contactData, null, null, null, null);
} else {
CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);
cursor = cursorLoader.loadInBackground();
}
boolean flag = cursor.moveToFirst();
if (!flag) {
showTextToast("请重新选择");
return;
}
//获得DATA表中的名字
String username = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//条件为联系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
// 获得DATA表中的电话号码,条件为联系人ID,因为手机号码可能会有多个
Cursor phone = reContentResolverol.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
while (phone.moveToNext()) {
String usernumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).trim();
}
cursor.close();
}
2、Fragment中动态申请权限//拍照动态申请权限
private boolean CameraPermission() {
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//只是拒绝
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CAMERA)) {
FirstFragment.this.requestPermissions(new String[]{Manifest.permission.CAMERA}, 4);// 动态请求权限
} else {//拒绝后不再询问
DialogUtils.showDialog(getActivity(), "权限提醒", "由于无法获取获取拍照权限,不能正常使用此功能,请到以下路径进行设置:\n设置->应用名称->权限", "去设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
PermissionUtil.openSetting(getActivity());
}
});
}
return false;
}
return true;
}
3、打开设置界面
/**
* 打开系统的该应用的设置页面
*
* @param activity
*/
public static void openSetting(Activity activity) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", activity.getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
intent.putExtra("com.android.settings.ApplicationPkgName", activity.getPackageName());
}
activity.startActivity(intent);
}
/**
* 打开市场的该应用的设置页面
*
* @param activity
*/
public static void openMarkSetting(Activity activity) {
Uri uri = Uri.parse("market://details?id=order.lbex");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
activity.startActivity(it);
}
/**
* 打开GPS的设置页面
*
* @param activity
*/
public static void openGpsSetting(Activity activity) {
// 转到手机设置界面,用户设置GPS
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
//activity.startActivityForResult(intent, 0); // 设置完成后返回到原来的界面
activity.startActivity(intent); // 设置完成后返回到原来的界面
}
/**
* 打开WIFI的设置页面
*
* @param activity
*/
public static void openWifiSetting(Activity activity) {
// 转到手机设置界面,用户设置WIFI
Intent it = new Intent();
ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.wifi.WifiSettings");
it.setComponent(cn);
activity.startActivity(it);// 设置完成后返回到原来的界面
}
注意:
在Activity中动态请求权限:ActivityCompat.requestPermissions(this, new String[{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
在Fragment中动态请求权限时不是使用AcyivityCompat而是使用Fragment本身:
HomeFragment.this.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
感谢以下博文的各位博主,谢谢各位!如有不妥的地方,请各位博主评论区留言,本人看到会立刻处理。
点击打开链接 http://blog.csdn.net/lmj623565791/article/details/50709663
点击打开链接 http://m.blog.csdn.net/KjunChen/article/details/51366845
点击打开链接 http://www.cnblogs.com/mengdd/p/4892856.html
点击打开链接 http://blog.csdn.net/aminfo/article/details/7599858
点击打开链接 http://blog.csdn.net/xiaoqiang_0719/article/details/53009323
点击打开链接 http://blog.csdn.net/u014137988/article/details/52224544