Getting FileNotFoundException (Permission denied) when trying to read metadata from a picture

我只是一个虾纸丫 提交于 2019-12-24 09:07:58

问题


I am accessing pictures of the device's gallery via my app, when the picture is accessed the metadata of the picture will be read and stored in metadata. The problem I'm facing is that whenever the program tries to read the metadata I'm getting the following error 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:


Tactically, it would appear that you do not have the READ_EXTERNAL_STORAGE permission, which you need to request in the manifest and at runtime.

Beyond that:

  • There is no requirement for your query() to return a DATA column

  • There is no requirement that the DATA column have a value

  • There is no requirement that the DATA column have a filesystem path

  • There is no requirement that the filesystem path in the DATA column be a file that you can access, even with READ_EXTERNAL_STORAGE

In particular, it is guaranteed that your code will fail on Android Q, and it is very likely to fail for lots of users on lots of other devices as well.

Use the Uri (imageUri) with ContentResolver to get an InputStream (or perhaps a FileDescriptor) to pass to your library.



来源:https://stackoverflow.com/questions/56103231/getting-filenotfoundexception-permission-denied-when-trying-to-read-metadata-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!