Ошибка разрешения времени выполнения на Android API 28 (мне нужно перезапустить приложение, чтобы отобразить захваченное изображение) - PullRequest
0 голосов
/ 24 июня 2018

, поэтому я создаю приложение, которое позволяет пользователю делать снимки, а затем отображать сделанные снимки в ImageView.

У меня все отлично работает, я следую новым правилам для Android 24+ для доступа к внешнему хранилищу. (провайдер включен в путь манифеста и XML-файла)

моя проблема в том, когда я тестирую его на Android API28

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

Мне нужно перезапустить приложение, чтобы впервые получить разрешения для получения пути к изображению!

вот мой пример приложения:

Кнопка TakePhoto:

private String[] permissions =  {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA};

public void onTakePhotoClicked(View v){
if (!hasPermissions())
requestPermissions(permissions,CAPTURE_PERM_REQ_CODE);
else
 invokeCamera();
}

обработка запрошенных разрешений

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

  if(requestCode == CAPTURE_PERM_REQ_CODE && grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED){

       invokeCamera();

}

метод захвата

private void invokeCamera() {
        // create the image Uri

   Uri pictureUri;
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
        pictureUri = FileProvider.getUriForFile(getApplicationContext(),getPackageName() + ".provider",createImageFile());
         else
            pictureUri = Uri.fromFile(getImageFile());
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            // tell the camera where to save
        intent.putExtra(MediaStore.EXTRA_OUTPUT,pictureUri);


            // permission for saving the image
        intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

        startActivityForResult(intent,1144);

    }

метод createImageFile

private File getImageFile() {

  File picturesDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);


  String imgName = "picture_JustForTest0X0X.jpg";

  return new File(picturesDirectory.getPath(), imgName);

}

Активность для результата

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

  if (requestCode == CAPTURE_REQ_CODE && resultCode == RESULT_OK){


     Bitmap bitmap = BitmapFactory.decodeFile(getImageFile().getPath());
     ImageView imageView = findViewById(R.id.imageView);
     imageView.setImageBitmap(bitmap);

}

}

Пожалуйста, попробуйте это с Android API28, вы никогда не получите изображение при первом разрешении. необходимо перезапустить приложение, это странно.

...