Запрос разрешений в Android - PullRequest
       3

Запрос разрешений в Android

0 голосов
/ 01 августа 2020

Я пытаюсь запросить 2 разрешения, когда приложение открывается. Он работает нормально, но когда пользователь выбирает «Никогда больше не спрашивать», всплывающее сообщение должно отображаться один раз. Тостовое сообщение постоянно появляется и не прекращается. Я не могу понять причину этого.

public void checkPermission(final Context context) {
    if(ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE) || ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.CAMERA)) {
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);
        }
        else {
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "Both permissions granted", Toast.LENGTH_SHORT).show();
    } else {
        checkPermission(this);
    }
    if (requestCode == 1) {
        for (int i = 0, len = permissions.length; i < len; i++) {
            String permission = permissions[i];
            boolean showRationale;
            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                showRationale = shouldShowRequestPermissionRationale(permission);
                if (!showRationale) {
                    Toast.makeText(this, "Denied", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    }

Выше приведен код, который проверяет разрешения.

Я хотел бы знать, почему всплывающее сообщение никогда не перестает появляться.

1 Ответ

0 голосов
/ 01 августа 2020

Попробуйте следующий код -

public class MainActivity extends AppCompatActivity{

    private static final int STORAGE_PERMISSION_REQ_CODE = 1001;
    private static final int CAMERA_PERMISSION_REQ_CODE = 1002;
    private static final int BOTH_PERMISSION_REQ_CODE = 1003;
    ...........

    private void checkPermission(){
        if(hasBothPermission()){
            // Has both permission
        }
        else if(hasReadStoragePermission(READ_EXTERNAL_STORAGE))
            // Has Storage Permission request Camera Permission
            requestPermissions(new String[]{CAMERA}, CAMERA_PERMISSION_REQ_CODE);
    
        else if(hasCameraPermission(CAMERA))
            // Has Camera Permission request Storage Permission
            requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQ_CODE);
        else
            // Request Both Permission
            requestPermissions(new String[]{READ_EXTERNAL_STORAGE, CAMERA},BOTH_PERMISSION_REQ_CODE);
    }
    
    private boolean hasBothPermission(){
        return (ContextCompat.checkSelfPermission(this, CAMERA) == PackageManager.PERMISSION_GRANTED) &&
                ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
    }
    
    private boolean hasCameraPermission(String perm) {
        return (ContextCompat.checkSelfPermission(this, perm) == PackageManager.PERMISSION_GRANTED);
    }
    
    private boolean hasReadStoragePermission(String perm) {
        return (ContextCompat.checkSelfPermission(this, perm) == PackageManager.PERMISSION_GRANTED);
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode == STORAGE_PERMISSION_REQ_CODE){
            if(hasReadStoragePermission(READ_EXTERNAL_STORAGE))
                Toast.makeText(this, "Storage Permission Granted", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(this, "Storage Permission Failed, Request Again", Toast.LENGTH_SHORT).show();
    
        }
        else if(requestCode == CAMERA_PERMISSION_REQ_CODE){
            if(hasCameraPermission(CAMERA))
                Toast.makeText(this, "Camera Permission Granted", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(this, "Camera Permission Failed, Request Again", Toast.LENGTH_SHORT).show();
        }
        else {
            if(hasBothPermission())
                Toast.makeText(this, "Permission Granted Success", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(this, "Permission Failed Request Permission Again", Toast.LENGTH_SHORT).show();
        }
    }
    ...........
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...