Я использую 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.