โซลูชันนี้จะใช้ได้กับ Android เวอร์ชันใดก็ได้ ได้รับการพิสูจน์แล้วว่าทำงานใน 1.5 และ 2.2 นี่ไม่ใช่โซลูชัน "นี่สำหรับ Android 2.0+" อีก ฉันพบสิ่งนี้ผ่านทางหน้าคอลเลกชันกระดานข้อความอีเมลและไม่พบลิงก์ต้นฉบับ เครดิตทั้งหมดไปที่โปสเตอร์ต้นฉบับ
ในแอปของคุณคุณจะใช้สิ่งนี้โดยโทร:
Bitmap bm = getVideoFrame(VideoStringUri)
ที่ไหนสักแห่งในฟังก์ชันของตัวเอง (นอก OnCreate ฯลฯ ) คุณจะต้อง:
private Bitmap getVideoFrame(String uri) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
retriever.setDataSource(uri);
return retriever.captureFrame();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (RuntimeException ex) {
ex.printStackTrace();
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
}
}
return null;
}
ในโฟลเดอร์ src ของคุณคุณต้องมีไดเร็กทอรีย่อยใหม่ของ android / media ซึ่งจะเป็นที่ตั้งของคลาส (คัดลอกมาจากแหล่งที่มาของ android เอง) ซึ่งช่วยให้คุณสามารถใช้ฟังก์ชันนี้ได้ ส่วนนี้ไม่ควรเปลี่ยนเปลี่ยนชื่อหรือวางไว้ที่อื่น MediaMetadataRetriever.java ต้องอยู่ภายใต้ android.media ในโฟลเดอร์ซอร์สของคุณเพื่อให้ทุกอย่างทำงานได้
package android.media;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.net.Uri;
public class MediaMetadataRetriever {
static {
System.loadLibrary("media_jni");
native_init();
}
private int mNativeContext;
public MediaMetadataRetriever() {
native_setup();
}
public native void setMode(int mode);
public native int getMode();
public native void setDataSource(String path)
throws IllegalArgumentException;
public native void setDataSource(FileDescriptor fd, long offset, long length)
throws IllegalArgumentException;
public void setDataSource(FileDescriptor fd)
throws IllegalArgumentException {
setDataSource(fd, 0, 0x7ffffffffffffffL);
}
public void setDataSource(Context context, Uri uri)
throws IllegalArgumentException, SecurityException {
if (uri == null) {
throw new IllegalArgumentException();
}
String scheme = uri.getScheme();
if (scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}
AssetFileDescriptor fd = null;
try {
ContentResolver resolver = context.getContentResolver();
try {
fd = resolver.openAssetFileDescriptor(uri, "r");
} catch (FileNotFoundException e) {
throw new IllegalArgumentException();
}
if (fd == null) {
throw new IllegalArgumentException();
}
FileDescriptor descriptor = fd.getFileDescriptor();
if (!descriptor.valid()) {
throw new IllegalArgumentException();
}
if (fd.getDeclaredLength() < 0) {
setDataSource(descriptor);
} else {
setDataSource(descriptor, fd.getStartOffset(),
fd.getDeclaredLength());
}
return;
} catch (SecurityException ex) {
} finally {
try {
if (fd != null) {
fd.close();
}
} catch (IOException ioEx) {
}
}
setDataSource(uri.toString());
}
public native String extractMetadata(int keyCode);
public native Bitmap captureFrame();
public native byte[] extractAlbumArt();
public native void release();
private native void native_setup();
private static native void native_init();
private native final void native_finalize();
@Override
protected void finalize() throws Throwable {
try {
native_finalize();
} finally {
super.finalize();
}
}
public static final int MODE_GET_METADATA_ONLY = 0x01;
public static final int MODE_CAPTURE_FRAME_ONLY = 0x02;
public static final int METADATA_KEY_CD_TRACK_NUMBER = 0;
public static final int METADATA_KEY_ALBUM = 1;
public static final int METADATA_KEY_ARTIST = 2;
public static final int METADATA_KEY_AUTHOR = 3;
public static final int METADATA_KEY_COMPOSER = 4;
public static final int METADATA_KEY_DATE = 5;
public static final int METADATA_KEY_GENRE = 6;
public static final int METADATA_KEY_TITLE = 7;
public static final int METADATA_KEY_YEAR = 8;
public static final int METADATA_KEY_DURATION = 9;
public static final int METADATA_KEY_NUM_TRACKS = 10;
public static final int METADATA_KEY_IS_DRM_CRIPPLED = 11;
public static final int METADATA_KEY_CODEC = 12;
public static final int METADATA_KEY_RATING = 13;
public static final int METADATA_KEY_COMMENT = 14;
public static final int METADATA_KEY_COPYRIGHT = 15;
public static final int METADATA_KEY_BIT_RATE = 16;
public static final int METADATA_KEY_FRAME_RATE = 17;
public static final int METADATA_KEY_VIDEO_FORMAT = 18;
public static final int METADATA_KEY_VIDEO_HEIGHT = 19;
public static final int METADATA_KEY_VIDEO_WIDTH = 20;
public static final int METADATA_KEY_WRITER = 21;
public static final int METADATA_KEY_MIMETYPE = 22;
public static final int METADATA_KEY_DISCNUMBER = 23;
public static final int METADATA_KEY_ALBUMARTIST = 24;
}