[Android] Проблемы с загрузкой галереи в HTC Desire: неверный путь? - PullRequest
0 голосов
/ 18 июля 2011

Я хочу показать галерею изображений .Проблема заключается во время их загрузки.

Сначала я загружал изображения с:

images = new File("/sdcard/DCIM/Camera/");
if(images.listFiles().length==0)
   //no images, do some other stuff...
else
   //put images in the gallery and do some stuff

Этот код работает с эмулятором (Android 2.2 - API Level 8) ис Samsung Galaxy S2 (Android 2.2.1).Но я прошу некоторых друзей проверить этот код на своих телефонах (HTC, LG ...).

Во время загрузки HTC Desire возникла проблема.Код идет в "// нет изображений", но у них есть изображения в альбоме (например, с камеры ...) Мой друг сказал мне, что:

альбом хранится во внутренней памятиа не на SD-карте с HTC.

Итак, я попытался проверить другие каталоги, например:

//Get the internal content
images = new File(MediaStore.Images.Media.INTERNAL_CONTENT_URI.getPath());

if (!images.isDirectory()) {
    //Get the external content
    images = new File(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.getPath());
}

if (!images.isDirectory()) {
    //Get the SD Card content
    images = new File("/sdcard/DCIM/Camera/");
}

Но все еще не работает :( Это нехороший каталог: /

Итак, мой вопрос: как я могу получить хороший путь для изображений со всеми телефонами Android? Является ли их объект, который может вернуть путь к альбому?

Спасибо:)

(извините за ошибки)

1 Ответ

1 голос
/ 18 июля 2011

Я сделал некоторую проверку, и похоже, что вы пытаетесь получить доступ к 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

...