当前位置:编程学习 > wap >>

媒体播放器不能释放MediaPlayer

小弟在做一个Activity,用来播放一个地址的影片,需要使用到Su易做图ceView,程序中使用线程进行播放。 需要在su易做图ceDestroyed的时候将MediaPlayer对象释放掉。但是有用线程需要用到MediaPlayer对象,因此在使用MediaPlayer对象的release方法时,程序会挂掉。请问各位大侠,有没有解决的方法。
先谢谢了


主要问题程序
============================================================================
  public void su易做图ceDestroyed(Su易做图ceHolder su易做图ceholder)
  {
    // TODO Auto-generated method stub

 mMediaPlayer01.stop();
  mMediaPlayer01.release();


  }
=================================================================================



以下为这个播放的Activity的程序
-----------------------------------------------------------------------------------------
package dlna.player.activities;

import android.app.Activity;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.Su易做图ceHolder;
import android.view.Su易做图ceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener;
import dlna.player.R;
import dlna.player.services.MediaPlayerService;

public class VideoPlayerActivity extends Activity implements Su易做图ceHolder.Callback
{
  private TextView mTextView01;
  private static final String TAG = "HIPPO_MediaPlayer";
  
  private MediaPlayer mMediaPlayer01;
  
  private Su易做图ceView mSu易做图ceView01;
  
  private Su易做图ceHolder mSu易做图ceHolder01;
  
  MediaPlayerService MediaPlayerService01;
  
  DisplayMetrics dm = new DisplayMetrics();

  
  private ImageButton mPlay;
  private ImageButton mback;
  private ImageButton mfront;
  
  private TextView begin;
  private TextView end;
  private SeekBar vedioseekbar;

  
  private boolean bIsPaused = false;
  
  private boolean bIsReleased = false;
  
  private boolean bIsPlaying = false;
  
  private boolean IsFullScreen= false;
  
  private boolean IsFirstPlay= true;
  
  private String strVideoPath = null;
  private Uri strVideoPath1 = null;
  int Duration;
  Handler handler=new Handler();
  //Runnable startvedio=null;
  Runnable updatesb =null;
  
 
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_player);
    
    
    mTextView01 = (TextView)findViewById(R.id.myTextView1);
    
    getWindow().setFormat(PixelFormat.UNKNOWN);
    
    mSu易做图ceView01 = (Su易做图ceView) findViewById(R.id.mSu易做图ceView1);
    
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) mSu易做图ceView01.getLayoutParams();
  linearParams.height=dm.heightPixels/2;
  linearParams.width=dm.widthPixels/2;
  mSu易做图ceView01.setLayoutParams(linearParams);
    
    
    mSu易做图ceHolder01 = mSu易做图ceView01.getHolder();
    mSu易做图ceHolder01.addCallback(this);
    
    //mSu易做图ceHolder01.setFixedSize(176,144);
    mSu易做图ceHolder01.setType(Su易做图ceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 

    mPlay = (ImageButton) findViewById(R.id.play); 
    mback = (ImageButton) findViewById(R.id.back); 
    mfront = (ImageButton) findViewById(R.id.front); 
    vedioseekbar=(SeekBar)findViewById(R.id.SeekBar02);
    
    begin=(TextView)findViewById(R.id.begin);
    end=(TextView)findViewById(R.id.end);
   
    
    Intent intent = getIntent();
    strVideoPath = intent.getDataString();
    strVideoPath1 = intent.getData();
    
    mMediaPlayer01 =MediaPlayer.create(this,strVideoPath1);
    Duration=mMediaPlayer01.getDuration();
    vedioseekbar.setMax(Duration);
    
    vedioseekbar.setOnSeekBarChangeListener(seekbarlistener);
    
    begin.setText("00:00:00");
    end.setText(MediaPlayerService01.getTimeAsString(Duration));
    
    
    mPlay.setOnClickListener(new ImageButton.OnClickListener()
    { 
      public void onClick(View view)
      {
       if(IsFirstPlay)
       {
       if(!bIsPlaying){
       mTextView01.setText(R.string.download);
      handler.post(startvedio);
      //playVideo(strVideoPath);
    
     //handler.post(updatesb);
      }
       }
       else if(!IsFirstPlay){
       if(bIsPlaying==false){
       mMediaPlayer01.start();
       mTextView01.setText(R.string.str_play);
       mPlay.setImageResource(R.drawable.pause);
       bIsPlaying=true;
       }
       else if(bIsPlaying==true){
       mMediaPlayer01.pause();
       mTextView01.setText(R.string.str_pause);
       mPlay.setImageResource(R.drawable.play);
       bIsPlaying=false;
       }
       }
      }
      
      Runnable startvedio=new Runnable(){  
   @Override
   public void run() {
   // TODO Auto-generated method stub
   playVideo(strVideoPath);
  
   handler.post(updatesb);
   }
   
      };
      //This thread is used to update the seekbar.
      Runnable updatesb =new Runnable(){     
   @Override
   public void run() {
   // TODO Auto-generated method stub
   vedioseekbar.setProgress(mMediaPlayer01.getCurrentPosition());
   begin.setText(MediaPlayerService01.getTimeAsString(mMediaPlayer01.getCurrentPosition()));
   handler.postDelayed(updatesb, 1000);

   }
   
      };
    });
    
  
--------------------编程问答--------------------     mback.setOnClickListener(new ImageButton.OnClickListener(){
     public void onClick(View view){
     if(mMediaPlayer01.getCurrentPosition()<10000)
     mMediaPlayer01.seekTo(0);
     else
    
     mMediaPlayer01.seekTo(mMediaPlayer01.getCurrentPosition()-10000);
     }
    });
    mfront.setOnClickListener(new ImageButton.OnClickListener(){
     public void onClick(View view){
     if((mMediaPlayer01.getCurrentPosition()+10000)>mMediaPlayer01.getDuration())
     mMediaPlayer01.seekTo(Duration);
     else
    
     mMediaPlayer01.seekTo(mMediaPlayer01.getCurrentPosition()+10000);
     }
    });
    mSu易做图ceView01.setOnClickListener(new Su易做图ceView.OnClickListener(){
     public void onClick(View view){
     if(mMediaPlayer01 != null){
     if(bIsReleased==false){
     if(IsFullScreen== false){
       mTextView01.setVisibility(mTextView01.INVISIBLE);
       mPlay.setVisibility(mPlay.INVISIBLE);
      
       mback.setVisibility(mback.INVISIBLE);
       mfront.setVisibility(mfront.INVISIBLE);
       begin.setVisibility(begin.INVISIBLE);
       end.setVisibility(end.INVISIBLE);
       vedioseekbar.setVisibility(vedioseekbar.INVISIBLE);
       LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) mSu易做图ceView01.getLayoutParams();
       linearParams.height=linearParams.FILL_PARENT;
       linearParams.width=linearParams.FILL_PARENT;
       mSu易做图ceView01.setLayoutParams(linearParams);
       IsFullScreen=true;
     }
     else if(IsFullScreen==true){
     mTextView01.setVisibility(mTextView01.VISIBLE);
     mPlay.setVisibility(mPlay.VISIBLE);
  
     mback.setVisibility(mback.VISIBLE);
     mfront.setVisibility(mfront.VISIBLE);
     begin.setVisibility(begin.VISIBLE);
     end.setVisibility(end.VISIBLE);
     vedioseekbar.setVisibility(vedioseekbar.VISIBLE);
       LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) mSu易做图ceView01.getLayoutParams();
       linearParams.height=dm.heightPixels/2;
       linearParams.width=dm.widthPixels/2;
       mSu易做图ceView01.setLayoutParams(linearParams);
       IsFullScreen=false;
     }
     mMediaPlayer01.start();
     mTextView01.setText(R.string.str_play);
     mPlay.setImageResource(R.drawable.pause);
     bIsPlaying=true;
     }
    
     }
     }
    });
  }
  
  
  private void playVideo(String strPath)
  { 
    mMediaPlayer01 = new MediaPlayer();
    mMediaPlayer01.setAudioStreamType(AudioManager.STREAM_MUSIC);
    
    mMediaPlayer01.setDisplay(mSu易做图ceHolder01);
    
    try
    { 
      mMediaPlayer01.setDataSource(strPath);
    }
    catch (Exception e)
    { 
      // TODO Auto-generated catch block
      mTextView01.setText("setDataSource Exceeption:"+e.toString());
      e.printStackTrace();
    }
    
    try
    { 
      mMediaPlayer01.prepare();
    }
    catch (Exception e)
    { 
      // TODO Auto-generated catch block
      mTextView01.setText("prepare Exceeption:"+e.toString());
      e.printStackTrace(); 
    }

    mMediaPlayer01.start();
    mPlay.setImageResource(R.drawable.pause);
    bIsPlaying=true;
    IsFirstPlay=false;
    bIsReleased = false;
    
    mTextView01.setText(R.string.str_play);
    
    mMediaPlayer01.setOnCompletionListener
    (new MediaPlayer.OnCompletionListener()
    {
      @Override
      public void onCompletion(MediaPlayer arg0)
      {
        // TODO Auto-generated method stub
        mTextView01.setText(R.string.str_stop);
        bIsPlaying=false;
        mMediaPlayer01.seekTo(0);
        mPlay.setImageResource(R.drawable.play);
        //mMediaPlayer01.release();
       
        
      }
    });
  }
  

  public void mMakeTextToast(String str, boolean isLong)
  {
    if(isLong==true)
    {
      Toast.makeText(VideoPlayerActivity.this, str, Toast.LENGTH_LONG).show();
    }
    else
    {
      Toast.makeText(VideoPlayerActivity.this, str, Toast.LENGTH_SHORT).show();
    }
  }
  
  @Override
  public void su易做图ceChanged
  (Su易做图ceHolder su易做图ceholder, int format, int w, int h)
  {
    // TODO Auto-generated method stub
  }
  
  @Override
  public void su易做图ceCreated(Su易做图ceHolder su易做图ceholder)
  {
    // TODO Auto-generated method stub
  }
  
  @Override
  public void su易做图ceDestroyed(Su易做图ceHolder su易做图ceholder)
  {
    // TODO Auto-generated method stub

 mMediaPlayer01.stop();
  mMediaPlayer01.release();


  }

  private OnSeekBarChangeListener seekbarlistener=new OnSeekBarChangeListener(){
  
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
mMediaPlayer01.seekTo(vedioseekbar.getProgress());
}

  };  
} --------------------编程问答-------------------- 释放时设置mMediaPlayer01 = null;
在线程入口做判断 if(mMediaPlayer01 != null){...} --------------------编程问答-------------------- 把和media有关的对象都定义在子线程类里面,主线程只负责UI,业务处理全部交给子线程做。通过handler来传递消息就行了,2个线程共享一个全局变量会出现问题的~~
补充:移动开发 ,  Android
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,