Диалоговое окно запроса разрешения не появляется

Я делаю приложение для захвата изображения один раз, а затем сохраняю его на SD-карте и отображаю его в ImageView(image_view) приложения MainActivity (который обрабатывается в методе onRequestPermissionsResult()). Приложение также помогает отправить по электронной почте изображение, на которое нажал пользователь. Теперь для этого я запросил 2 разрешения:

1.) Запрос камеры

2.) Запрос внешнего хранилища

Когда приложение запускается, появляется диалоговое окно «Запрос камеры», но диалоговое окно «Запрос внешнего хранилища» не появляется, и приложение аварийно завершает работу, отображая всплывающее уведомление, поскольку Разрешения на запись во внешнее хранилище не предоставлены. Не удается сохранить файл.

Я также упомянул запросы в манифесте

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

Код для запроса разрешений

public void requestPermissions() {
    if (ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            Toast.makeText(this,
                    "External storage permission required to save images",
                    Toast.LENGTH_SHORT).show();
        }
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_EXTERNAL_STORAGE);
    }

    if (ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
        launchCamera();
    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,android.Manifest.permission.CAMERA)) {
            Toast.makeText(this,
                    "External storage permission required to save images",
                    Toast.LENGTH_SHORT).show();
        }
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.CAMERA},
                REQUEST_CAMERA);
    }
}

Вот полный код

public class MainActivity extends AppCompatActivity {

Button clickPhotoButton;
private static final String FILE_NAME="image01.jpg";
private static final int CAMERA_PIC_REQUEST = 100;
private static final int REQUEST_WRITE_EXTERNAL_STORAGE = 1;
private static final int REQUEST_CAMERA = 2;
File pictureDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Prakhar");
Uri fileUri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    clickPhotoButton = (Button) findViewById(R.id.click_photo_button);

    makeFolder();
}

public void makeFolder(){

    if(!pictureDir.exists()) {
        pictureDir.mkdirs();
    }
    Log.e("Prakhar", pictureDir.getAbsolutePath());
}

public void requestPermissions() {
    if (ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            Toast.makeText(this,
                    "External storage permission required to save images",
                    Toast.LENGTH_SHORT).show();
        }
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_EXTERNAL_STORAGE);
    }

    if (ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
        launchCamera();
    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,android.Manifest.permission.CAMERA)) {
            Toast.makeText(this,
                    "External storage permission required to save images",
                    Toast.LENGTH_SHORT).show();
        }
        ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.CAMERA},
                REQUEST_CAMERA);
    }
}


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if(requestCode == REQUEST_WRITE_EXTERNAL_STORAGE ) {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            launchCamera();
        } else {
            Toast.makeText(this,
                    "External write permission has not been granted, cannot saved images",
                    Toast.LENGTH_SHORT).show();
        }
    } else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    if(requestCode == REQUEST_CAMERA) {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            launchCamera();
        } else {
            Toast.makeText(this,
                    "External write permission has not been granted, cannot saved images",
                    Toast.LENGTH_SHORT).show();
        }
    } else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

public void onPhotoClicked(View view) {

    requestPermissions();
}

public void launchCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File image = new File(pictureDir, FILE_NAME);
    fileUri = Uri.fromFile(image);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    startActivityForResult(intent, CAMERA_PIC_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) {
        ImageView imageView = (ImageView) findViewById(R.id.image_view);
        File image = new File(pictureDir, FILE_NAME);
        fileUri = Uri.fromFile(image);
        imageView.setImageURI(fileUri);
    }
}
}

person Prakhar Singh    schedule 10.06.2017    source источник
comment
Посмотрите stackoverflow.com/questions/34342816/   -  person Euphor08    schedule 10.06.2017
comment
@ Euphor08 Хорошо, я попробую. Но у меня есть код, который похож на мой код. На самом деле методы запроса разрешений идентичны, и этот код показывает правильное поведение, а мой — нет. Должно быть, это небольшая вещь, которой не хватает в коде.   -  person Prakhar Singh    schedule 10.06.2017
comment
Активность, которую вы вызываете, расширяет AppCompatActivity и реализует ActivityCompat.OnRequestPermissionsResultCallback? Если нет, код Android просто игнорирует запрос на разрешение.   -  person tim.paetz    schedule 10.06.2017
comment
Если он игнорирует запрос на разрешение, то почему он делает это только для внешнего разрешения на запись, а не для разрешения камеры.   -  person Prakhar Singh    schedule 10.06.2017
comment
@ tim.paetz Однако я сделал то, что вы сказали, и все та же проблема. У меня есть правильная версия кода, похожая на мой код. Я могу отправить его вам по почте, если хотите   -  person Prakhar Singh    schedule 10.06.2017
comment
Вероятно, вам нужно показать больше кода. Возможно, вы неправильно используете обратный вызов onRequestPermissionsResult в ActivityCompat.OnRequestPermissionsResultCallback. Вам нужно вызвать любой код, требующий разрешений, в этом обратном вызове, а затем только при успешном обратном вызове.   -  person tim.paetz    schedule 10.06.2017
comment
@tim.paetz tim.paetz Я добавил полный код. Пожалуйста, посмотрите.   -  person Prakhar Singh    schedule 10.06.2017
comment
Удалите makeFolder из onCreate и посмотрите, решит ли это проблему. Если это так, переместите этот вызов после того, как вы получили разрешение на WRITE_EXTERNAL_STORAGE.   -  person tim.paetz    schedule 10.06.2017
comment
@tim.paetz Нет. Все еще не работает. Хотели бы вы взглянуть на правильную версию аналогичного кода.   -  person Prakhar Singh    schedule 11.06.2017
comment
У меня закончились идеи. Я определенно предлагаю использовать ответ Винаяги и запрашивать оба разрешения одновременно, а не разбивать его.   -  person tim.paetz    schedule 11.06.2017
comment
@tim.paetz Нашел. Это была действительно пустая трата времени. В файле манифеста я написал android.permissions.WRITE_EXTERNAL_STORAGE, хотя должно было быть android.permission.WRITE_EXTERNAL_STORAGE   -  person Prakhar Singh    schedule 11.06.2017


Ответы (2)


Нашел. Это была действительно пустая трата времени. В файле манифеста я написал

android.permissions.WRITE_EXTERNAL_STORAGE

однако это должно было быть

android.permission.WRITE_EXTERNAL_STORAGE
person Prakhar Singh    schedule 11.06.2017

Попробуйте так

 public void requestPermissions() {
    boolean hasStoragePermission = ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;

    boolean hasCameraPermission = ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;

    ArrayList<String> permissonList = new ArrayList();

    if (!hasCameraPermission) {
        permissonList.add(android.Manifest.permission.CAMERA)
    }

    if (!hasStoragePermission) {
        permissonList.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
    }

    if (permissonList.size() > 0) {
        String [] permissionArray = permissonList.toArray(new String[]{});

        ActivityCompat.requestPermissions(this,permissionArray,
                REQUEST_PERMISSION);
    }
}


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

    if (requestCode == REQUEST_PERMISSION) {
        boolean allPermissionGranted = true;

        for (int i =0; i < grantResults.length; i++) {
            boolean permissionGranted = grantResults[i] == PackageManager.PERMISSION_GRANTED;

            if (!permisssionGranted) {
                allPermissionGranted = false;
                break;
            }
        }


        if (allPermissionGranted) {
            launchCamera();
        }
    }
}
person VinayagaSundar    schedule 10.06.2017
comment
@PrakharSingh Я обновил код. Пожалуйста, проверьте, решает ли он вашу проблему .., - person VinayagaSundar; 10.06.2017
comment
Извините, но это все еще не работает. У меня есть правильная версия кода, похожая на мой код. Я могу отправить его вам по почте, если хотите. - person Prakhar Singh; 10.06.2017