尝试从图片中读取元数据时获取 FileNotFoundException(权限被拒绝)
Getting FileNotFoundException (Permission denied) when trying to read metadata from a picture
我正在通过我的应用程序访问设备图库中的图片,当访问图片时,图片的元数据将被读取并存储在 metadata
中。我面临的问题是,每当程序尝试读取元数据时,我都会收到以下错误 java.io.FileNotFoundException: /storage/emulated/0/Snapchat/Snapchat-1185425082.jpg (Permission denied)
.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode == PICK_IMAGE){
imageUri = data.getData();
imageView.setImageURI(imageUri);
File picturesfile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
picturesfile.setReadable(true);
picturesfile.setExecutable(true);
String[] projection = {MediaStore.Images.Media.DATA};
try {
Cursor cursor = getContentResolver().query(imageUri, projection, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(projection[0]);
path = cursor.getString(columnIndex);
Log.d("Picture Path", path);
}
catch(Exception e) {
Log.e("Path Error", e.toString());
}
File jpegFile = new File(path);
jpegFile.setReadable(true);
jpegFile.setExecutable(true);
try {
metadata = ImageMetadataReader.readMetadata(jpegFile);
for (Directory directory : metadata.getDirectories()) {
for (Tag hoi : directory.getTags()) {
Log.d("tags ", hoi.toString());
}
}
} catch (ImageProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if(resultCode == RESULT_OK && requestCode == 0){
Bitmap bitmap = (Bitmap)data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
}
}
从战术上讲,您似乎没有 READ_EXTERNAL_STORAGE
权限,you need to request in the manifest and at runtime。
除此之外:
您的 query()
到 return 一个 DATA
列没有要求
不要求 DATA
列具有值
不要求 DATA
列具有文件系统路径
没有要求 DATA
列中的文件系统路径是您可以访问的文件,即使 READ_EXTERNAL_STORAGE
特别是,保证您的代码在 Android Q 上会失败,并且对于许多其他设备上的许多用户来说也很可能会失败。
使用 Uri
(imageUri
) 和 ContentResolver
得到一个 InputStream
(或者可能是 FileDescriptor
)传递给你的图书馆。
我正在通过我的应用程序访问设备图库中的图片,当访问图片时,图片的元数据将被读取并存储在 metadata
中。我面临的问题是,每当程序尝试读取元数据时,我都会收到以下错误 java.io.FileNotFoundException: /storage/emulated/0/Snapchat/Snapchat-1185425082.jpg (Permission denied)
.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode == PICK_IMAGE){
imageUri = data.getData();
imageView.setImageURI(imageUri);
File picturesfile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
picturesfile.setReadable(true);
picturesfile.setExecutable(true);
String[] projection = {MediaStore.Images.Media.DATA};
try {
Cursor cursor = getContentResolver().query(imageUri, projection, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(projection[0]);
path = cursor.getString(columnIndex);
Log.d("Picture Path", path);
}
catch(Exception e) {
Log.e("Path Error", e.toString());
}
File jpegFile = new File(path);
jpegFile.setReadable(true);
jpegFile.setExecutable(true);
try {
metadata = ImageMetadataReader.readMetadata(jpegFile);
for (Directory directory : metadata.getDirectories()) {
for (Tag hoi : directory.getTags()) {
Log.d("tags ", hoi.toString());
}
}
} catch (ImageProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if(resultCode == RESULT_OK && requestCode == 0){
Bitmap bitmap = (Bitmap)data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
}
}
从战术上讲,您似乎没有 READ_EXTERNAL_STORAGE
权限,you need to request in the manifest and at runtime。
除此之外:
您的
query()
到 return 一个DATA
列没有要求不要求
DATA
列具有值不要求
DATA
列具有文件系统路径没有要求
DATA
列中的文件系统路径是您可以访问的文件,即使READ_EXTERNAL_STORAGE
特别是,保证您的代码在 Android Q 上会失败,并且对于许多其他设备上的许多用户来说也很可能会失败。
使用 Uri
(imageUri
) 和 ContentResolver
得到一个 InputStream
(或者可能是 FileDescriptor
)传递给你的图书馆。