Android marshmallow request permission?

后端 未结 24 2047
無奈伤痛
無奈伤痛 2020-11-21 06:40

I am currently working on an application that requires several \"dangerous\" permissions. So I tried adding \"ask for permission\" as required in Android Marshmallow(API Lev

相关标签:
24条回答
  • 2020-11-21 07:25

    Simple way to ask permission by avoiding writing lots of code,

    https://github.com/sachinvarma/EasyPermission

    How to add :

    repositories {
            maven { url "https://jitpack.io" }
        }
    
    implementation 'com.github.sachinvarma:EasyPermission:1.0.1'
    

    How to ask permission:

     List<String> permission = new ArrayList<>();
     permission.add(EasyPermissionList.READ_EXTERNAL_STORAGE);
     permission.add(EasyPermissionList.ACCESS_FINE_LOCATION);
    
     new EasyPermissionInit(MainActivity.this, permission);
    

    Hoping it will be helpful for someone.

    0 讨论(0)
  • 2020-11-21 07:26

    You can use my library — NoPermission (It's just one class)

    compile 'ru.alexbykov:nopermission:1.1.1'

    Sample

    PermissionHelper permissionHelper = new PermissionHelper(this); //don't use getActivity in fragment!
    
    permissionHelper.check(Manifest.permission.READ_CONTACTS)
                    .onSuccess(this::onSuccess)
                    .onDenied(this::onDenied)
                    .onNeverAskAgain(this::onNeverAskAgain)
                    .run();
    

    onRequestPermissionResult:

     @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
            permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
       }
    

    I think api more convenient than EasyPermissions by Google.

    0 讨论(0)
  • 2020-11-21 07:27

    There is a good library that can be used in case permissions need to be asked when permission is needed by a background service. Although a limitation of library is that it can not be used to just determine whether permissions are currently given to the app or not. It always asks the user if app doesn't already have them.

    Do give it a try as it makes life simpler: Android Permissions

    0 讨论(0)
  • 2020-11-21 07:28

    I'm using this as a base Fragment class. I only ask for permissions from a fragment, but you could refactor it and make a similar Activity version.

    public class BaseFragment extends Fragment {
    
        private static final int PERMISSION_REQUEST_BLOCK_INTERNAL = 555;
        private static final String PERMISSION_SHARED_PREFERENCES = "permissions";
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if (requestCode == PERMISSION_REQUEST_BLOCK_INTERNAL) {
                boolean allPermissionsGranted = true;
    
                for (int iGranting : grantResults) {
                    if (iGranting != PermissionChecker.PERMISSION_GRANTED) {
                        allPermissionsGranted = false;
                        break;
                    }
                }
    
                if (allPermissionsGranted && permissionBlock != null) {
                    permissionBlock.run();
                }
    
                permissionBlock = null;
            }
        }
    
        public void runNowOrAskForPermissionsFirst(String permission, Runnable block) {
            if (hasPermission(permission)) {
                block.run();
            } else if (!hasPermissionOrWillAsk(permission)) {
                permissionBlock = block;
                askForPermission(permission, PERMISSION_REQUEST_BLOCK_INTERNAL);
            }
        }
    
        public boolean hasPermissionOrWillAsk(String permission) {
            boolean hasPermission = hasPermission(permission);
            boolean hasAsked = hasPreviouslyAskedForPermission(permission);
            boolean shouldExplain = shouldShowRequestPermissionRationale(permission);
    
            return hasPermission || (hasAsked && !shouldExplain);
        }
    
        private boolean hasPermission(String permission) {
            return (ContextCompat.checkSelfPermission(getContext(), permission) == PackageManager.PERMISSION_GRANTED);
        }
    
        private boolean hasPreviouslyAskedForPermission(String permission) {
            SharedPreferences prefs = getContext().getSharedPreferences(PERMISSION_SHARED_PREFERENCES, Context.MODE_PRIVATE);
            return prefs.getBoolean(permission, false);
        }
    
        private void askForPermission(String permission, int requestCode) {
            SharedPreferences.Editor editor = getContext().getSharedPreferences(PERMISSION_SHARED_PREFERENCES, Context.MODE_PRIVATE).edit();
    
            editor.putBoolean(permission, true);
            editor.apply();
    
            requestPermissions(new String[] { permission }, requestCode);
        }
    }
    

    There are two key methods you should use:

    • hasPermissionOrWillAsk - Use this to see if a permission has been asked for and denies by a user who doesn't want to be asked again. This is useful for disabling UI when the user has given their final answer about NOT wanting a feature.

    • runNowOrAskForPermissionsFirst - Use this to run some code that requires permissions. If the user has already granted permission, the code will run immediately. Otherwise, the code will run later if the user grants permission. Or not at all. It's nice because you specify the code in one place.

    Here's an example:

    mFragment.runNowOrAskForPermissionsFirst(Manifest.permission.ACCESS_FINE_LOCATION, new Runnable() {
        @Override
        public void run() {
            ...do something if we have permission...
        }
    });
    

    Happy to get feedback on this. Not that this specific example is a little simplified in that you also need to check to see if Location Services are enabled on the device. (That's different than permissions.) Also, it only supports one permission at a time, but would be simple to modify if you need it to support more than one at a time.

    0 讨论(0)
  • 2020-11-21 07:29

    Open a Dialog using the code below:

     ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        1);
    

    Get the Activity result as below:

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
    
              // If request is cancelled, the result arrays are empty.
              if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.          
                } else {
    
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
    

    More info: https://developer.android.com/training/permissions/requesting.html

    0 讨论(0)
  • 2020-11-21 07:29
      if (CommonMethod.isNetworkAvailable(MainActivity.this)) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this,
                                    android.Manifest.permission.CAMERA);
                            if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                                //showing dialog to select image
                                callFacebook();
                                Log.e("permission", "granted MarshMallow");
                            } else {
                                ActivityCompat.requestPermissions(MainActivity.this,
                                        new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE,
                                                android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.CAMERA}, 1);
                            }
                        } else {
                            Log.e("permission", "Not Required Less than MarshMallow Version");
                            callFacebook();
                        }
                    } else {
                        CommonMethod.showAlert("Internet Connectivity Failure", MainActivity.this);
                    }
    
    0 讨论(0)
提交回复
热议问题