Android - диалоговое окно запроса разрешения не появляется после requestPermissions (активность, разрешения [], requestCode) - PullRequest
0 голосов
/ 21 сентября 2018

Я пытался реализовать разрешения во время выполнения.Ниже приведен фрагмент кода для этого:

RunTimePermissionsUtil.java

package com.orgzit.android.util;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;

public class RuntimePermissionsUtil {

private static boolean shouldAskPermission() {
    return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
}

private static boolean shouldAskPermission(Context context, String permission) {
    if (shouldAskPermission()) {
        int permissionGrantedResult = ActivityCompat.checkSelfPermission(context, permission);
        return !(permissionGrantedResult == PackageManager.PERMISSION_GRANTED);
    }
    return false;
}

//TODO Karan 2018-09-20 Still need to investigate on the behaviour of storing in SharedPreferences whether I have asked for the permission before or not
public static void checkPermission(Context context, String permission, AskPermissionListener permissionListener) {
    if (shouldAskPermission(context, permission)) {
        if (!ActivityCompat.shouldShowRequestPermissionRationale(((Activity)context), permission)) {
            permissionListener.onNeedPermission();
        } else {
            permissionListener.onPermissionDisabled();
        }
    } else {
        permissionListener.onPermissionGranted();
    }
}

public interface AskPermissionListener {

    void onPermissionGranted();

    void onNeedPermission();

    void onPermissionDisabled();
}
}

Далее внутри действия, AddFileActivity , я реализую этот слушательна событии Click, код для того же:

public class AddFileActivity extends DrawerActivity {

private static final int CAMERA_REQ_CODE = 1001;
private static final int FILE_SELECT_REQ_CODE = 1002;

private Activity activity;

private RuntimePermissionsUtil.AskPermissionListener askPermissionListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activity = this;
    init();
    getSupportActionBar().setTitle("Add File");

    askPermissionListener = new RuntimePermissionsUtil.AskPermissionListener() {
        @Override
        public void onPermissionGranted() {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            cameraFileUri = getCameraFileUri();
            intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraFileUri);
            startActivityForResult(intent, CAMERA_REQ_CODE);
        }

        @Override
        public void onNeedPermission() {
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, CAMERA_REQ_CODE);
        }

        @Override
        public void onPermissionDisabled() {
            Toast.makeText(activity,"App does not have the permission to Open Camera :(", Toast.LENGTH_LONG).show();
        }
    };
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    Log.d("q","q");
}

private void init() {
            showFileChooser();
}


private void showFileChooser() {
    final CharSequence[] items = {"Open camera", "Select from device",
            "Cancel"};
    AlertDialog.Builder builder = new AlertDialog.Builder(AddFileActivity.this);
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals("Open camera")) {
                RuntimePermissionsUtil.checkPermission(activity, Manifest.permission.CAMERA, askPermissionListener);
                Log.d("d","d");
            } else if (items[item].equals("Select from device")) {
                //DO SOMETHING
            } else if (items[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}

Итак, весь мой код выполняется и переходит в код onNeedPermissions (), где он переходит к

ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, CAMERA_REQ_CODE);

Но после этого, как ни странно, нет диалогового окна, запрашивающего разрешение RunTime для камеры. Скорее, диалоговое окно закрывается и снова отображает активность.

Может кто-нибудь помочь мне с этим или указать способчтобы преодолеть это

1 Ответ

0 голосов
/ 21 сентября 2018

Причины, по которым диалоговое окно запроса на разрешение не появляется:

  • Либо разрешение уже предоставлено.
  • Или были установлены разрешения на повторный запрос.
  • Или вы не объявили разрешение в своем манифесте.

Во всех случаях onRequestPermissionsResult() вызывается немедленно, без отображения диалога.Убедитесь, что он вызывается, а также проверьте результаты.

Вместо того, чтобы писать свой собственный класс утилит, я предлагаю вам взглянуть на мою библиотеку: https://github.com/nabinbhandari/Android-Permissions

...