Android 10 ACTION_GET_CONTENT изображение с информацией GPS? - PullRequest
0 голосов
/ 06 февраля 2020

Я использую ACTION_GET_CONTENT, чтобы позволить пользователю импортировать фотографии в мое приложение. Он читает данные GPS с выбранных фотографий. Он работал нормально до Android 10.

Я обнаружил, что я должен использовать MediaStore.setRequireOriginal() на URI, но getContentResolver().openFileDescriptor() выдает ошибку

SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider
...obtain access using ACTION_OPEN_DOCUMENT or related APIs

Оригинальный URI не содержит данных GPS exif.

Я добавил разрешение ACCESS_MEDIA_LOCATION, но не повезло. Фотографии импортированы, но GPS Exif потерян. android:requestLegacyExternalStorage в Манифесте, похоже, не меняет этого.

Как предполагается использовать это? Примеры ACTION_GET_CONTENT не используют данные gps из exif, а примеры MediaStore не используют ACTION_GET_CONTENT.

Мой код:

    public void openGallery(View v) {
        Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
        photoPickerIntent.setType("image/*");
        photoPickerIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        startActivityForResult(photoPickerIntent, 4);
    }
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            ...
            Uri selecteduri = data.getData();
            ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(selecteduri, "r");
            FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
            copyPhoto(fileDescriptor, localFile);
            ...
    }

еще одна неудачная попытка:

                        Uri selecteduri = data.getData();
                        Cursor cursor = getContentResolver().query(selecteduri, null, null, null, null);
                        if (cursor != null && cursor.moveToFirst()) {
                            String[] parts = cursor.getString(0).split(":");
                            Uri photoUri = Uri.withAppendedPath(
                                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, parts[1]);
                            photoUri = MediaStore.setRequireOriginal(photoUri);
                            InputStream stream = getContentResolver().openInputStream(photoUri);
                            ExifInterface exifInterface = new ExifInterface(stream);
                            double[] returnedLatLong = exifInterface.getLatLong();
                            stream.close();
                        }

getLatLong по-прежнему возвращает ноль


Обновление:

Использование ACTION_OPEN_DOCUMENT возвращает тот же Uri. MediaStore.setRequireOriginal () просто добавляет ?requireOriginal=1 к нему и openFileDescriptor генерирует Отказ в разрешении, если я не открываю его как MediaStore.Images.Media.EXTERNAL_CONTENT_URI + id с помощью setRequireOriginal (), который все еще удаляет информацию GPS.

...