首页 > 解决方案 > Android API 28 上的运行时权限错误(我必须重新启动我的应用程序才能显示捕获的图像)

问题描述

所以我正在制作一个应用程序,允许用户拍照,然后在 ImageView 上显示拍摄的照片。

一切对我来说都很好,我正在遵循 android 24+ 访问外部存储的新规则。 (提供程序包含在清单和 xml 文件路径中)

我的问题是当我在Android API28上测试它时

如果权限是第一次授予的,我无法显示图片。

我必须重新启动应用程序才能第一次授予获取图像路径的权限!

这是我的示例应用程序:

拍照按钮:

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);

    }

创建图像文件方法

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 进行尝试,您将永远不会获得第一次获得许可的图像。必须重新启动应用程序,这很奇怪。

标签: androidpermissionscapture

解决方案


推荐阅读