求凌浩的青玉案by绫浩啊!!跪求!!最好是百度云txt

15:11 提问
结束activity中出现MediaPlayer异常
在结束mediaplayer activity时出现异常,代码:
结束按钮:
ImageView imageAllBack = (ImageView)this.findViewById(R.id.imageAllBack);
imageAllBack.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//mediaPlayer.stop();
if(mediaPlayer != null)
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer事件:
protected void onStop() {
super.onStop();
mediaPlayer.stop();
mediaPlayer.release();
public boolean onTouchEvent(MotionEvent event) {
mediaController.show();
//--MediaPlayerControl methods----------------------------------------------------
public void start() {
mediaPlayer.start();
public void pause() {
mediaPlayer.pause();
public int getDuration() {
return mediaPlayer.getDuration();
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
public void seekTo(int i) {
mediaPlayer.seekTo(i);
public boolean isPlaying() {
return mediaPlayer.isPlaying();
public int getBufferPercentage() {
public boolean canPause() {
public boolean canSeekBackward() {
public boolean canSeekForward() {
//--------------------------------------------------------------------------------
public void onPrepared(MediaPlayer mediaPlayer) {
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(findViewById(R.id.main_audio_view));
handler.post(new Runnable() {
public void run() {
mediaController.setEnabled(true);
mediaController.show();
public class MyMediaController extends MediaController {
public MyMediaController(Context context) {
super(context);
// TODO Auto-generated constructor stub
public void hide() {
// Do Nothing to keep the show the controller all times
02-21 21:03:33.829: E/AndroidRuntime(8889): FATAL EXCEPTION: main
02-21 21:03:33.829: E/AndroidRuntime(8889): java.lang.IllegalStateException
02-21 21:03:33.829: E/AndroidRuntime(8889):
at android.media.MediaPlayer.isPlaying(Native Method)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at rce.android.naturalocal.NaturaPlayer.isPlaying(NaturaPlayer.java:126)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at rce.android.naturalocal.NaturaPlayer.getCurrentPosition(NaturaPlayer.java:115)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at android.widget.MediaController.setProgress(MediaController.java:436)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at android.widget.MediaController.access$500(MediaController.java:74)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at android.widget.MediaController$3.handleMessage(MediaController.java:407)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at android.os.Looper.loop(Looper.java:137)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at android.app.ActivityThread.main(ActivityThread.java:4441)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at java.lang.reflect.Method.invokeNative(Native Method)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at java.lang.reflect.Method.invoke(Method.java:511)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-21 21:03:33.829: E/AndroidRuntime(8889):
at dalvik.system.NativeStart.main(Native Method)
按赞数排序
试下注释掉下句
if(mediaPlayer != null)
mediaPlayer.stop();
//mediaPlayer.release();
将下面另一个release用try catch括住
mediaPlayer.release();
}catch(Exception e){
e.printStackTrace();
在调用stop()方法之前先停掉线程,因为你的线程一直在运行
获取mediaplayer的相关数据,先调用stop()方法停掉mediaplayer,
而此时线程还在从使用mediaplayer对象,因此出错了,
不知道这样对不对,反正主要思路是先停线程,再调用stop()方法
我写的简单的播放器,可以看一下
我也遇到这个问题了
怎么解决啊
MediaPlayer调用了Native代码,onPrepare方法里面的MediaPlayer和Activity里面的MediaPlayer不是一个对象,最好都用Activity中的那个MediaPlayer对象
其他相似问题Posts - 40,
Articles - 0,
Comments - 124
Android开发,欢迎交流。欢迎转载,转载请注明出处!
11:31 by HalZhang, ... 阅读,
因为MediaPlayer的源码比较多,所以只能来一个不完整分析了。
转载请注明出处:/halzhang
前段时间在工作中遇到一个问题就是MediaPlayer的播放网络流媒体的时候,当没有完全下载完毕的时,我们调用seekTo的时候会触发OnCompletionListener,你们懂的咯,这样就直接播放下一首了。挺纠结的,所以就决定看看mediaplayer的源码咯,希望能从中找到解决的方法。
seekTo在MediaPlayer的调用流程如下图:
seekTo 
在MediaPlayer.java中的seekTo是一个native修饰的方法
* Seeks to specified time position.
* @param msec the offset in milliseconds from the start to seek to
* @throws IllegalStateException if the internal player engine has not been
* initialized
8: public native void seekTo(int msec) throws IllegalStateE
好,我们来看看此方法的JNI是如何实现的。
1: static void android_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, int msec)
sp&MediaPlayer& mp = getMediaPlayer(env, thiz);//获取MediaPlayer实例
if (mp == NULL ) {
jniThrowException(env, &java/lang/IllegalStateException&, NULL);
LOGV(&seekTo: %d(msec)&, msec);
status_t result = mp-&seekTo(msec);//1,调用MediaPlayer的seekTo方法
process_media_player_call( env, thiz, result, NULL, NULL );//2,处理MediaPlayer方法调用的返回结果
1,调用MediaPlayer的seekTo方法
1: status_t MediaPlayer::seekTo_l(int msec)
LOGV(&seekTo %d&, msec);
if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED |
MEDIA_PLAYER_PLAYBACK_COMPLETE) ) ) {
if ( msec & 0 ) {
LOGW(&Attempt to seek to invalid position: %d&, msec);
} else if ((mDuration & 0) && (msec & mDuration)) {
LOGW(&Attempt to seek to past end of file: request = %d, EOF = %d&, msec, mDuration);
// cache duration
mCurrentPosition =
if (mSeekPosition & 0) {
getDuration_l(NULL);
mSeekPosition =
//调用seekTo了
return mPlayer-&seekTo(msec);
LOGV(&Seek in progress - queue up seekTo[%d]&, msec);
return NO_ERROR;
LOGE(&Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u&, mPlayer.get(), mCurrentState);
return INVALID_OPERATION;
29: status_t MediaPlayer::seekTo(int msec)
mLockThreadId = getThreadId();
Mutex::Autolock _l(mLock);
status_t result = seekTo_l(msec);
mLockThreadId = 0;
2,处理MediaPlayer方法调用的返回结果
1: static void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message)
if (exception == NULL) {
// Don't throw exception. Instead, send an event.
if (opStatus != (status_t) OK) {
sp&MediaPlayer& mp = getMediaPlayer(env, thiz);
if (mp != 0) mp-&notify(MEDIA_ERROR, opStatus, 0);//调用MediaPlayer的notify
// Throw exception!
if ( opStatus == (status_t) INVALID_OPERATION ) {
jniThrowException(env, &java/lang/IllegalStateException&, NULL);
} else if ( opStatus != (status_t) OK ) {
if (strlen(message) & 230) {
// if the message is too long, don't bother displaying the status code
jniThrowException( env, exception, message);
char msg[256];
// append the status code to the message
sprintf(msg, &%s: status=0x%X&, message, opStatus);
jniThrowException( env, exception, msg);
接下来看看MediaPlayer的notify方法,这个方法主要是通过判断MediaPlayer的状态向我们的app发送回调:
1: void MediaPlayer::notify(int msg, int ext1, int ext2)
LOGV(&message received msg=%d, ext1=%d, ext2=%d&, msg, ext1, ext2);
bool send = true;
bool locked = false;
// TODO: In the future, we might be on the same thread if the app is
// running in the same process as the media server. In that case,
// this will deadlock.
// The threadId hack below works around this for the care of prepare
// and seekTo within the same process.
// FIXME: Remember, this is a hack, it's not even a hack that is applied
// consistently for all use-cases, this needs to be revisited.
if (mLockThreadId != getThreadId()) {
mLock.lock();
locked = true;
if (mPlayer == 0) {
LOGV(&notify(%d, %d, %d) callback on disconnected mediaplayer&, msg, ext1, ext2);
if (locked) mLock.unlock();
// release the lock when done.
switch (msg) {
case MEDIA_NOP: // interface test message
case MEDIA_PREPARED://prepared结束
LOGV(&prepared&);
mCurrentState = MEDIA_PLAYER_PREPARED;
if (mPrepareSync) {
LOGV(&signal application thread&);
mPrepareSync = false;
mPrepareStatus = NO_ERROR;
mSignal.signal();
case MEDIA_PLAYBACK_COMPLETE://播放完毕
LOGV(&playback complete&);
if (!mLoop) {
mCurrentState = MEDIA_PLAYER_PLAYBACK_COMPLETE;
case MEDIA_ERROR://出错
// Always log errors.
// ext1: Media framework error code.
// ext2: Implementation dependant error code.
LOGE(&error (%d, %d)&, ext1, ext2);
mCurrentState = MEDIA_PLAYER_STATE_ERROR;
if (mPrepareSync)
LOGV(&signal application thread&);
mPrepareSync = false;
mPrepareStatus = ext1;
mSignal.signal();
send = false;
case MEDIA_INFO://logcat经常可以看到
// ext1: Media framework error code.
// ext2: Implementation dependant error code.
LOGW(&info/warning (%d, %d)&, ext1, ext2);
case MEDIA_SEEK_COMPLETE://seek完毕
LOGV(&Received seek complete&);
if (mSeekPosition != mCurrentPosition) {
LOGV(&Executing queued seekTo(%d)&, mSeekPosition);
mSeekPosition = -1;
seekTo_l(mCurrentPosition);
LOGV(&All seeks complete - return to regularly scheduled program&);
mCurrentPosition = mSeekPosition = -1;
case MEDIA_BUFFERING_UPDATE://缓冲
LOGV(&buffering %d&, ext1);
case MEDIA_SET_VIDEO_SIZE://设置视频大小
LOGV(&New video size %d x %d&, ext1, ext2);
mVideoWidth = ext1;
mVideoHeight = ext2;
LOGV(&unrecognized message: (%d, %d, %d)&, msg, ext1, ext2);
sp&MediaPlayerListener& listener = mL
if (locked) mLock.unlock();
// this prevents re-entrant calls into client code
if ((listener != 0) && send) {
Mutex::Autolock _l(mNotifyLock);
LOGV(&callback application&);
//调用监听器,回调应用的监听器
listener-&notify(msg, ext1, ext2);
LOGV(&back from callback&);
在监听器的notify方法中,是通过jni“反向调用”MediaPlayer.java中的postEventFromNative,在通过mEventHandler根据不同的消息类型调用不同的监听器。
1: private static void postEventFromNative(Object mediaplayer_ref,
int what, int arg1, int arg2, Object obj)
MediaPlayer mp = (MediaPlayer)((WeakReference)mediaplayer_ref).get();
if (mp == null) {
if (mp.mEventHandler != null) {
Message m = mp.mEventHandler.obtainMessage(what, arg1, arg2, obj);
mp.mEventHandler.sendMessage(m);
OK,至此我们分析了seekTo的整个流程。其他方法的流程是很相似的,大家不妨亲自去看看。
回到本文开头的问题,通过观察logcat得知是发生错误导致的,暂时未找到解决的办法。如果你有解决方法不妨告诉我哦。
------------------------
03-20 03:08:13.302: ERROR/MediaPlayer(419): Attempt to call getDuration without a valid mediaplayer
03-20 03:08:13.365: ERROR/MediaPlayer(419): error (-38, 0)
03-20 03:08:13.372: ERROR/MediaPlayer(419): Attempt to call getDuration without a valid mediaplayer
03-20 03:08:13.512: ERROR/MediaPlayer(419): error (-38, 0)
03-20 03:08:13.522: DEBUG/dalvikvm(419): GC freed 3405 objects / 831072 bytes in 122ms
03-20 03:08:13.752: ERROR/MediaPlayer(419): Error (-38,0)
03-20 03:08:13.762: DEBUG/MultiPlayer(419): Error: -38,0
03-20 03:08:13.772: ERROR/MediaPlayer(419): Error (-38,0)
03-20 03:08:13.781: ERROR/MediaPlayer(419): pause called in state 0
03-20 03:08:13.781: ERROR/MediaPlayer(419): error (-38, 0)
-------------------------
PS:“反向调用”就是在c/c++中通过jni来调用java中的方法或属性。这个叫法很不专业,如果哪位同学知道专业的叫法麻烦留言告诉我。!!!!一定要告诉我哦!!!一定要哦!!!!谢谢!
转载请注明出处:
----------OK The END------------【初学Android求指教】关于MediaPlayer的问题【android开发吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:115,696贴子:
【初学Android求指教】关于MediaPlayer的问题收藏
最近刚开始自学android 照着书上打的源代码 : package com.ex.sample_2_3;import android.os.Bimport android.app.Aimport android.media.MediaPpublic class MainActivity extends Activity {
MediaPlayer mMediaP
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMediaPlayer = MediaPlayer.create(this, R.raw.sound);
setContentView(R.layout.activity_main);
mMediaPlayer.start();
}}现在的问题是跑起来之后
播放不出来声音LogCat里报了个错:Should have subtitle
controller
already set在网上没有找到答案
求个大神帮忙解答一下
Should have subtitle controller already set:这句话翻译是有些设置有问题public class MainActivity extends Activity {
MediaPlayer mMediaP
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMediaPlayer = MediaPlayer.create(this, R.raw.sound);
mMediaPlayer.start();
声音格式有问题 用windows pcm格式的
肯定没声音,在mMediaPlayer.start()之前少了一句:mMediaPlayer.prepare();
同样的问题,求解答啊
4.4的模拟器么?
mediaplayer = MediaPlayer.create(this, R.raw.test); mediaplayer.stop();我在mediaplayer = MediaPlayer.create(this, R.raw.test); 加了句mediaplayer.stop();就可以播放了
是因为手机开了静音模式导致的
登录百度帐号推荐应用Android提高之MediaPlayer播放网络视频的实现方法
投稿:shichen2014
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android的MediaPlayer播放网络视频的实现方法,是一个非常实用的功能,需要的朋友可以参考下
前面讲解了MediaPlayer播放网络音频,主要介绍了MediaPlayer关于网络音频的缓冲和进度条控制的方法,本文再来讲解一下MediaPlayer播放网络视频的方法。播放网络视频比播放网络音频需要多一个SurfaceView而已,在已经熟悉了MediaPlayer播放网络音频之后,相信大家对本文所述的播放网络视频也能很快地掌握。
先来看看本文程序运行截图,如下所示:
本文程序的视频来自,大家可以替换程序中的视频链接,试试其他影片。
main.xml的源码如下:
&?xml version="1.0" encoding="utf-8"?&
&FrameLayout xmlns:android="/apk/res/android"
android:layout_height="fill_parent" android:layout_width="fill_parent"&
&SurfaceView android:id="@+id/surfaceView1"
android:layout_height="fill_parent" android:layout_width="fill_parent"&&/SurfaceView&
&LinearLayout android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_gravity="bottom"
android:orientation="vertical"&
&LinearLayout android:orientation="horizontal"
android:layout_gravity="center_horizontal" android:layout_marginTop="4.0dip"
android:layout_height="wrap_content" android:layout_width="wrap_content"&
&Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/btnPlayUrl"
android:text="播放网络视频"&&/Button&
&Button android:layout_height="wrap_content" android:id="@+id/btnPause"
android:text="暂停" android:layout_width="80dip"&&/Button&
&Button android:layout_height="wrap_content"
android:layout_width="80dip" android:text="停止" android:id="@+id/btnStop"&&/Button&
&/LinearLayout&
&LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginBottom="20dip"&
&SeekBar android:paddingRight="10dip" android:layout_gravity="center_vertical"
android:paddingLeft="10dip" android:layout_weight="1.0"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:id="@+id/skbProgress" android:max="100"&&/SeekBar&
&/LinearLayout&
&/LinearLayout&
&/FrameLayout&
Player.java是本文的核心,Player.java实现了“进度条更新”、“数据缓冲”、“SurfaceHolder生命周期”等功能,其中“SurfaceHolder生命周期”是视频与音频播放的最大区别,通过surfaceCreated()、surfaceDestroyed()、surfaceChanged()可以创建/释放某些资源。下面这个地方需要注意一下:
videoWidth = mediaPlayer.getVideoWidth();
videoHeight = mediaPlayer.getVideoHeight();
if (videoHeight != 0 && videoWidth != 0) {
arg0.start();
有些视频是android播放器不能播放的,不能播放时videoHeight=0,videoWidth=0,以此来判断是否播放视频。
Player.java源码如下:
package com.
import java.io.IOE
import java.util.T
import java.util.TimerT
import android.media.AudioM
import android.media.MediaP
import android.media.MediaPlayer.OnBufferingUpdateL
import android.media.MediaPlayer.OnCompletionL
import android.os.H
import android.os.M
import android.util.L
import android.view.SurfaceH
import android.view.SurfaceV
import android.widget.SeekB
public class Player implements OnBufferingUpdateListener,
OnCompletionListener, MediaPlayer.OnPreparedListener,
SurfaceHolder.Callback {
private int videoW
private int videoH
public MediaPlayer mediaP
private SurfaceHolder surfaceH
private SeekBar skbP
private Timer mTimer=new Timer();
public Player(SurfaceView surfaceView,SeekBar skbProgress)
this.skbProgress=skbP
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mTimer.schedule(mTimerTask, 0, 1000);
/*******************************************************
* 通过定时器和Handler来更新进度条
******************************************************/
TimerTask mTimerTask = new TimerTask() {
public void run() {
if(mediaPlayer==null)
if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) {
handleProgress.sendEmptyMessage(0);
Handler handleProgress = new Handler() {
public void handleMessage(Message msg) {
int position = mediaPlayer.getCurrentPosition();
int duration = mediaPlayer.getDuration();
if (duration & 0) {
long pos = skbProgress.getMax() * position /
skbProgress.setProgress((int) pos);
//*****************************************************
public void play()
mediaPlayer.start();
public void playUrl(String videoUrl)
mediaPlayer.reset();
mediaPlayer.setDataSource(videoUrl);
mediaPlayer.prepare();//prepare之后自动播放
//mediaPlayer.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public void pause()
mediaPlayer.pause();
public void stop()
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer =
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
Log.e("mediaPlayer", "surface changed");
public void surfaceCreated(SurfaceHolder arg0) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnPreparedListener(this);
} catch (Exception e) {
Log.e("mediaPlayer", "error", e);
Log.e("mediaPlayer", "surface created");
public void surfaceDestroyed(SurfaceHolder arg0) {
Log.e("mediaPlayer", "surface destroyed");
* 通过onPrepared播放
public void onPrepared(MediaPlayer arg0) {
videoWidth = mediaPlayer.getVideoWidth();
videoHeight = mediaPlayer.getVideoHeight();
if (videoHeight != 0 && videoWidth != 0) {
arg0.start();
Log.e("mediaPlayer", "onPrepared");
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) {
skbProgress.setSecondaryProgress(bufferingProgress);
int currentProgress=skbProgress.getMax()*mediaPlayer.getCurrentPosition()/mediaPlayer.getDuration();
Log.e(currentProgress+"% play", bufferingProgress + "% buffer");
test_videoplayer.java是主程序,负责调用Player类,其中关键部分是SeekBarChangeEvent这个SeekBar拖动的事件:SeekBar的Progress是0~SeekBar.getMax()之内的数,而MediaPlayer.seekTo()的参数是0~MediaPlayer.getDuration()之内数,所以MediaPlayer.seekTo()的参数是(progress/seekBar.getMax())*MediaPlayer.getDuration()。
test_videoplayer.java源码如下:
package com.
import android.app.A
import android.content.pm.ActivityI
import android.net.U
import android.os.B
import android.util.L
import android.view.SurfaceV
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.SeekB
public class test_videoplayer extends Activity {
private SurfaceView surfaceV
private Button btnPause, btnPlayUrl, btnS
private SeekBar skbP
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView1);
btnPlayUrl = (Button) this.findViewById(R.id.btnPlayUrl);
btnPlayUrl.setOnClickListener(new ClickEvent());
btnPause = (Button) this.findViewById(R.id.btnPause);
btnPause.setOnClickListener(new ClickEvent());
btnStop = (Button) this.findViewById(R.id.btnStop);
btnStop.setOnClickListener(new ClickEvent());
skbProgress = (SeekBar) this.findViewById(R.id.skbProgress);
skbProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent());
player = new Player(surfaceView, skbProgress);
class ClickEvent implements OnClickListener {
public void onClick(View arg0) {
if (arg0 == btnPause) {
player.pause();
} else if (arg0 == btnPlayUrl) {
String url="/vids/family_guy_penis_car.3gp";
player.playUrl(url);
} else if (arg0 == btnStop) {
player.stop();
class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// 原本是(progress/seekBar.getMax())*player.mediaPlayer.getDuration()
this.progress = progress * player.mediaPlayer.getDuration()
/ seekBar.getMax();
public void onStartTrackingTouch(SeekBar seekBar) {
public void onStopTrackingTouch(SeekBar seekBar) {
// seekTo()的参数是相对与影片时间的数字,而不是与seekBar.getMax()相对的数字
player.mediaPlayer.seekTo(progress);
感兴趣的读者可以自己动手测试一下本文实例代码,相信对大家进行Android程序开发有一定的借鉴作用。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 青玉案词谱 的文章

 

随机推荐