Android: изображение из ресурсов, сохраненных как растровое изображение, повреждено - PullRequest
0 голосов
/ 09 декабря 2011

Я пытаюсь взять изображение из ресурсов (у ресурсов, которые нельзя нарисовать, чтобы иметь подпапки из-за большого количества изображений), и хочу, чтобы оно открывалось с намерением ACTION_VIEW.Так как я не знаю другого способа, я пытаюсь взять изображение как растровое изображение, сохранить в кэш-память в виде файла jpg, открывать и удалять, когда оно закрыто.(Есть ли другой способ?)

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

Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
AssetManager mngr = getAssets();
                try {
                    InputStream is2 = mngr.open(type+"/"+type+""+mRowId+".jpg");
                    Bitmap bitmap = BitmapFactory.decodeStream(is2);
                    image.setImageBitmap(bitmap);
                    OutputStream outStream = null;
                    File file = new File(ShowActivity.this.getCacheDir(), type+""+mRowId+".jpg");
                    outStream = new FileOutputStream(file);


                      boolean compressed = bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outStream);
                       outStream.flush();
                       outStream.close();


                } catch (final IOException e) {
                    e.printStackTrace();
                }

                String patht = ShowActivity.this.getCacheDir().getName() + File.separatorChar+type+""+mRowId+".jpg";
                intent.setDataAndType(Uri.fromFile(new File(patht)), "image/jpg");
                startActivity(intent);

РЕДАКТИРОВАТЬ:

кажется, что код работает, но я получаю следующую ошибку в logcat:

12-09 15:17:02.568: INFO/ActivityManager(61): Starting: Intent                    { 
act=android.intent.action.VIEW dat=file:///cache/12.jpg typ=image/jpeg cmp=com.android.gallery/com.android.camera.ViewImage } from pid 378
12-09 15:17:02.728: ERROR/UriImage(389): got exception decoding bitmap
12-09 15:17:02.728: ERROR/UriImage(389): java.lang.NullPointerException
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.Util.makeInputStream(Util.java:336)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.Util.makeBitmap(Util.java:307)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.Util.makeBitmap(Util.java:299)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.gallery.UriImage.fullSizeBitmap(UriImage.java:94)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.gallery.UriImage.fullSizeBitmap(UriImage.java:86)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.gallery.UriImage.thumbBitmap(UriImage.java:120)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.ImageGetter$ImageGetterRunnable.executeRequest(ImageGetter.java:173)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.ImageGetter$ImageGetterRunnable.run(ImageGetter.java:149)
12-09 15:17:02.728: ERROR/UriImage(389):     at java.lang.Thread.run(Thread.java:1019)
12-09 15:17:02.728: ERROR/UriImage(389): got exception decoding bitmap 
12-09 15:17:02.728: ERROR/UriImage(389): java.lang.NullPointerException
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.Util.makeInputStream(Util.java:336)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.Util.makeBitmap(Util.java:307)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.Util.makeBitmap(Util.java:299)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.gallery.UriImage.fullSizeBitmap(UriImage.java:94)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.ImageGetter$ImageGetterRunnable.executeRequest(ImageGetter.java:204)
12-09 15:17:02.728: ERROR/UriImage(389):     at com.android.camera.ImageGetter$ImageGetterRunnable.run(ImageGetter.java:149)
12-09 15:17:02.728: ERROR/UriImage(389):     at java.lang.Thread.run(Thread.java:1019)
12-09 15:17:03.717: INFO/ActivityManager(61): Displayed com.android.gallery/com.android.camera.ViewImage: +1s58ms

1 Ответ

1 голос
/ 11 декабря 2011

Получил работу, сохранение в SD не имеет значения.Оказалось, что код был в порядке, но FilOutputStream создает файл с разрешениями по умолчанию, которые ACTION_VIEW не может открыть.Помогло изменение FileOutputStream на openFileOutput:

InputStream is2 = mngr.open(type+"/"+type+""+mRowId+".jpg");
                    Log.v(TAG, type+" "+mRowId);
                    Bitmap bitmap = BitmapFactory.decodeStream(is2);
                    FileOutputStream outStream = openFileOutput(type+""+mRowId+"cache.jpg", MODE_WORLD_READABLE);
                    boolean compressed = bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outStream);
                    jpg = getFileStreamPath(type+""+mRowId+"cache.jpg");
                    outStream.close();

...

                 intent.setDataAndType(Uri.fromFile(jpg), "image/jpeg");
...