2013-02-26 7 views
5

Voglio url di forma video in streaming nella visualizzazione di video Android. Io uso il codice di esempio api e piccola modifica fatta in quella di raggiungere il mio bisogno di codice .La mia èVideo Android Visualizza in un altro thread e problema con Android 2.1

public class VideoViewDemo extends Activity { 

private static final String TAG = "VideoViewDemo"; 
private String current; 

/** 
* TODO: Set the path variable to a streaming video URL or a local media 
* file path. 
*/ 
private String path = "http://www.boisestatefootball.com/sites/default/files/videos/original/01%20-%20coach%20pete%20bio_4.mp4"; 
private VideoView mVideoView; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.videoview); 
    mVideoView = (VideoView) findViewById(R.id.surface_view); 
    runOnUiThread(new Runnable() { 
     public void run() { 
      playVideo(); 
     } 
    }); 
} 

private void playVideo() { 
    try { 
     // final String path = path; 
     Log.v(TAG, "path: " + path); 
     if (path == null || path.length() == 0) { 
      Toast.makeText(VideoViewDemo.this, "File URL/path is empty", 
        Toast.LENGTH_LONG).show(); 

     } else { 
      // If the path has not changed, just start the media player 
      if (path.equals(current) && mVideoView != null) { 
       mVideoView.start(); 
       mVideoView.requestFocus(); 
       return; 
      } 
      current = path; 
      mVideoView.setVideoPath(getDataSource(path)); 
      mVideoView.start(); 
      mVideoView.setMediaController(new MediaController(this)); 
      mVideoView.requestFocus(); 

     } 
    } catch (Exception e) { 
     Log.e(TAG, "error: " + e.getMessage(), e); 
     if (mVideoView != null) { 
      mVideoView.stopPlayback(); 
     } 
    } 
} 

private String getDataSource(String path) throws IOException { 
    if (!URLUtil.isNetworkUrl(path)) { 
     return path; 
    } else { 
     URL url = new URL(path); 
     URLConnection cn = url.openConnection(); 
     cn.connect(); 
     InputStream stream = cn.getInputStream(); 
     if (stream == null) 
      throw new RuntimeException("stream is null"); 
     File temp = File.createTempFile("mediaplayertmp", "dat"); 
     temp.deleteOnExit(); 
     String tempPath = temp.getAbsolutePath(); 
     FileOutputStream out = new FileOutputStream(temp); 
     byte buf[] = new byte[128]; 
     do { 
      int numread = stream.read(buf); 
      if (numread <= 0) 
       break; 
      out.write(buf, 0, numread); 
     } while (true); 
     try { 
      stream.close(); 
     } catch (IOException ex) { 
      Log.e(TAG, "error: " + ex.getMessage(), ex); 
     } 
     return tempPath; 
    } 
} 
} 

Qui potete vedere sto usando uithread per lo streaming video .IS Esiste un modo per gestire questo dalla mia sul filo

quello che ho provato è

new Thered(new Runnable() { 
     public void run() { 
      playVideo(); 
     } 
    }).start(); 

ma non riesce

e anche durante l'esecuzione di Android 2.2 Le piste primo codice e si vede error(-38,0) i n Android 2.1 qual è questo errore ?? Ho controllato This File ma non riesco a scoprire quale errore è questo ??

Qualcuno può Guidarmi ??

+0

Avere un pulsante dire "Riproduci video" e nella sua funzione di clic posizionare il codice Runnable Thread. Avere il proprio thread nella funzione OnCreate() potrebbe diventare disordinato se non gestito correttamente in quanto la creazione dell'attività deve andare sempre bene. A proposito, l'hai provato con l'emulatore Android o il telefono? –

+0

@RahulSundar ho provato al telefono. non volevo usare il pulsante. desidero riprodurre il video direttamente quando entro in attività. ecco perché non ho usato alcun tasto – edwin

+0

Ok. Solo per verificare se tutto funziona correttamente con il thread, avviarlo da un pulsante. Quindi utilizzare lo stesso nella funzione OnCreate(). Per assicurarti che il rendering del video inizi dopo il completamento della creazione dell'attività, concediti un tempo di sospensione sufficiente (5 secondi) e verifica se tutto funziona correttamente. –

risposta

2

Non è necessario recuperare l'intero video e salvarlo nel file system, quindi eseguirlo. Il video che hai citato ha una dimensione di 32 Mb e richiederà così tanto tempo per recuperare tramite la rete. Invece puoi dare il link diretto a videoview, recupererà/buffererà progressivamente il video e lo riprodurrà. Stavi cercando di recuperare i dati video nel thread dell'interfaccia utente, che non è accettabile. Ecco il codice corretto, puoi verificarlo.

public class VideoViewDemo extends Activity { 

private static final String TAG = "VideoViewDemo"; 
private String current; 

/** 
* TODO: Set the path variable to a streaming video URL or a local media 
* file path. 
*/ 
private String path = "http://www.boisestatefootball.com/sites/default/files/videos/original/01%20-%20coach%20pete%20bio_4.mp4"; 
private VideoView mVideoView; 

private Handler handler; 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    handler = new Handler(); 
    setContentView(R.layout.videoview); 
    mVideoView = (VideoView) findViewById(R.id.surface_view); 
/* runOnUiThread(new Runnable() { 
     public void run() { 
      playVideo(); 
     } 
    }); 
*/  
    playVideo(); 
    Log.v(TAG, "activity oncreate finished"); 
} 

private void playVideo() { 
    try { 
     // final String path = path; 
     Log.v(TAG, "path: " + path); 
     if (path == null || path.length() == 0) { 
      Toast.makeText(VideoViewDemo.this, "File URL/path is empty", 
        Toast.LENGTH_LONG).show(); 

     } else { 
      // If the path has not changed, just start the media player 
      if (path.equals(current) && mVideoView != null) { 
       mVideoView.start(); 
       mVideoView.requestFocus(); 
       return; 
      } 
      current = path; 

      mVideoView.setVideoPath(path); 
      mVideoView.start(); 
      mVideoView.setMediaController(new MediaController(VideoViewDemo.this)); 
      mVideoView.requestFocus(); 

     } 
    } catch (Exception e) { 
     Log.e(TAG, "error: " + e.getMessage(), e); 
     if (mVideoView != null) { 
      mVideoView.stopPlayback(); 
     } 
    } 
} 

} 
+0

@edwin, la mia risposta è stata utile? – Suji

+0

Grazie per il codice! Ho un'altra domanda, sai se il video verrà salvato da qualche parte sul dispositivo dopo che è stato completamente guardato? È accessibile lì? Per favore vedi anche la mia [domanda] (http://stackoverflow.com/questions/23842450/android-where-do-videoview-and-mediacontroller-store-media-downloaded-with-htt) su quel problema – nburk

Problemi correlati