2015-06-04 10 views
0

У меня есть приложение для обработки изображений. В моем коде я передаю свою службу 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 (и, возможно, больше, чем они)? Спасибо

ответ

1

поэтому я решил, что хороший путь будет преобразовывать эти идентификаторы URI, возвращаемые действием отправки на реальные пути к файлам

То есть так не хороший способ пойти.

Как я уже указывал несколько раз сегодня, и десятки раз в десятки раз за последние месяцы, a Uri is not a file. Вы не можете надежно получить локальный путь к файлу для Uri. Там может быть не локальный путь, не говоря уже о том, к которому вы можете получить доступ.

Если вы хотите использовать контент, представленный Uri, используйте getContentResolver().openInputStream() или вещи, которые, в свою очередь, его используют (например, Picasso для загрузки изображения).

+0

Дело в том, что для моего приложения мне нужно получить доступ к данным EXIF ​​с фотографии, но класс ExifInterface имеет только конструктор имени файла –

+0

@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

+0

@CommonsWare У меня почти такая же проблема. Я пытаюсь получить фактический путь к файлу из Uri, поэтому я могу поместить его в файл и загрузить его. Я использовал 'uri.getLastPathSegment()', но не повезло. есть идеи? – kevoroid

Смежные вопросы