Android---mediaplayer 创建和调用顺序

Posted 寻行者(Grand Wang)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android---mediaplayer 创建和调用顺序相关的知识,希望对你有一定的参考价值。

android mediaframework创建mediaplayer

// java

///frameworks/base/media/java/android/media/MediaPlayer.java

public MediaPlayer() {

    ...

    native_setup(new WeakReference<MediaPlayer>(this));

    baseRegisterPlayer();

}

 

// native

///frameworks/base/media/jni/android_media_MediaPlayer.cpp

//将函数native_setup映射为android_media_MediaPlayer_native_setup

{"native_setup",        "(Ljava/lang/Object;)V",

(void*)android_media_MediaPlayer_native_setup},

android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)

{

    sp<MediaPlayer> mp = new MediaPlayer();

    if (mp == NULL) {

        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");

        return;

    }

    sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this);

mp->setListener(listener);

    setMediaPlayer(env, thiz, mp);

}

 

Android mediaframework调用setDatasource

// java层

///frameworks/base/media/java/android/media/MediaPlayer.java

void setDataSource(String path, String[] keys, String[] values,

        List<HttpCookie> cookies)

        throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {

    ...

    if ("file".equals(scheme)) {

        path = uri.getPath();

    } else if (scheme != null) {

        // handle non-file sources

        nativeSetDataSource(MediaHTTPService.createHttpServiceBinderIfNecessary(path, cookies), path, keys, values);

        return;

    }

}

 

// 这两个函数是native层的代码,并且在库 ‘libmedia_jni.so‘中例如 :System.loadLibrary("media_jni");

private native void nativeSetDataSource(IBinder httpServiceBinder, String path, String[] keys,

String[] values)throws IOException, IllegalArgumentException,

SecurityException, IllegalStateException;

private native void _setDataSource(FileDescriptor fd, long offset, long length)

        throws IOException, IllegalArgumentException, IllegalStateException;

 

// native层

///frameworks/base/media/jni/android_media_MediaPlayer.cpp

//将函数nativeSetDataSource映射为android_media_MediaPlayer_setDataSourceAndHeaders

static const JNINativeMethod gMethods[] = {

    {

        "nativeSetDataSource",

        "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;"

        "[Ljava/lang/String;)V",

        (void *)android_media_MediaPlayer_setDataSourceAndHeaders

    }

    ...

}

 

static void android_media_MediaPlayer_setDataSourceAndHeaders(

        JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path,

        jobjectArray keys, jobjectArray values) {

    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);

    if (mp == NULL ) {

        jniThrowException(env, "java/lang/IllegalStateException", NULL);

        return;

    }

    ...

    status_t opStatus =

        mp->setDataSource(

                httpService,

                pathStr,

                headersVector.size() > 0? &headersVector : NULL);

    ...

}

 

/frameworks/av/media/libmedia/mediaplayer.cpp

status_t MediaPlayer::setDataSource(

        const sp<IMediaHTTPService> &httpService,

        const char *url, const KeyedVector<String8, String8> *headers)

{

    status_t err = BAD_VALUE;

if (url != NULL) {

    // 获取mediaserver系统服务进程中的MediaPlayerService的

        const sp<IMediaPlayerService> service(getMediaPlayerService());

        if (service != 0) {

             // 创建一个MediaPlayer代理

            sp<IMediaPlayer> player(service->create(this, mAudiosessionId));

            ...

            err = attachNewPlayer(player); // mPlayer = player;

        }

    }

    return err;

}

以上是关于Android---mediaplayer 创建和调用顺序的主要内容,如果未能解决你的问题,请参考以下文章

android Mediaplayer

Android MediaPlayer 停止和播放

Android:MediaPlayer setVolume 函数

Android MediaPlayer 常用方法介绍

Android MediaPlayer:同时播放多个声音。我的代码是

Android MediaPlayer setNextMediaPlayer 不工作