2013-07-08 32 views
1

當我嘗試將其與MediaPlayer一起使用時,我的OnBufferingUpdate永遠不會被調用。我使用SD卡上保存的視頻作爲媒體來源。我認爲這是問題的根源,我想知道OnBufferingUpdate是否僅適用於互聯網流。我正在使用的代碼如下。OnPufferingUpdate未在MediaPlayer中調用

public class FullImageActivity extends Activity implements SurfaceHolder.Callback,  OnPreparedListener, OnInfoListener,                 OnErrorListener, OnBufferingUpdateListener{ 

private static final String TAG = "MediaPlayer shit"; 
MediaPlayer player; 
SurfaceView surfaceview; 
SurfaceHolder surfaceHolder; 
int width; 
int height; 
DisplayImageOptions options; 
ViewPager viewpager; 
String path; 
long id; 
String[] projection = { GridviewData.ROWID, GridviewData.BITMAPPATH, GridviewData.VIDEOFILEPATH}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.full_image); 

    Intent i = getIntent(); 

    id = i.getExtras().getLong("id"); 
    path = i.getExtras().getString("videopath"); 

    surfaceview = (SurfaceView)findViewById(R.id.surfaceview); 
    surfaceHolder = surfaceview.getHolder(); 
    surfaceHolder.addCallback(this); 



} 

public void playVideo(){ 
    player = new MediaPlayer(); 
    try { 
     player.reset(); 
     player.setOnErrorListener(this); 
     File file = new File(path); 
     FileInputStream inputStream = new FileInputStream(file); 
     player.setDataSource(inputStream.getFD()); 

     inputStream.close();    
     player.setOnBufferingUpdateListener(this); 
     player.setOnInfoListener(this); 
     player.setOnPreparedListener(this); 
     player.setDisplay(surfaceHolder); 
     player.prepareAsync(); 


    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
@Override 
protected void onPause() { 
    surfaceview.setVisibility(View.GONE); 
    if (player != null) 
    { 
     if (player.isPlaying()) 
      player.stop(); 
     player.release(); 
     player = null; 
    } 
    super.onPause(); 
} 
@Override 
protected void onResume() { 
    surfaceview.setVisibility(View.VISIBLE); 
    Log.i(TAG, "In onResume"); 
    super.onResume(); 
} 
@Override 
protected void onStop() { 
    super.onStop(); 
} 
@Override 
public void surfaceChanged(SurfaceHolder holder, int arg1, int arg2, int arg3) { 
    if (player != null) 
    { 
     try { 
      Log.i(TAG, "In surface change"); 
      player.setDisplay(surfaceHolder); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    Log.i(TAG, "in surface created"); 
    playVideo(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder arg0) { 
     Log.i(TAG, "Surface destroyed"); 
     if (player != null) 
     { 
      if (player.isPlaying()) 
       player.stop(); 
      player.release(); 
      player = null; 
     } } 
@Override 
public void onPrepared(MediaPlayer p) { 


    player.start(); 

} 

@Override 
public boolean onError(MediaPlayer arg0, int arg1, int arg2) { 
    Log.i(TAG, "THERE WAS AN ERROR"); 
    return false; 
} 


@Override 
public void onBufferingUpdate(MediaPlayer mp, int percent) { 

    if (percent == 50){ 
    Log.i(TAG, "Within bufferingupdate"); 
    } 

} 

回答

3

您已回答了您自己的問題! :)

onBufferingUpdate()僅針對通過網絡進行流式傳輸的資源,因此不會爲本地資源調用此資源。

http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html

回調接口定義被調用指示被流通過網絡的媒體資源的緩存狀態。

source code

調用緩存中的媒體流來更新狀態,通過漸進式HTTP下載獲得。接收到的緩衝百分比指示有多少內容已被緩衝或播放。例如,當一半內容已被播放時,80%的緩衝更新指示接下來30%的內容將被緩衝。

相關問題