Android Image Viewer из приложения - PullRequest
       8

Android Image Viewer из приложения

4 голосов
/ 11 октября 2009

Я пытаюсь запустить изображение, которое записывается в каталог моего приложения с помощью встроенного средства просмотра изображений Android. Это изображение было записано в другой части приложения в каталог приложения. При получении следующего файла:

super.getFilesDir() + "/current.png"

File.exists () возвращает true.

Как запустить встроенный просмотрщик изображений Android для просмотра этого файла? В настоящее время я делаю:

File f = new File(super.getFilesDir()+"/current.png");
uri = Uri.parse("file://"+super.getFilesDir()+"/current.png");
startActivity(new Intent(Intent.ACTION_VIEW, uri));

И он продолжает набивать:

10-11 13: 09: 24.367: INFO / ActivityManager (564): запуск активность: намерение { действовать = android.intent.action.VIEW Дат = файл: ///data/data/com.davidgoemans.myapp/files/current.png } 10-11 13: 09: 24.367: ОШИБКА / myapp (2166): исключение occuredandroid.content.ActivityNotFoundException: Не найдена активность для обработки намерения { действовать = android.intent.action.VIEW Дат = файл: ///data/data/com.davidgoemans.myapp/files/current.png }

независимо от того, на что я изменяю схему uri (например, content: //, file: //, media: //, image: //).

Ответы [ 3 ]

6 голосов
/ 12 октября 2009

Одним из способов является создание поставщика контекста, чтобы другие приложения могли получить доступ к вашим данным.

Создать новый класс, содержащий:

public class FileContentProvider extends ContentProvider {
   private static final String URI_PREFIX = "content://uk.co.ashtonbrsc.examplefilecontentprovider";

   public static String constructUri(String url) {
       Uri uri = Uri.parse(url);
       return uri.isAbsolute() ? url : URI_PREFIX + url;
   }

   @Override
   public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
       File file = new File(uri.getPath());
       ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
       return parcel;
   }

   @Override
   public boolean onCreate() {
       return true;
   }

   @Override
   public int delete(Uri uri, String s, String[] as) {
       throw new UnsupportedOperationException("Not supported by this provider");
   }

   @Override
   public String getType(Uri uri) {
   throw new UnsupportedOperationException("Not supported by this provider");
   }

   @Override
   public Uri insert(Uri uri, ContentValues contentvalues) {
       throw new UnsupportedOperationException("Not supported by this provider");
   }

   @Override
   public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
       throw new UnsupportedOperationException("Not supported by this provider");
   }

   @Override
   public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
       throw new UnsupportedOperationException("Not supported by this provider");
   }

}

Добавьте контент-провайдер в свой AndroidManifest.xml:

<provider android:name=".FileContentProvider" android:authorities="uk.co.ashtonbrsc.examplefilecontentprovider" />

После этого вы сможете использовать "content://uk.co.ashtonbrsc.examplefilecontentprovider/" + the full path to the image в своем намерении ACTION_VIEW.

3 голосов
/ 11 октября 2009

Ваше изображение находится в изолированной программной среде вашего приложения, поэтому вы должны использовать ContentProvider, чтобы предоставить другим приложениям внешний доступ к данным вашего изображения. Помните, что в Android предустановленные приложения не имеют более высокого приоритета, чем сторонние приложения - вам все равно нужно дать разрешение на ваши данные, даже если вы хотите использовать приложения по умолчанию.

В противном случае взгляните на теги IntentFilter в Галерее в приложении Камера, чтобы узнать, что Intent можно использовать для открытия изображения в средстве просмотра по умолчанию.

3 голосов
/ 11 октября 2009

Вариант # 1: создайте ContentProvider для обслуживания файла из личной области вашего приложения, затем используйте ACTION_VIEW Intent для этого content:// Uri.

Опция # 2: переместите файл на SD-карту и используйте ACTION_VIEW Intent на Uri, а также с соответствующим типом MIME. Android автоматически не связывает расширения файлов с типами MIME, поэтому вам нужно указать Intent, на какой тип MIME указывает Uri. Это обрабатывается для вас "автоматически" с помощью ContentProvider.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...