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