Я сделал некоторую проверку, и похоже, что вы пытаетесь получить доступ к MediaStore неправильно. Доступ к нему осуществляется через курсор, а не напрямую как файл.
Это потому, что, как упоминалось в http://developer.android.com/guide/topics/providers/content-providers.html
Поставщики контента представляют свои данные в виде простой таблицы в модели базы данных, где каждая строка представляет собой запись, а каждый столбец представляет собой данные определенного типа и значения.
Таким образом, вы не можете прочитать URI как файл. Это таблица данных.
Вот пример с той же страницы о том, как получить к нему доступ.
import android.provider.Contacts.People;
import android.content.ContentUris;
import android.net.Uri;
import android.database.Cursor;
// Use the ContentUris method to produce the base URI for the contact with _ID == 23.
Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI, 23);
// Alternatively, use the Uri method to produce the base URI.
// It takes a string rather than an integer.
Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI, "23");
// Then query for this specific record:
Cursor cur = managedQuery(myPerson, null, null, null, null);
Кроме того, вот еще один вопрос Stackoverflow, в котором есть несколько примеров, показывающих, как использовать курсор.
Как сделать запрос к поставщику контента Android MediaStore, избегая потерянных изображений?
Наконец, основываясь на приведенных выше ссылках, я бы просто использовал объект mediastore в качестве курсора на всех устройствах, и это решит проблему, возникающую в разных каталогах.
Надеюсь, это поможет,
George