华为读取sdk需要android 动态获取权限限吗

说说Android6.0动态申请权限的那些坑,android6.0动态权限-android100学习网
说说Android6.0动态申请权限的那些坑,android6.0动态权限
说说Android6.0动态申请权限的那些坑,android6.0动态权限 白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒。   首先要知道哪些坑,就得先了解一些定义和基本...
说说Android6.0动态申请权限的那些坑,android6.0动态权限
白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒。
  首先要知道哪些坑,就得先了解一些定义和基本使用方式。
那么先介绍一下动态申请的权限分组情况。
  下面的权限组是由谷歌官方定义的,目的是在申请权限时,只要用户允许同一权限组的任意一条权限,那么该组的其他权限也就默认是允许的。不过据高人介绍,在使用时最好是用到哪个权限就具体的请求该权限,因为保不齐哪天谷歌一高兴就把权限组换了甚至删了、
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
其实权限组的定义很简单,下面简单介绍下动态申请权限的步骤。
第一步,检查app拥有的权限。 
1 if(ContextCompat.checkSelfPermission(
mActivity,Manifest.permisson.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
//当前Activity没有获得READ_CONTACTS权限时
//否则已允许
第二步,申请权限。
1 ActivityCompat.requestPermissions(
mActivity,
new String[]{Manifest.permission.READ_CONTACTS},
REQUEST_CODE_PERMISSION_CONTACTS);
第三步,权限申请回调方法。
1 @Override
2 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_PERMISSION_CONTACTS: {
if (grantResults.length & 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//用户已授权
//用户拒绝权限
如此三步,看上去很简单,可真要用起来可就没有那么简单了。下面就说说这里边的坑吧。
坑一、权限申请只能在Activity或者Fragment的上下文中,不能用getApplicationContext()。
  由于我们项目在应用初始化时要获取内存的存储路径并创建一系列文件缓存,这些操作都是写在Application的onCreate()中调用不同的Util工具类进行的,所以在Android6.0以上这么写就有点不太靠谱了。目前我的解决措施是在应用程序初始化时,先判断SDK版本,只对版本号小于23的app创建缓存文件,高于23的则在进入Activity之后再初始化。
坑二、权限申请时使用的请求码必须小于16。
  至于什么原因不太清楚,可能谷歌公司认为权限本来就不多,没必要将请求码弄得很大占用多余的内存吧。说到请求码,也就是上面代码中未定义的常量值REQUEST_CODE_PERMISSION_CONTACTS,如果你定义的这个值超过了15,运行时就会报安全异常,提示请求码必须小于16。
目前来说这两个坑就够我忙活一天的了,看来还是经验不足啊,以后还要多多吸取经验。Android动态获取权限
以打电话为例
if (Build.VERSION.SDK_INT &= 23) {
int checkPermission =
ContextCompat.checkSelfPermission(mContext,
Manifest.permission.CALL_PHONE);
if(checkPermission != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(mContext,
new String[]
{Manifest.permission.CALL_PHONE},REQUEST_CALL);
Intent intent = new Intent(Intent.ACTION_CALL,
Uri.parse(&tel:& + phone));
startActivity(intent);
if (Build.VERSION.SDK_INT &= 23) {
int checkCPermission =
ContextCompat.checkSelfPermission(mContext,
Manifest.permission.ACTION_SENDTO);
if(checkCPermission !=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(mContext,
new String[]Manifest.permission.ACTION_SENDTO},
REQUEST_CSEND);
Intent intent = new Intent(Intent.ACTION_SENDTO,
&smsto &+phone);
startActivity(intent);
Intent intent = new Intent(Intent.ACTION_SENDTO,
&smsto &+phone);
startActivity(intent);
String数组中的int值为自定义
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'安卓开发——Android6.0动态权限申请步骤以及需要注意的一些坑 - 博客频道 - CSDN.NET
萌鼠喝酸奶的博客
渣渣猿的进化之路
分类:安卓开发
因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo。算是自己的笔记吧,可能会比较混乱,主要是方便以后查看。后期有别的问题,随时更新~
6.0权限的基本知识,以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了。
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
以下是普通权限,只需要在AndroidManifest.xml中申请即可。
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
将targetSdkVersion设置为23,注意,如果你将targetSdkVersion设置为&=23,则必须按照Android谷歌的要求,动态的申请权限,如果你暂时不打算支持动态权限申请,则targetSdkVersion最大只能设置为22.
在AndroidManifest.xml中申请你需要的权限,包括普通权限和需要申请的特殊权限。
3.开始申请权限,此处分为3部。
(1)检查是否由此权限checkSelfPermission(),如果已经开启,则直接做你想做的。
(2)如果未开启,则判断是否需要向用户解释为何申请权限shouldShowRequestPermissionRationale。
(3)如果需要(即返回true),则可以弹出对话框提示用户申请权限原因,用户确认后申请权限requestPermissions(),如果不需要(即返回false),则直接申请权限requestPermissions()。(这里是一部门代码,底部有比较完善的代码,整个demo可以在github中下载)。
单个权限申请.png
requestCode request code, e.g. if you need request CAMERA permission,parameters is PermissionUtils.CODE_CAMERA
public static void requestPermission(final Activity activity, final int requestCode, PermissionGrant permissionGrant) {
if (activity == null) {
Log.i(TAG, "requestPermission requestCode:" + requestCode);
if (requestCode & 0 || requestCode &= requestPermissions.length) {
Log.w(TAG, "requestPermission illegal requestCode:" + requestCode);
final String requestPermission = requestPermissions[requestCode];
int checkSelfP
checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
} catch (RuntimeException e) {
Toast.makeText(activity, "please open this permission", Toast.LENGTH_SHORT)
Log.e(TAG, "RuntimeException:" + e.getMessage());
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED");
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
Log.i(TAG, "requestPermission shouldShowRequestPermissionRationale");
shouldShowRationale(activity, requestCode, requestPermission);
Log.d(TAG, "requestCameraPermission else");
ActivityCompat.requestPermissions(activity, new String[]{requestPermission}, requestCode);
Log.d(TAG, "ActivityCompat.checkSelfPermission ==== PackageManager.PERMISSION_GRANTED");
Toast.makeText(activity, "opened:" + requestPermissions[requestCode], Toast.LENGTH_SHORT).show();
permissionGrant.onPermissionGranted(requestCode);
6.0以下系统的应用程序安装界面.png
备注!!!
(1)checkSelfPermission:检查是否拥有这个权限 (2)requestPermissions:请求权限,一般会弹出一个系统对话框,询问用户是否开启这个权限。 (3)shouldShowRequestPermissionRationale:Android原生系统中,如果第二次弹出权限申请的对话框,会出现“以后不再弹出”的提示框,如果用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale返回true,意思是说要给用户一个 解释,告诉用户为什么要这个权限。然而,在实际开发中,需要注意的是,很多手机对原生系统做了修改,比如小米,小米4的6.0的shouldShowRequestPermissionRationale 就一直返回false,而且在申请权限时,如果用户选择了拒绝,则不会再弹出对话框了。。。。 所以说这个地方有坑,我的解决方法是,在回调里面处理,如果用户拒绝了这个权限,则打开本应用信息界面,由用户自己手动开启这个权限。(4)每个应用都有自己的权限管理界面,里面有本应用申请的权限以及各种状态,即使用户已经同意了你申请的权限,他也随时可以关闭
权限管理界面.png
一次申请多个权限
其实和申请一个权限是一样的,只是requestPermissions(final @NonNull Activity activity,
final @NonNull String[] permissions, final int requestCode),里面的permissions给的参数多些而已。
申请多个权限.png
public static void requestMultiPermissions(final Activity activity, PermissionGrant grant) {
final List&String& permissionsList = getNoGrantedPermission(activity, false);
final List&String& shouldRationalePermissionsList = getNoGrantedPermission(activity, true);
if (permissionsList == null || shouldRationalePermissionsList == null) {
Log.d(TAG, "requestMultiPermissions permissionsList:" + permissionsList.size() + ",shouldRationalePermissionsList:" + shouldRationalePermissionsList.size());
if (permissionsList.size() & 0) {
ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
} else if (shouldRationalePermissionsList.size() & 0) {
showMessageOKCancel(activity, "should open those permission",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
grant.onPermissionGranted(CODE_MULTI_PERMISSION);
关于权限请求结果的回调。Activity实现ActivityCompat.OnRequestPermissionsResultCallback接口,重写onRequestPermissionsResult方法。
public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
.requestPermissionsResult(this, requestCode, permissions, grantResults, mPermissionGrant);
整个申请权限工具类代码
package com.example.android.system.
import android.M
import android.app.A
import android.content.DialogI
import android.content.I
import android.content.pm.PackageM
import android.net.U
import android.provider.S
import android.support.annotation.NonN
import android.support.v4.app.ActivityC
import android.support.v7.app.AlertD
import android.util.L
import android.widget.T
import java.util.ArrayL
import java.util.HashMap;
import java.util.L
import java.util.M
public class PermissionUtils {
private static final String TAG = PermissionUtils.class.getSimpleName();
public static final int CODE_RECORD_AUDIO = 0;
public static final int CODE_GET_ACCOUNTS = 1;
public static final int CODE_READ_PHONE_STATE = 2;
public static final int CODE_CALL_PHONE = 3;
public static final int CODE_CAMERA = 4;
public static final int CODE_ACCESS_FINE_LOCATION = 5;
public static final int CODE_ACCESS_COARSE_LOCATION = 6;
public static final int CODE_READ_EXTERNAL_STORAGE = 7;
public static final int CODE_WRITE_EXTERNAL_STORAGE = 8;
public static final int CODE_MULTI_PERMISSION = 100;
public static final String PERMISSION_RECORD_AUDIO = Manifest.permission.RECORD_AUDIO;
public static final String PERMISSION_GET_ACCOUNTS = Manifest.permission.GET_ACCOUNTS;
public static final String PERMISSION_READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE;
public static final String PERMISSION_CALL_PHONE = Manifest.permission.CALL_PHONE;
public static final String PERMISSION_CAMERA = Manifest.permission.CAMERA;
public static final String PERMISSION_ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
public static final String PERMISSION_ACCESS_COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
public static final String PERMISSION_READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;
public static final String PERMISSION_WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
private static final String[] requestPermissions = {
PERMISSION_RECORD_AUDIO,
PERMISSION_GET_ACCOUNTS,
PERMISSION_READ_PHONE_STATE,
PERMISSION_CALL_PHONE,
PERMISSION_CAMERA,
PERMISSION_ACCESS_FINE_LOCATION,
PERMISSION_ACCESS_COARSE_LOCATION,
PERMISSION_READ_EXTERNAL_STORAGE,
PERMISSION_WRITE_EXTERNAL_STORAGE
interface PermissionGrant {
void onPermissionGranted(int requestCode);
public static void requestPermission(final Activity activity, final int requestCode, PermissionGrant permissionGrant) {
if (activity == null) {
Log.i(TAG, "requestPermission requestCode:" + requestCode);
if (requestCode & 0 || requestCode &= requestPermissions.length) {
Log.w(TAG, "requestPermission illegal requestCode:" + requestCode);
final String requestPermission = requestPermissions[requestCode];
int checkSelfP
checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
} catch (RuntimeException e) {
Toast.makeText(activity, "please open this permission", Toast.LENGTH_SHORT)
Log.e(TAG, "RuntimeException:" + e.getMessage());
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED");
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
Log.i(TAG, "requestPermission shouldShowRequestPermissionRationale");
shouldShowRationale(activity, requestCode, requestPermission);
Log.d(TAG, "requestCameraPermission else");
ActivityCompat.requestPermissions(activity, new String[]{requestPermission}, requestCode);
Log.d(TAG, "ActivityCompat.checkSelfPermission ==== PackageManager.PERMISSION_GRANTED");
Toast.makeText(activity, "opened:" + requestPermissions[requestCode], Toast.LENGTH_SHORT).show();
permissionGrant.onPermissionGranted(requestCode);
private static void requestMultiResult(Activity activity, String[] permissions, int[] grantResults, PermissionGrant permissionGrant) {
if (activity == null) {
Log.d(TAG, "onRequestPermissionsResult permissions length:" + permissions.length);
Map&String, Integer& perms = new HashMap&&();
ArrayList&String& notGranted = new ArrayList&&();
for (int i = 0; i & permissions. i++) {
Log.d(TAG, "permissions: [i]:" + i + ", permissions[i]" + permissions[i] + ",grantResults[i]:" + grantResults[i]);
perms.put(permissions[i], grantResults[i]);
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
notGranted.add(permissions[i]);
if (notGranted.size() == 0) {
Toast.makeText(activity, "all permission success" + notGranted, Toast.LENGTH_SHORT)
permissionGrant.onPermissionGranted(CODE_MULTI_PERMISSION);
openSettingActivity(activity, "those permission need granted!");
public static void requestMultiPermissions(final Activity activity, PermissionGrant grant) {
final List&String& permissionsList = getNoGrantedPermission(activity, false);
final List&String& shouldRationalePermissionsList = getNoGrantedPermission(activity, true);
if (permissionsList == null || shouldRationalePermissionsList == null) {
Log.d(TAG, "requestMultiPermissions permissionsList:" + permissionsList.size() + ",shouldRationalePermissionsList:" + shouldRationalePermissionsList.size());
if (permissionsList.size() & 0) {
ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
} else if (shouldRationalePermissionsList.size() & 0) {
showMessageOKCancel(activity, "should open those permission",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
grant.onPermissionGranted(CODE_MULTI_PERMISSION);
private static void shouldShowRationale(final Activity activity, final int requestCode, final String requestPermission) {
String[] permissionsHint = activity.getResources().getStringArray(R.array.permissions);
showMessageOKCancel(activity, "Rationale: " + permissionsHint[requestCode], new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity,
new String[]{requestPermission},
requestCode);
Log.d(TAG, "showMessageOKCancel requestPermissions:" + requestPermission);
private static void showMessageOKCancel(final Activity context, String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(context)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
public static void requestPermissionsResult(final Activity activity, final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults, PermissionGrant permissionGrant) {
if (activity == null) {
Log.d(TAG, "requestPermissionsResult requestCode:" + requestCode);
if (requestCode == CODE_MULTI_PERMISSION) {
requestMultiResult(activity, permissions, grantResults, permissionGrant);
if (requestCode & 0 || requestCode &= requestPermissions.length) {
Log.w(TAG, "requestPermissionsResult illegal requestCode:" + requestCode);
Toast.makeText(activity, "illegal requestCode:" + requestCode, Toast.LENGTH_SHORT).show();
Log.i(TAG, "onRequestPermissionsResult requestCode:" + requestCode + ",permissions:" + permissions.toString()
+ ",grantResults:" + grantResults.toString() + ",length:" + grantResults.length);
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "onRequestPermissionsResult PERMISSION_GRANTED");
permissionGrant.onPermissionGranted(requestCode);
Log.i(TAG, "onRequestPermissionsResult PERMISSION NOT GRANTED");
String[] permissionsHint = activity.getResources().getStringArray(R.array.permissions);
openSettingActivity(activity,
"Result" + permissionsHint[requestCode]);
private static void openSettingActivity(final Activity activity, String message) {
showMessageOKCancel(activity, message, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Log.d(TAG, "getPackageName(): " + activity.getPackageName());
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivity(intent);
public static ArrayList&String& getNoGrantedPermission(Activity activity, boolean isShouldRationale) {
ArrayList&String& permissions = new ArrayList&&();
for (int i = 0; i & requestPermissions. i++) {
String requestPermission = requestPermissions[i];
int checkSelfPermission = -1;
checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
} catch (RuntimeException e) {
Toast.makeText(activity, "please open those permission", Toast.LENGTH_SHORT)
Log.e(TAG, "RuntimeException:" + e.getMessage());
return null;
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "getNoGrantedPermission ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED:" + requestPermission);
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
Log.d(TAG, "shouldShowRequestPermissionRationale if");
if (isShouldRationale) {
permissions.add(requestPermission);
if (!isShouldRationale) {
permissions.add(requestPermission);
Log.d(TAG, "shouldShowRequestPermissionRationale else");
界面调用代码
package com.example.android.system.
import android.os.B
import android.support.annotation.NonN
import android.support.v4.app.ActivityC
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentT
import android.view.V
import android.widget.T
import com.mon.logger.L
public class PermissionActivity extends FragmentActivity implements ActivityCompat.OnRequestPermissionsResultCallback{
private static final String TAG = PermissionActivity.class.getSimpleName();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
PermissionsFragment fragment = new PermissionsFragment();
transaction.replace(R.id.content_fragment, fragment);
public void showCamera(View view) {
Log.i(TAG, "Show camera button pressed. Checking permission.");
PermissionUtils.requestPermission(this, PermissionUtils.CODE_CAMERA, mPermissionGrant);
public void getAccounts(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_GET_ACCOUNTS, mPermissionGrant);
public void callPhone(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_CALL_PHONE, mPermissionGrant);
public void readPhoneState(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_READ_PHONE_STATE, mPermissionGrant);
public void accessFineLocation(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_ACCESS_FINE_LOCATION, mPermissionGrant);
public void accessCoarseLocation(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_ACCESS_COARSE_LOCATION, mPermissionGrant);
public void readExternalStorage(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_READ_EXTERNAL_STORAGE, mPermissionGrant);
public void writeExternalStorage(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE, mPermissionGrant);
public void recordAudio(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_RECORD_AUDIO, mPermissionGrant);
private PermissionUtils.PermissionGrant mPermissionGrant = new PermissionUtils.PermissionGrant() {
public void onPermissionGranted(int requestCode) {
switch (requestCode) {
case PermissionUtils.CODE_RECORD_AUDIO:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_RECORD_AUDIO", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_GET_ACCOUNTS:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_GET_ACCOUNTS", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_READ_PHONE_STATE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_READ_PHONE_STATE", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_CALL_PHONE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_CALL_PHONE", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_CAMERA:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_CAMERA", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_ACCESS_FINE_LOCATION:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_ACCESS_FINE_LOCATION", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_ACCESS_COARSE_LOCATION:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_ACCESS_COARSE_LOCATION", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_READ_EXTERNAL_STORAGE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_READ_EXTERNAL_STORAGE", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_WRITE_EXTERNAL_STORAGE", Toast.LENGTH_SHORT).show();
public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
PermissionUtils.requestPermissionsResult(this, requestCode, permissions, grantResults, mPermissionGrant);
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/horizontal_page_margin"
android:paddingRight="@dimen/horizontal_page_margin"
android:paddingTop="@dimen/vertical_page_margin"
android:paddingBottom="@dimen/vertical_page_margin"
android:orientation="vertical"
android:id="@+id/content_fragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/&
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"&
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Camera"
android:id="@+id/button_camera"
android:onClick="showCamera"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RECORD_AUDIO"
android:onClick="recordAudio"/&
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GET_ACCOUNTS"
android:onClick="getAccounts"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CALL_PHONE"
android:onClick="callPhone"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PERMISSION_READ_PHONE_STATE"
android:onClick="readPhoneState"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACCESS_FINE_LOCATION"
android:onClick="accessFineLocation"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACCESS_COARSE_LOCATION"
android:onClick="accessCoarseLocation"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="READ_EXTERNAL_STORAGE"
android:onClick="readExternalStorage"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WRITE_EXTERNAL_STORAGE"
android:onClick="writeExternalStorage"/&
清单文件申请的权限
&uses-permission android:name="android.permission.CAMERA"/&
&uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&
&uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/&
&uses-permission android:name="android.permission.CALL_PHONE"/&
&uses-permission android:name="android.permission.SEND_SMS"/&
&uses-permission android:name="android.permission.READ_SMS"/&
&uses-permission android:name="android.permission.GET_ACCOUNTS"/&
&uses-permission android:name="android.permission.READ_PHONE_STATE"/&
&uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.RECORD_AUDIO"/&
部分 资源文件
&?xml version="1.0" encoding="utf-8"?&
&resources&
&string-array name="permissions"&
&item&@string/permission_recode_audio_hint&/item&
&item&@string/permission_get_accounts_hint&/item&
&item&@string/permission_read_phone_hint&/item&
&item&@string/permission_call_phone_hint&/item&
&item&@string/permission_camera_hint&/item&
&item&@string/permission_access_fine_location_hint&/item&
&item&@string/permission_access_coarse_location_hint&/item&
&item&@string/permission_read_external_hint&/item&
&item&@string/permission_white_external_hint&/item&
&/string-array&
&/resources&
&string name="permission_get_accounts_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_GET_ACCOUNTS&/string&
&string name="permission_read_phone_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_READ_PHONE_STATE&/string&
&string name="permission_call_phone_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_CALL_PHONE&/string&
&string name="permission_camera_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_CAMERA&/string&
&string name="permission_access_fine_location_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_ACCESS_FINE_LOCATION&/string&
&string name="permission_access_coarse_location_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_ACCESS_COARSE_LOCATION&/string&
&string name="permission_read_external_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_READ_EXTERNAL_STORAGE&/string&
&string name="permission_white_external_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_WRITE_EXTERNAL_STORAGE&/string&
&string name="permission_recode_audio_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_RECORD_AUDIO&/string&
6.0权限动态申请各种坑,刚开始不知道6.0有这回事的时候,保存图片到本地各种出错,最后突然想起曾经看过相关的文章,怀疑是不是6.0以上版本的特殊性,后来百度一查,果然如此,诶,??mmp不知当讲不当讲。
排名:第13177名
(98)(75)(19)(1)(6)(6)(10)(6)}

我要回帖

更多关于 fragment动态获取权限 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信