Получение FileNotFoundException (Permission denied) при попытке прочитать метаданные с картинки - PullRequest
0 голосов
/ 12 мая 2019

Я получаю доступ к изображениям галереи устройства через мое приложение, когда к нему обращаются, метаданные изображения будут считаны и сохранены в 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 Ответ

3 голосов
/ 12 мая 2019

Тактически может показаться, что у вас нет разрешения READ_EXTERNAL_STORAGE, которое необходимо запрашивать в манифесте и во время выполнения .

Помимо этого:

  • Для вашего query() не требуется возвращать DATA столбец

  • Не требуется, чтобы столбец DATA имел значение

  • Не требуется, чтобы столбец DATA имел путь к файловой системе

  • Не требуется, чтобы путь к файловой системе в столбце DATA был файлом, к которому можно получить доступ, даже с READ_EXTERNAL_STORAGE

В частности, гарантируется, что ваш код не будет работать на Android Q, и очень вероятно, что он выйдет из строя для многих пользователей на многих других устройствах.

Используйте Uri (imageUri) с ContentResolver, чтобы получить InputStream (или, возможно, FileDescriptor) для передачи в вашу библиотеку.

...