У меня есть приложение для обработки изображений. В моем коде я передаю свою службу ArrayList, и служба делает все остальное. Теперь я хочу расширить функциональность своего приложения и позволить пользователям иметь возможность перейти в галерею, выбрать одно изображение и, используя кнопку совместного доступа, отправить его в мое приложение для обработки. Я хочу использовать как можно больше кода, поэтому я решил, что хорошим способом будет преобразование этих URI, возвращаемых действием отправки в реальные пути к файлам. Мое решение работает с QuickPic, но не с Google Фото. Мой код выглядит следующим образом:Android - Получение пути к файлу из URI
//MainFragment.onCreateView()
Intent intent = getActivity().getIntent();
if(Intent.ACTION_SEND.equals(intent.getAction()) {
handleSingleImage(intent);
}
private void handleSingleImage(Intent intent) {
Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
Log.d("MYURISTRING", uri.toString());
ArrayList<String> selectedPaths = new ArrayList<String>();
String path = Utils.getRealPathFromURI(getActivity(), uri);
selectedPaths.add(path);
Utils.startProcessPhotosService(getActivity(), MainFragment.this, selectedPaths);
}
//Utils
public static String getRealPathFromURI(Context context, Uri contentUri) {
/*String[] proj = {MediaStore.Images.Media.DATA};
CursorLoader cursorLoader = new CursorLoader(context, contentUri, proj, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(columnIndex);*/
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(contentUri, null, null, null, null);
cursor.moveToFirst();
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
cursor.close();
return path;
}
Если я проверить это с фото из QuickPic приложения, все работает, как ожидалось, и URI на бревне выглядит следующим образом:
content://media/external/images/media/135695
Но если я проверяю это с помощью Google Фото, мое приложение аварий, и URI выглядит следующим образом:
content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F135669/ACTUAL
Как я могу сделать, чтобы поддержать оба стиля URI (и, возможно, больше, чем они)? Спасибо
Дело в том, что для моего приложения мне нужно получить доступ к данным EXIF с фотографии, но класс ExifInterface имеет только конструктор имени файла –
@ErnestinaJuan: Итак, используйте другой код чтения EXIF. Черт возьми, у Google не меньше * трех * реализаций кода EXIF на Android, а ExifInterface - только один. Моя библиотека камеры использует [код EXIF, выбитый из приложения Mms] (https://github.com/commonsguy/cwac-camera/tree/master/camera/src/com/android/mms/exif). И специально для заголовка ориентации приложение камеры имеет [еще одну реализацию EXIF] (http://stackoverflow.com/questions/5468098/reading-exif-data-from-byte-array-in-android/13581324#13581324) , – CommonsWare
@CommonsWare У меня почти такая же проблема. Я пытаюсь получить фактический путь к файлу из Uri, поэтому я могу поместить его в файл и загрузить его. Я использовал 'uri.getLastPathSegment()', но не повезло. есть идеи? – kevoroid