2013-04-11 13 views
7

wyślę zamiar uruchomić kameręTworzenie miniatur z plików wideo zwraca null bitmapy

PackageManager pm = getPackageManager(); 
    if(pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 
      Intent video = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
      File tempDir= new File(Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES), "BCA"); 
      if(!tempDir.exists()) 
      { 
       if(!tempDir.mkdir()){ 
        Toast.makeText(this, "Please check SD card! Image shot is impossible!", Toast.LENGTH_SHORT).show(); 
       } 
      } 

       String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.US).format(new Date()); 
       File mediaFile = new File(tempDir.getPath() + File.separator + 
       "VIDEO_"+ timeStamp + ".mp4"); 
       Uri videoUri = Uri.fromFile(mediaFile); 
       video.putExtra(MediaStore.EXTRA_OUTPUT, videoUri); 
       video.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
       startActivityForResult(video, VIDEO_REQUEST); 

    }else{ 
     Toast.makeText(this, "This device does not have a rear facing camera",Toast.LENGTH_SHORT).show(); 
    } 

biorę video i robi się zapisać poprawnie, gdy onActivityResult wylecieć używam zamiar uzyskać uri gdzie jego przechowywane stworzyć bitmapę

jest przykładem uri file:///storage/emulated/0/Pictures/BCA/VIDEO_20131227_145043.mp4

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(intent.getDataString(), MediaStore.Video.Thumbnails.MICRO_KIND); 

ale bitmapy jest null za każdym razem. Więc odkąd doktorzy mówią: May return null if the video is corrupt or the format is not supported Sprawdzam wideo w katalogu i gra dobrze plus jego plik .mp4, który jest obsługiwany, więc co ja tu robię źle?

+0

Witam, mam nadzieję, że to rozwiązałeś. Proszę, podziel się. Ja też stawiam czoła temu samemu problemowi –

Odpowiedz

1

użycie tego pliku "MediaFile" i przekształcić go w URI

 Uri uri=Uri.fromFile(mediaFile); 

Następnie przekazać tę URI w poniższej metody. To działa dobrze u mego boku.

Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(uri.getPath(), MediaStore.Video.Thumbnails.MICRO_KIND); 

Mam nadzieję, że to ci pomoże.

+0

Przepraszam, że zadziałało – tyczj

2

Jak pamiętam, argument filePath z createVideoThumbnail powinien być klasyczną ścieżką, a nie URI.

... 

Uri videoUri = intent.getData(); 
final String realFilePath = getRealPathFromUri(); 
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(realFilePath, MediaStore.Video.Thumbnails.MICRO_KIND); 
... 

public String getRealPathFromURI(final Uri contentURI) { 
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null); 
    if (cursor == null) { // Source is Dropbox or other similar local file path 
     return contentURI.getPath(); 
    } else { 
     cursor.moveToFirst(); 
     int idx = cursor.getColumnIndex(MediaStore.MediaColumns.DATA); 
     if (idx == -1) { 
      return contentURI.getPath(); 
     } 
     String rvalue = cursor.getString(idx); 
     cursor.close(); 
     return rvalue; 
    } 
} 

EDIT:

podstawie kodu źródłowego createVideoThumbnail stworzyłem kolejny realizacji:

public static Bitmap createVideoThumbnail(Context context, Uri uri, int kind) { 
    Bitmap bitmap = null; 
    MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
    try { 
     retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); 
     retriever.setDataSource(context, uri); 
     bitmap = retriever.captureFrame(); 
    } catch (IllegalArgumentException ex) { 
     // Assume this is a corrupt video file 
    } catch (RuntimeException ex) { 
     // Assume this is a corrupt video file. 
    } finally { 
     try { 
      retriever.release(); 
     } catch (RuntimeException ex) { 
      // Ignore failures while cleaning up. 
     } 
    } 
    if (kind == Images.Thumbnails.MICRO_KIND && bitmap != null) { 
     bitmap = ThumbnailUtils.extractThumbnail(bitmap, 
       ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL, 
       ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL, 
       ThumbnailUtils.OPTIONS_RECYCLE_INPUT); 
    } 
    return bitmap; 
} 
+0

Dowiedziałem się, że jeśli nie podam mu ścieżki do miejsca, w którym chcę zapisać wideo, otrzymam "ContentProvider Uri", gdzie mogę użyć tej metody, aby uzyskać miniaturkę 'MediaStore.Video.Thumbnails.getThumbnail (getContentResolver(), id, MediaStore.Video.Thumbnails.MICRO_KIND, opcje);' ale chcę podać ścieżkę, aby moi użytkownicy mogli łatwo znaleźć wideo – tyczj

0

I w obliczu tego problemu i rozwiązać go w ten sposób:

  1. Tworzenie FileUtils klasy, które znaleźć ścieżkę pliku dla ciebie (nie mogę znaleźć odniesienie do klasy tak I stworzył GIST)

    String correctedUri = FileUtils.getPath(mContext, Uri.parse(localUri)); 
    
  2. użyć poniższy kod

    Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(correctedUri, MediaStore.Video.Thumbnails.MICRO_KIND); 
    

edycja: Zobacz this rozwiązanie to ma lepszą wydajność i łatwiejsze.