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