2013-07-16 16 views
3

我正在嘗試創建包含視頻縮略圖的視頻詳細信息的ListView。嘗試創建視頻縮略圖時的OutOfMemory

在適配器的getView方法我調用

new ThumbnailCreatorTask(videoThumbnail).execute(path) for every row 

這是ThumbnailCreatorTask:

private class ThumbnailCreatorTask extends AsyncTask<String, Void, Bitmap>{ 

    private final WeakReference<ImageView> imageViewReference; 

    public ThumbnailCreatorTask(ImageView imageView){ 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    @Override 
    protected Bitmap doInBackground(String... params) { 
     return ThumbnailUtils.createVideoThumbnail(params[0], Thumbnails.MICRO_KIND); 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 

     if (imageViewReference != null && bitmap != null) { 
      ImageView imageView = imageViewReference.get(); 
      imageView.setImageBitmap(bitmap); 
     } 
    } 
} 

創造了一些行,我收到了以下崩潰後:

07-16 16:26:30.060: E/dalvikvm-heap(17318): 1843200-byte external allocation too large for this process. 
07-16 16:26:30.060: E/GraphicsJNI(17318): VM won't let us allocate 1843200 bytes 
07-16 16:26:30.190: E/ThumbnailUtils(17318): Got OOM error 
07-16 16:26:30.190: E/ThumbnailUtils(17318): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
07-16 16:26:30.190: E/ThumbnailUtils(17318): at  android.graphics.Bitmap.nativeCreate(Native Method) 
07-16 16:26:30.190: E/ThumbnailUtils(17318): at android.graphics.Bitmap.createBitmap(Bitmap.java:477) 
07-16 16:26:30.190: E/ThumbnailUtils(17318): at android.graphics.Bitmap.createBitmap(Bitmap.java:432) 
07-16 16:26:30.190: E/ThumbnailUtils(17318): at android.media.MediaMetadataRetriever._getFrameAtTime(Native Method) 
07-16 16:26:30.190: E/ThumbnailUtils(17318): at android.media.MediaMetadataRetriever.getFrameAtTime(MediaMetadataRetriever.java:201) 
07-16 16:26:30.190: E/ThumbnailUtils(17318): at android.media.MediaMetadataRetriever.getFrameAtTime(MediaMetadataRetriever.java:225) 
07-16 16:26:30.190: E/ThumbnailUtils(17318): at android.media.ThumbnailUtils.createVideoThumbnail(ThumbnailUtils.java:155) 

正如我認爲我的做法是完全錯誤的。應如何處理我的情況下創建的縮略圖?

回答

0

我有同樣的問題,這裏是我如何解決它:

 // the thumbnail files will be generated in the internal data folders then deleted after upload 
     String internalPath = context.getFilesDir().getAbsolutePath(); 
     // now we need the file name 
     String thumbnailFileName = internalPath + "/" + file.getName() + sizeName + THUMBNAIL_EXT; 

     ContentResolver crThumb = context.getContentResolver(); 
     String[] proj = { BaseColumns._ID, MediaColumns.DISPLAY_NAME, MediaColumns.DATA }; 
     Cursor cursor = 
       crThumb.query(
         MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
         proj, 
         MediaColumns.DISPLAY_NAME + "=?", 
         new String[] { file.getName() }, 
         null); 
     cursor.moveToFirst(); 
     long fileid = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID)); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 1; 
     Bitmap imageBitmap = 
       MediaStore.Video.Thumbnails.getThumbnail(crThumb, fileid, MediaStore.Video.Thumbnails.MICRO_KIND, options); 
     //resize 
     imageBitmap = Bitmap.createScaledBitmap(imageBitmap, sizeWidth, sizeHeight, false); 

     // output 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(BYTEARRAYOUTPUTSTREAM_BUFFER); 

     // format to jpeg quality set to 70 
     imageBitmap.compress(Bitmap.CompressFormat.JPEG, 70, baos); 
     byte[] imageData = baos.toByteArray(); 

     FileOutputStream fos = new FileOutputStream(thumbnailFileName); 
     fos.write(imageData); 
     fos.close(); 
+0

確實在UI線程此代碼運行..? – Mariusz

+0

不,絕對不是。它應該被插入到你的doInBackground函數中。它還將位圖寫入可用於緩存處理的文件。 – Gomoku7