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