2013-02-26 10 views
5

Chcę przesłać URL wideo w formie wideo w widoku wideo w systemie Android. Używam kod przykładowy API i zrobić małą modyfikację w celu uzyskania że moja potrzeba kod .My jestWideo z Androidem Zobacz w innym wątku i numerze z Androidem 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; 
    } 
} 
} 

Tutaj można zobaczyć używam uithread strumienia wideo .Is istnieje sposób obsłużyć to przez mój na gwint

co starałem się

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

ale nie udaje

a także ile działa w Androidzie 2.2 Pierwsze uruchamia kod i pokazuje mi error(-38,0) n Android 2.1 jaki jest ten błąd? Sprawdziłem This File, ale nie mogę się dowiedzieć, jaki jest błąd?

Czy ktoś może mnie prowadzić?

+0

Masz przycisk powiedz "Odtwarzaj wideo", aw jego funkcji klikania umieść swój kod Runnable Thread. Posiadanie własnego wątku w funkcji OnCreate() może stać się kłopotliwe, jeśli nie będzie odpowiednio obsługiwane, ponieważ tworzenie aktywności musi zawsze przebiegać poprawnie. Przy okazji, czy próbowałeś tego w emulatorze Androida lub telefonie? –

+0

@RahulSundar próbowałem przez telefon. nie chciałem używać przycisku. Chcę odtwarzać wideo bezpośrednio po wejściu do działania. to dlatego nie użyłem żadnego przycisku – edwin

+0

Ok. Aby sprawdzić, czy wszystko działa poprawnie z wątkiem, uruchom go za pomocą przycisku. Następnie użyj tego samego w funkcji OnCreate(). Aby upewnić się, że renderowanie wideo rozpocznie się po zakończeniu tworzenia działania, daj wystarczająco dużo czasu na sen (5 sekund) i sprawdź, czy wszystko działa poprawnie. –

Odpowiedz

2

Nie musisz pobierać całego pliku wideo i zapisać go w systemie plików, a następnie go uruchomić. Wspomniany film ma rozmiar 32 MB, a jego pobranie zajmie tyle czasu. Zamiast tego możesz podać bezpośredni link do podglądu wideo, będzie on stopniowo pobierać/buforować wideo i odtwarzać go. Próbujesz pobrać dane wideo w wątku interfejsu użytkownika, co jest niedopuszczalne. Tutaj jest poprawiony kod, możesz to sprawdzić.

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, czy moja odpowiedź była przydatna? – Suji

+0

Dzięki za kod! Mam inne pytanie, czy wiesz, czy film zostanie zapisany gdzieś na urządzeniu po jego całkowitym obejrzeniu? Czy jest tam dostępny? Proszę również zobaczyć moje [pytanie] (http://stackoverflow.com/questions/23842450/android-where-do-videoview-and-mediacontroller-store-media-downloaded-with-htt) w tej kwestii – nburk