4

I search for Run-Time-Permission in android and I find lots of links but I see there is complex code.

Note: I share my simple code here so it's helpful for a new developer or Fraser. Also, I didn't use any third party library here.

Ali
  • 3,346
  • 4
  • 21
  • 56

2 Answers2

5

First of all, Write permission in Manifest file(I take some bagic permissions):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Now I make two methods checkPermission() AND requestPermission() also @Override one method name is onRequestPermissionsResult() this is take care of result.

Now I'll show you how it looks like:

private boolean checkPermission() {
        int internetPermission = ContextCompat.checkSelfPermission(getApplicationContext(), INTERNET);
        int cameraPermission = ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA);
        int readStoragePermission = ContextCompat.checkSelfPermission(getApplicationContext(), READ_EXTERNAL_STORAGE);
        int writeStoragePermission = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE);

        return internetPermission == PackageManager.PERMISSION_GRANTED &&
                cameraPermission == PackageManager.PERMISSION_GRANTED &&
                readStoragePermission == PackageManager.PERMISSION_GRANTED &&
                writeStoragePermission == PackageManager.PERMISSION_GRANTED;
    }

You see in above code there is define INTERNET, CAMERA etc.. This is an import by clicking Alt + Enter And it is look like see below code:

import static android.Manifest.permission.CAMERA;
import static android.Manifest.permission.INTERNET;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

Now Please see below code of requestPermission() Method :

private void requestPermission() {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{INTERNET, CAMERA, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE}, 1);
    }

Now the Last method is onRequestPermissionsResult(). In this method you can see either permission is GRANTED or DENY:

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {

            case 1:
                if (grantResults.length > 0) {
                    boolean internet = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean camera = grantResults[1] == PackageManager.PERMISSION_GRANTED;
                    boolean readStorage = grantResults[2] == PackageManager.PERMISSION_GRANTED;
                    boolean writeStorage = grantResults[3] == PackageManager.PERMISSION_GRANTED;

                    if (internet && camera && readStorage && writeStorage) {
                        init();
                       // Permission GRANTED (Here write your code what you want).
                    } else {
                        // Permission DENY (If user click on DENY then finish the activity);
                        finish();
                    }
                }
        }
    }

Great you are done with checkPermission & requestPermission.

NOTE:

This above code is working for Activity. There is a minor change in the fragment.

If I use this code in fragment then what should I change:

You want to just change in requestPermission() Method:

private void requestPermission() {
            requestPermissions(new String[]{INTERNET, CAMERA, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE}, 1);
        }
Ali
  • 3,346
  • 4
  • 21
  • 56
  • 1
    Maybe you think it's easy but it seems a bad way to me. first `checkPermission` will be false even if only one permission not granted and you will don't know which one it is. another thing is we should never ask permission when it's not needed, maybe user don't want to use the camera feature of app but want to use other. in that case this kind of approach will prevent user to use the app – Ashwini Saini Feb 26 '20 at 12:14
0

please try to dexter dependency

step:1

 dependencies{
   implementation 'com.karumi:dexter:6.0.2'
 }

step: 2

     Dexter.withActivity(this)
    .withPermission(Manifest.permission.CAMERA)
    .withListener(new PermissionListener() {
    @Override public void onPermissionGranted(PermissionGrantedResponse response) {/* 
    @Override public void onPermissionDenied(PermissionDeniedResponse response) {/* 
    @Override public void onPermissionRationaleShouldBeShown(PermissionRequest 
    permission, PermissionToken token) {/* ... */}
    }).check();

link : https://github.com/Karumi/Dexter

Raju Tukadiya
  • 229
  • 1
  • 8