AndroidManifest.xmljava
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
MainActivity.javaandroid
public static final int CODE_FOR_READ_PERMISSION = 1111; //点击按钮 public void doButton(View view) { checkPermission(); } private void checkPermission() { int hasPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE); if(hasPermission != PackageManager.PERMISSION_GRANTED){ Log.d(TAG, "没有此权限" ); if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Log.d(TAG, "解释为何须要"); AlertDialog dialog = new AlertDialog.Builder(MainActivity.this) .setMessage("该功能须要赋予访问内存的权限,不开启将没法正常工做!") .setPositiveButton("肯定", new DialogInterface.OnClickListener() { [@Override](https://my.oschina.net/u/1162528) public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CODE_FOR_READ_PERMISSION); } }).create(); dialog.show(); }else{ Log.d(TAG, "第一次 或者 勾选了 不在询问 "); ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CODE_FOR_READ_PERMISSION); } } else { Log.d(TAG, "已有此权限,进行操做"); } } [@Override](https://my.oschina.net/u/1162528) public void onRequestPermissionsResult(int requestCode, [@NonNull](https://my.oschina.net/u/2981441) String[] permissions, [@NonNull](https://my.oschina.net/u/2981441) int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case CODE_FOR_READ_PERMISSION: if(permissions[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE) && grantResults[0] == PackageManager.PERMISSION_GRANTED){ // 赞成 Log.d(TAG, "赞成,进行操做"); } else { // 不一样意 Log.d(TAG, "拒绝"); if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Log.d(TAG, "提醒用户须要手动打开权限"); AlertDialog dialog = new AlertDialog.Builder(this) .setMessage("该功能须要赋予访问存储的权限,若要使用此功能,请手动打开权限") .setPositiveButton("肯定", new DialogInterface.OnClickListener() { [@Override](https://my.oschina.net/u/1162528) public void onClick(DialogInterface dialog, int which) { } }).create(); dialog.show(); } } break; default: } }
注意安全
在Fragment中申请权限时,须要用Fragment的方法进行申请,不然会回调Activity的onRequestPermissionsResult方法,Fragment的此方法收不到回调 ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) //变为 shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE) ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CODE_FOR_WRITE_PERMISSION); //变为 requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CODE_FOR_READ_PERMISSION);
参考 Android6.0动态权限申请步骤以及须要注意的一些坑 http://blog.csdn.net/nnmmbb/article/details/53706763ide
Android 6.0 运行时权限管理最佳实践 http://blog.csdn.net/yanzhenjie1003/article/details/52503533/ android permission权限与安全机制解析(下) http://blog.csdn.net/self_study/article/details/50186435