尝试从图片读取元数据时获取FileNotFoundException(权限被拒绝)

时间:2019-05-12 20:31:27

标签: java android metadata-extractor

我正在通过我的应用访问设备画廊的图片,当访问图片时,图片的元数据将被读取并存储在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);
    }

}

1 个答案:

答案 0 :(得分:3)

从策略上看,您似乎没有you need to request in the manifest and at runtimeREAD_EXTERNAL_STORAGE权限。

除此之外:

  • 您的query()无需返回DATA

  • 不要求DATA列具有值

  • 不要求DATA列具有文件系统路径

  • 不要求DATA列中的文件系统路径是可以访问的文件,即使使用READ_EXTERNAL_STORAGE

特别是,可以确保您的代码在Android Q上失败,并且在许多其他设备上的许多用户也很可能失败。

UriimageUriContentResolver)配合使用,可以将InputStream(或者也许是FileDescriptor)传递到您的媒体库。