Запуск Намерения.Action VIEW intent не работает с сохраненным файлом изображения

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

У меня есть следующий код для записи растрового изображения, загруженного из сети в файл на 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);

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

теперь моя проблема. Файл будет создан. Intent запускает диалоговое окно с просьбой выбрать средство просмотра. Я установил 3 зрителей. Astro Image viewer, медиа-галерея по умолчанию (у меня есть milstone на 2.1, но на вехе обновление 2.1 не включало 3D-галерею, поэтому она старая) и 3D-галерея из nexus one (я нашел apk в дикой природе.)

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

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

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

  • 3Д галерея: все работает как должен.

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

  • Astro просмотра изображений: все работает как надо.

  • Медиа-Галерея: все работает как должен.

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

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

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

EDIT: как отмечено в комментарии, здесь есть часть интереса к ADB logcat. Также я следует отметить, что я изменил способ создания файла изображения. Поскольку я хочу создать файл, который отражает онлайн-файл, я просто загружаю его вместо создания растрового изображения, а затем создаю файл (это было сделано, потому что в какой-то момент мне нужно было растровое изображение, но теперь я делаю это наоборот). проблемы упорствуют в мысли и остаются точно такими же:

I / ActivityManager (18852): Запуск деятельность: намерение { act=android.намерение.действие.ВИД dat= / sdcard / Android / data / com.приложение/Файлы/изображения.формат jpg typ=изображение / * flg=0x3800000 cmp=com.компания Motorola.галерка./ViewImage }

I / ActivityManager (18852): запустить proc com.компания Motorola.галерея:ViewImage для деятельность com.компания Motorola.галерка./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.хорошо.nextsms (pid 29174) имеет умерший.

I / ViewImage (29187): В Виде Изображения метод onCreate!

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

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

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

E / AndroidRuntime(29187): Ява.ленг.RuntimeException: невозможно начать действие ComponentInfo{com.компания Motorola.галерея/ком.компания Motorola.галерея.ViewImage}: Ява.ленг.Исключение NullPointerException

E / AndroidRuntime (29187): at андроид.приложение.ActivityThread.performLaunchActivity (ActivityThread.java: 2496)

E / AndroidRuntime (29187): at андроид.приложение.ActivityThread.handleLaunchActivity (ActivityThread.java: 2512)

E / AndroidRuntime (29187): at андроид.приложение.ActivityThread.доступ к$2200 (ActivityThread.java: 119)

E / AndroidRuntime (29187): at андроид.приложение.ActivityThread$H. handleMessage (ActivityThread.java: 1863)

E / AndroidRuntime (29187): at андроид.ОС.Обработчик.dispatchMessage(обработчика.java: 99)

E / AndroidRuntime (29187): at андроид.ОС.Петлитель.петля (Looper.на Java:123)

E / AndroidRuntime (29187): at андроид.приложение.ActivityThread.main (ActivityThread.java: 4363)

E / AndroidRuntime (29187): at Ява.ленг.отражать.Метод.invokeNative (родной Метод)

E / AndroidRuntime (29187): at Ява.ленг.отражать.Метод.метод Invoke.java: 521)

E / AndroidRuntime (29187): at com.андроид.внутренний.ОС.ZygoteInit$MethodAndArgsCaller.беги(Зайготейнит.java: 860)

E / AndroidRuntime (29187): at com.андроид.внутренний.ОС.Зиготейнит.main (ZygoteInit.java: 618)

E / AndroidRuntime (29187): at далвик.система.NativeStart.основной(родной Метод)

E / AndroidRuntime (29187): вызвано: Ява.ленг.Исключение NullPointerException

E / AndroidRuntime (29187): at com.компания Motorola.галерея.ImageManager.allImages(ImageManager.java: 5621)

E / AndroidRuntime (29187): at com.компания Motorola.галерея.ImageManager.getSingleImageListByUri (ImageManager.java: 5515)

E / AndroidRuntime (29187): at com.компания Motorola.галерея.ViewImage.onCreate (ViewImage.java: 1801)

E / AndroidRuntime (29187): at андроид.приложение.Аппаратура.callActivityOnCreate(контрольно-измерительные приборы.java: 1047)

E / AndroidRuntime (29187): at андроид.приложение.ActivityThread.performLaunchActivity (ActivityThread.java: 2459)

E / AndroidRuntime(29187): ... 11 более

4 ответов


я использовал этот хак, чтобы исправить ошибки:

...
Uri hacked_uri = Uri.parse("file://" + uri.getPath());
intent.setDataAndType(hacked_uri, "image/*");
...

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

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

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

для этого:

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

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


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

 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);
                            }
                        });