这样一个新的和令人敬畏的安全功能是运行时权限
我试图理解它,并为一个演示,但一个问题提高了我的想法,当我处理用户权限与对话.
如何处理“再也不要问”
假设我的应用程序必须需要位置/联系,但用户DENY它“不要再询问”.
我能为此做些什么不是全部用户理解我的字段是必需的.
任何建议?
解决方法
首先,您需要在Activity中实现ActivityCompat类的OnRequestPermissionsResultCallback Listener,并覆盖void onRequestPermissionsResult(int requestCode,@NonNull String [] permissions,@NonNull int [] grantResults)检查用户是否允许或拒绝权限的方法
你可以这样做.在这里,我检查WRITE_EXTERNAL_STORAGE的权限访问:
int REQUEST_STORAGE = 1; private void checkPermissions() { if (hasStoragePermissionGranted()) { // you can do whatever you want } else { requestPermission(); } } public boolean hasPermissionGranted(){ return ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } public void requestPermission() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ ActivityCompat.requestPermissions(MainActivity.this,{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_STORAGE); } }
当用户允许或拒绝从运行时权限权限对话框中调用onRequestPermissionsResult()方法.
您还可以处理用户检查时不会显示“运行时权限”对话框的情况,您可以显示Snackbar或按钮,将用户重定向到应用程序设置页面,因为用户已经选中“不要再次询问”后无法显示权限对话框.
@Override public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) { if (requestCode == REQUEST_STORAGE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //Storage permission is enabled canSendAttachments = true; systemLogsCheckBox.setEnabled(true); } else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //User has deny from permission dialog Snackbar.make(mainLayout,getResources().getString("Please enable storage permission"),Snackbar.LENGTH_INDEFINITE) .setAction("OK",new View.OnClickListener() { @Override public void onClick(View view) { ActivityCompat.requestPermissions(MainActivity.this,REQUEST_STORAGE); } }) .show(); } else { // User has deny permission and checked never show permission dialog so you can redirect to Application settings page Snackbar.make(mainLayout,getResources().getString("Please enable permission from settings"),new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package",MainActivity.this.getPackageName(),null); intent.setData(uri); startActivity(intent); } }) .show(); } } }
在这里,我已经使用Snackbar向用户显示有关权限的相关消息,mainLayout是Activity的主要版面的ID.
希望它可以帮助你.