Я пытался реализовать разрешения во время выполнения.Ниже приведен фрагмент кода для этого:
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 для камеры. Скорее, диалоговое окно закрывается и снова отображает активность.
Может кто-нибудь помочь мне с этим или указать способчтобы преодолеть это