Запуск Намерения.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);
}
});