Android marshmallow request permission?

后端 未结 24 2083
無奈伤痛
無奈伤痛 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:03

    If you're using AndroidX Activity 1.2.0 or AndroidX Fragment 1.3.0:

    There are new Activity Result APIs that you can use to ask for permissions:

    val launcher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
        if (isGranted) {
            // Permission granted. Do the tasks.
        }
    }
    launcher.launch(Manifest.permission.ACCESS_FINE_LOCATION)
    
    0 讨论(0)
  • 2020-11-21 07:04

    Runtime Permission AnyWhere In ApplicationHere is Example

    use dependency
    maven { url 'https://jitpack.io' }
    dependencies {
    implementation 'com.github.irshadsparky:PermissionLib:master-SNAPSHOT'
    }
    

    and call code like this :

    PermissionHelper.requestCamera(new PermissionHelper.OnPermissionGrantedListener() {
    @Override
    public void onPermissionGranted() {
    
    }
    });
    

    you can find more Github

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

    From Android Marshmallow(API 23) and above by default all dangerous permission ( as per official doc official doc) disabled. After installation when app open first time then you have to grant permission at Run Time.

    I achieved this following way:

    public class MarshMallowPermission {
    
        public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_GALLERY = 0;
        public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_CAMERA = 1;
        public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_LOAD_PROFILE = 2;
        public static final int CAMERA_PERMISSION_REQUEST_CODE = 3;
        public static final int LOCATION_PERMISSION_REQUEST_CODE = 4;
        Activity activity;
        Context mContext;
    
        public MarshMallowPermission(Activity activity) {
            this.activity = activity;
            this.mContext = activity;
        }
    
        public boolean checkPermissionForExternalStorage(){
            int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (result == PackageManager.PERMISSION_GRANTED){
                return true;
            } else {
                return false;
            }
        }
    
        public boolean checkPermissionForCamera(){
            int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
            if (result == PackageManager.PERMISSION_GRANTED){
                return true;
            } else {
                return false;
            }
        }
    
        public boolean checkLocationPermission(){
    
            int result = ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION);
            if (result == PackageManager.PERMISSION_GRANTED){
                return true;
            } else {
                return false;
            }
        }
    
        public void requestPermissionForExternalStorage(int requestCode){
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                Toast.makeText(mContext.getApplicationContext(), "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
            } else {
                ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},requestCode);
            }
        }
    
        public void requestPermissionForCamera(){
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){
                Toast.makeText(mContext.getApplicationContext(), "Camera permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
            } else {
                ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);
            }
        }
        public void requestPermissionForLocation(){
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION) && ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_COARSE_LOCATION)){
                Toast.makeText(mContext.getApplicationContext(), "Location permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
            } else {
                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
            }
        }
    }
    

    IN Your activity class:

     public class MainActivity extends AppCompatActivity{
    
       private MarshMallowPermission marshMallowPermission;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            Log.d("NavHome", "Oncreate_nav");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            marshMallowPermission = new MarshMallowPermission(MainActivity.this);
    
    
    
            if (!marshMallowPermission.checkPermissionForExternalStorage()) {
                marshMallowPermission.requestPermissionForExternalStorage(MarshMallowPermission.EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_LOAD_PROFILE);
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            switch (requestCode) {
                case MarshMallowPermission.EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_LOAD_PROFILE:
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                        //permission granted successfully
    
                    } else {
    
                     //permission denied
    
                    }
                    break;
        }
        }
    
    }
    
    0 讨论(0)
  • 2020-11-21 07:06

    To handle runtime permission google has provided a library project. You can check this from here https://github.com/googlesamples/easypermissions

    EasyPermissions is installed by adding the following dependency to your build.gradle file:

    dependencies {
    compile 'pub.devrel:easypermissions:0.3.0'
    }
    

    To begin using EasyPermissions, have your Activity (or Fragment) override the onRequestPermissionsResult method:

    public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
    
    @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
        // Some permissions have been granted
        // ...
    }
    
    @Override
    public void onPermissionsDenied(int requestCode, List<String> list) {
        // Some permissions have been denied
        // ...
    }
    }
    

    Here you will get a working example how this library works https://github.com/milon87/EasyPermission

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

    Try this

    This is the simplest way to ask for permission in Marshmallow version.

     if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED&&ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
        {
            //TO do here if permission is granted by user
        }
        else
        {
            //ask for permission if user didnot given
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            {
                requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.ACCESS_FINE_LOCATION}, 0);
            }
        }
    

    Note:- Don't forget to add this same permission in manifest file also

     <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    Second Method Code for checking the permission is granted or not?

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

    And override the method

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                if (grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
             //                    grantResult[0] means it will check for the first postion permission which is READ_EXTERNAL_STORAGE
            //                    grantResult[1] means it will check for the Second postion permission which is CAMERA
                    Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
                }
                else
                    Toast.makeText(this, "Permission not Granted", Toast.LENGTH_SHORT).show();
                return;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-21 07:08

    Add the permissions to the AndroidManifest.xml

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application ...>
     ....
    </application>
    

    To check the Android version if it needs runtime permission or not.

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
        askForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, 1);
    }
    

    Ask the user to grant the permission if not granted.

    private void askForPermission(String permission, int requestCode) {
        if (ContextCompat.checkSelfPermission(c, permission)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
                Toast.makeText(c, "Please grant the requested permission to get your task done!", Toast.LENGTH_LONG).show();
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
            } else {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
            }
        }
    }
    

    Do something if the permission was granted or not.

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //permission with request code 1 granted
                    Toast.makeText(this, "Permission Granted" , Toast.LENGTH_LONG).show();
                } else {
                    //permission with request code 1 was not granted
                    Toast.makeText(this, "Permission was not Granted" , Toast.LENGTH_LONG).show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    
    0 讨论(0)
提交回复
热议问题