2013-05-22 12 views
10

Sto costruendo video player con oggetto Android Media Player. sono in grado di ascoltare l'audio ma il video non appare su surfaceView. ecco il mio codiceCome collegare MediaPlayer con SurfaceView in Android?

public class PlayerActivity extends Activity implements SurfaceHolder.Callback { 
    String path; 
    private MediaPlayer mp; 
    private SurfaceView mPreview; 
    private SurfaceHolder holder; 
    boolean pausing = false; 
    public static String filepath; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     mPreview = (SurfaceView)findViewById(R.id.surfaceView); 
     holder = mPreview.getHolder(); 
     holder.setFixedSize(176, 144); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mp = new MediaPlayer(); 

     mp.setDisplay(holder); 
     try { 
      Intent intent = getIntent(); 
      Uri fileuri = intent.getData(); 
      filepath=fileuri.getPath(); 
     } catch(Exception e) {} 

     try { 
      mp.setDataSource(filepath); 
      mp.prepare(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mp.start(); 
    } 
} 

target è Android 2.3 e versioni successive. come risolverlo per favore aiutami ..

risposta

20

finalmente l'ho riparato da solo. appena chiamato il mp.setDisplay(holder); all'interno della funzione surfaceCreated(). e il codice finale è

public class PlayerActivity extends Activity implements SurfaceHolder.Callback { 
    String path; 
    private MediaPlayer mp; 
    private SurfaceView mPreview; 
    private SurfaceHolder holder; 
    boolean pausing = false; 
    public static String filepath; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     mPreview = (SurfaceView)findViewById(R.id.surfaceView); 
     holder = mPreview.getHolder(); 
     holder.setFixedSize(800, 480); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mp = new MediaPlayer(); 


     try{ 
      Intent intent = getIntent(); 

      Uri fileuri = intent.getData(); 
      filepath=fileuri.getPath(); 
     }catch(Exception e){} 


    } 
    protected void onPause(){ 
     super.onPause(); 
     mp.release(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     mp.setDisplay(holder); 
     play(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 
    void play(){ 
     try { 
      mp.setDataSource(filepath); 

      mp.prepare(); 

     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mp.start(); 
    } 
} 
+0

non sta funzionando per me l'errore di errore di stato di errore di lancio nel metodo SurfaceCreated() alla riga mp.setDisplay (titolare); –

1

Non sta lavorando per me, gettando errore di eccezione di Stato illegale in surfaceCreated() metodo in linea mp.setDisplay(holder);

Dichiarare mp.setDisplay(holder) come indicato di seguito:

@Override 
public void surfaceCreated(SurfaceHolder holder) 
{ 
    mediaPlayer.setDataSource(this,uri); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mediaPlayer.prepare(); 
    mp.setDisplay(holder); 
    mp.start; 
}