implement MediaMetadataRetriever on top of MediaPlayer

also add MediaPlayer.getDuration() and MediaPlayer.getCurrentPosition()
This commit is contained in:
Julian Winkler 2025-04-23 18:16:37 +02:00
parent 49fa854c93
commit 7985381b60
5 changed files with 80 additions and 0 deletions

View file

@ -39,6 +39,22 @@ JNIEXPORT void JNICALL Java_android_media_MediaPlayer_native_1setOnCompletionLis
JNIEXPORT void JNICALL Java_android_media_MediaPlayer_native_1start JNIEXPORT void JNICALL Java_android_media_MediaPlayer_native_1start
(JNIEnv *, jclass, jlong); (JNIEnv *, jclass, jlong);
/*
* Class: android_media_MediaPlayer
* Method: native_getDuration
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getDuration
(JNIEnv *, jclass, jlong);
/*
* Class: android_media_MediaPlayer
* Method: native_getCurrentPosition
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getCurrentPosition
(JNIEnv *, jclass, jlong);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -56,3 +56,19 @@ JNIEXPORT void JNICALL Java_android_media_MediaPlayer_native_1start(JNIEnv *env,
gtk_media_stream_set_volume(media_stream, 1.0); gtk_media_stream_set_volume(media_stream, 1.0);
gtk_media_stream_play(media_stream); gtk_media_stream_play(media_stream);
} }
JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getDuration(JNIEnv *env, jclass this, jlong media_stream_ptr)
{
GtkMediaStream *media_stream = _PTR(media_stream_ptr);
// convert from microseconds to milliseconds
return gtk_media_stream_get_duration(media_stream) / 1000;
}
JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getCurrentPosition(JNIEnv *env, jclass this, jlong media_stream_ptr)
{
GtkMediaStream *media_stream = _PTR(media_stream_ptr);
// convert from microseconds to milliseconds
return gtk_media_stream_get_timestamp(media_stream) / 1000;
}

View file

@ -0,0 +1,37 @@
package android.media;
import android.content.Context;
import android.net.Uri;
public class MediaMetadataRetriever {
private MediaPlayer mediaPlayer;
public void release() {
if (mediaPlayer != null)
mediaPlayer.release();
}
public void setDataSource(Context context, Uri uri) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(uri.getPath());
}
public void setDataSource(String path) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(path);
}
public byte[] getEmbeddedPicture() {
return null;
}
public String extractMetadata(int key) {
switch (key) {
case 9/*METADATA_KEY_DURATION*/:
return String.valueOf(mediaPlayer.getDuration());
default:
return null;
}
}
}

View file

@ -68,8 +68,18 @@ public class MediaPlayer {
public void setVolume(float leftVolume, float rightVolume) {} public void setVolume(float leftVolume, float rightVolume) {}
public int getDuration() {
return native_getDuration(gtk_media_stream);
}
public int getCurrentPosition() {
return native_getCurrentPosition(gtk_media_stream);
}
public static native void native_prepare(long gtk_media_stream); public static native void native_prepare(long gtk_media_stream);
public native long native_setDataSource(String path); public native long native_setDataSource(String path);
public static native void native_setOnCompletionListener(long gtk_media_stream, MediaPlayer.OnCompletionListener listener); public static native void native_setOnCompletionListener(long gtk_media_stream, MediaPlayer.OnCompletionListener listener);
public static native void native_start(long gtk_media_stream); public static native void native_start(long gtk_media_stream);
public static native int native_getDuration(long gtk_media_stream);
public static native int native_getCurrentPosition(long gtk_media_stream);
} }

View file

@ -279,6 +279,7 @@ srcs = [
'android/media/MediaDescription.java', 'android/media/MediaDescription.java',
'android/media/MediaFormat.java', 'android/media/MediaFormat.java',
'android/media/MediaMetadata.java', 'android/media/MediaMetadata.java',
'android/media/MediaMetadataRetriever.java',
'android/media/MediaPlayer.java', 'android/media/MediaPlayer.java',
'android/media/MediaRouter.java', 'android/media/MediaRouter.java',
'android/media/Ringtone.java', 'android/media/Ringtone.java',