Запуск намерения Intent.ACTION_VIEW не работает с сохраненным файлом изображения - PullRequest
6 голосов
/ 02 июня 2010

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

У меня есть следующий код для записи загруженного из сети растрового изображения в файл на SD-карте:

// Get image from url
URL u = new URL(url);
HttpGet httpRequest = new HttpGet(u.toURI());
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
Bitmap bmImg = BitmapFactory.decodeStream(instream);
instream.close();

// Write image to a file in sd card
File posterFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Android/data/com.myapp/files/image.jpg");
posterFile.createNewFile();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(posterFile));
Bitmap mutable = Bitmap.createScaledBitmap(bmImg,bmImg.getWidth(),bmImg.getHeight(),true);
mutable.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();

// Launch default viewer for the file
Intent intent = new Intent();                   
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(posterFile.getAbsolutePath()),"image/*");
((Activity) getContext()).startActivity(intent);

Несколько замечаний.Я создаю «изменяемое» растровое изображение после того, как увидел, что кто-то его использует, и кажется, что оно работает лучше, чем без него.И я использую метод синтаксического анализа в классе Uri, а не в fromFile, потому что в моем коде я вызываю их в разных местах, и когда я создаю намерение, у меня есть путь к строке вместо файла.

Теперьдля моей проблемы.Файл создан.Намерение запускает диалоговое окно с просьбой выбрать зрителя.У меня установлено 3 зрителя.Просмотрщик изображений Astro, медиа-галерея по умолчанию (у меня есть milstone на 2.1, но на вехе обновление 2.1 не включало 3d-галерею, так что она старая) и 3d-галерею от Nexus (я нашел apk вwild).

Теперь, когда я запускаю 3 программы просмотра, происходит следующее:

  • Программа просмотра изображений Astro: Активность запускается, но я не вижу ничего, кромечерный экран.

  • Галерея мультимедиа: Появляется диалоговое окно исключения: «Приложение Галерея мультимедиа (процесс com.motorola.gallery) неожиданно остановилось. Пожалуйста, попробуйтеснова "с опцией принудительного закрытия.

  • 3D галерея: Все работает как надо.

Когда я пытаюсьчтобы просто открыть файл с помощью файлового менеджера Astro (перейдите к нему и просто нажмите), я получаю тот же диалог параметров, но на этот раз все по-другому:

  • Просмотрщик изображений Astro: Все работает как надо.

  • Медиа-галерея: Все работает как надо.

  • 3D-галерея: Действие запускается, но я не вижу ничего, кромечерный экран.

Как видите, все в полном беспорядке.Я понятия не имею, почему это происходит, но так происходит каждый раз.Это не случайная ошибка.

Я что-то упускаю, когда создаю намерение?Или когда я создаю файл изображения?Любые идеи?

РЕДАКТИРОВАТЬ: Как отмечается в комментарии, это часть интереса в adb logcat.Также я должен отметить, что я изменил способ создания файла изображения.Поскольку я хочу создать файл, который отображает сетевой файл, я просто загружаю его вместо создания растрового изображения, а затем создаю файл (это было сделано, потому что в какой-то момент мне понадобился растровое изображение, но теперь я делаю это наоборот).проблемы сохраняются, и они абсолютно одинаковы:

I / ActivityManager (18852): начало деятельности: Intent {act = android.intent.action.VIEW dat = / sdcard / Android / data / com.myapp / files / image.jpg typ = image / * flg = 0x3800000 cmp = com.motorola.gallery / .ViewImage}

I / ActivityManager (18852): запустить процесс com.motorola.gallery:ViewImage длядеятельность com.motorola.gallery/.ViewImage: pid = 29187 uid = 10017 gids = {3003, 1015}

I / dalvikvm (29187): поток отладчика не активен, игнорируя отправку DDM (t = 0x41504e4d l =38)

I / dalvikvm (29187): поток отладчика не активен, игнорируется отправка DDM (t = 0x41504e4d l = 64)

I / ActivityManager (18852): процесс com.handcent.nextsms(pid 29174) умер.

I / ViewImage (29187): Просмотр изображения при создании!

D / AndroidRuntime (29187): завершение работы VM

W / dalvikvm(29187): threadid = 3: поток выходит с необработанным исключением (group = 0x4001b170)

E / AndroidRuntime (29187): необработанный обработчик: основной потоквыход из-за необработанного исключения

E / AndroidRuntime (29187): java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.motorola.gallery/com.motorola.gallery.ViewImage}: java.lang.NullPointerException

E / AndroidRuntime (29187): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2496)

E / AndroidRuntime (29187): в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2512)

E / AndroidRuntime (29187): в android.app.ActivityThread.access $ 2200 (ActivityThread.java:119)

E / AndroidRuntime (29187): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1863)

E / AndroidRuntime (29187): в android.os.Handler.dispatchMessage (Handler.java:99)

E / AndroidRuntime (29187): в android.os.Looper.loop (Looper.java:123)

E / AndroidRuntime (29187): в android.app.ActivityThread.main (ActivityThread.java:4363)

E / AndroidRuntime (29187): в java.lang.reflect.Method.invokeNative (Native Метод)

E / AndroidRuntime (29187): в java.lang.reflect.Method.invoke (Method.java:521)

E / AndroidRuntime (29187): в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:860)

E / AndroidRuntime (29187): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)

E / AndroidRuntime (29187): в dalvik.system.NativeStart.main (Native Метод)

E / AndroidRuntime (29187): вызвано: java.lang.NullPointerException

E / AndroidRuntime (29187): в com.motorola.gallery.ImageManager.allImages (ImageManager.java:5621)

E / AndroidRuntime (29187): в com.motorola.gallery.ImageManager.getSingleImageListByUri (ImageManager.java:5515)

E / AndroidRuntime (29187): в com.motorola.gallery.ViewImage.onCreate (ViewImage.java:1801)

E / AndroidRuntime (29187): в android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)

E / AndroidRuntime (29187): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2459)

E / AndroidRuntime (29187): ... еще 11

Ответы [ 4 ]

33 голосов
/ 09 сентября 2010

Я использовал этот хак для исправления ошибки:

...
Uri hacked_uri = Uri.parse("file://" + uri.getPath());
intent.setDataAndType(hacked_uri, "image/*");
...
4 голосов
/ 31 июля 2010

Я использовал этот код для своего приложения и работает нормально. Я только сделал небольшое изменение.

Я изменил это:

intent.setDataAndType(Uri.parse(posterFile.getAbsolutePath()),"image/*");

Для этого:

intent.setDataAndType(Uri.fromFile(posterFile),"image/*");
2 голосов
/ 10 июня 2010

Я решил создать свою собственную активность, которая просто рисует изображение на экране. Это не идеальное решение, но оно соответствует моим основным стандартам ... Это работает:)

0 голосов
/ 10 июля 2017

я использую этот код

 MediaScannerConnection.scanFile(PayamKhosusiActivity.this, new String[] { filez.toString() },
                        null, new MediaScannerConnection.OnScanCompletedListener() {
                            @Override
                            public void onScanCompleted(String path, Uri uri) {
                                Log.wtf("onScanCompleted", "yes");


                                Intent intent = new Intent(Intent.ACTION_VIEW, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                intent.setDataAndType(uri, "image/*");
                                intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); //must for reading data from directory

                                startActivity(intent);
                            }
                        });
...