Streaming to VideoView ne fonctionne que sur Wifi lors de l'utilisation de téléphones Samsung

J'utilise la bibliothèque suivante pour diffuser des vidéos YouTube sur une application Android.

Http://code.google.com/p/android-youtube-player/source/browse/trunk/OpenYouTubeActivity/src/com/keyes/youtube/OpenYouTubePlayerActivity.java?r=3

  • Comment puis-je afficher des ellipses sur mon TextView si elle est supérieure à la ligne 1?
  • Android Studio ne génère pas d'applet aligné sur zip
  • Bad 'Patches' dans le fichier de 9 patchs
  • Impossible d'exécuter 'play' sur 'HTMLMediaElement': l'API ne peut être lancée que par un geste utilisateur
  • Qu'est ce que 'adb shell start / stop' fait?
  • Obtenir le NFC Android Nexus S en mode d'émulation de carte
  • Je suis capable de lire des vidéos sur les téléphones HTC et Motorola sur 3G et Wifi. Cependant, sur les téléphones Samsung Galaxy (Epic 4G) et Samsung Galaxy II, je ne peux que jouer avec Wifi. La 3G me donne cette erreur: "Impossible de lire la vidéo. Désolé, cette vidéo ne peut pas être lue."

    J'ai essayé de forcer une diffusion YouTube de mauvaise qualité, mais cela n'a pas aidé. Je vois dans mon journal que Start() est appelé dans les deux cas (3G / Wifi). Est-ce un problème avec VideoView? Y at-il un travail autour?

    Modifier 2

    Les vidéos proviennent de l'API YouTube. J'ai tenté d'utiliser des flux intégrés et normaux, ainsi que le flux de qualité la plus basse disponible (variable par vidéo). En outre, je ne pense pas que ce soit un problème de codage puisque les mêmes vidéos fonctionnent correctement en utilisant Wifi.

    Modifier 1

    Je reçois également la sortie suivante indépendamment de ses jeux vidéo en utilisant Wifi ou n'utilise pas la 3G.

     01-30 15:22:38.305: E/MediaPlayer(3831): error (1, -1) 01-30 15:22:38.305: E/MediaPlayer(3831): callback application 01-30 15:22:38.305: E/MediaPlayer(3831): back from callback 01-30 15:22:38.309: E/MediaPlayer(3831): Error (1,-1) 

    Selon ce lien , ces erreurs signifient ce qui suit (je pense):

     /* Definition of first error event in range (not an actual error code). */ const PVMFStatus PVMFErrFirst = (-1); /* Return code for general failure */ const PVMFStatus PVMFFailure = (-1); /* /* Return code for general success */ const PVMFStatus PVMFSuccess = 1; /* 

    Ajoutant encore de la confusion.

  • Quelle est la différence entre Android 4.4W (API20) et Android L (API20, L Aperçu) dans SDK Manager?
  • Impossible de résoudre le symbole FragmentCompat
  • Android - android.view.InflateException: ligne de fichier XML binaire n ° 8: erreur de gonflement du fragment de classe
  • Comment puis-je ajouter une bibliothèque (android-support-v7-appcompat) dans IntelliJ IDEA
  • Comment afficher le sélecteur de date pour Android avec seulement des champs de mois et d'année?
  • Comment augmenter la taille de la police de l'élément spinner?
  • 3 Solutions collect form web for “Streaming to VideoView ne fonctionne que sur Wifi lors de l'utilisation de téléphones Samsung”

    Oui, comme vous le pensez, c'est un problème dans VideoView , des problèmes similaires apparaissent également dans MediaPlayer et j'ai rencontré des problèmes similaires et étranges comme vous l'avez fait, j'ai eu des problèmes lorsque la vidéo a été jouée uniquement sur la 3G et pas sur la connexion Wi- Fi. Cela se produit habituellement sur 2.1 et certains appareils 2.2, mais pas sur des niveaux d'API plus élevés que j'ai vu jusqu'ici.

    Donc, ce que je peux recommander est de faire ce qui suit:

    Vérifiez d'abord si le périphérique en cours peut être susceptible d'avoir des problèmes, quelque chose comme ceci:

     //Define a static list of known devices with issues static List sIssueDevices=Arrays.asList(new String[]{"HTC Desire","LG-P500","etc"}); if(Build.VERSION.SDK_INT<9){ if(sIssueDevices.contains(Build.Device){ //This device may have issue in streaming, take appropriate actions } } 

    Donc, c'était la partie la plus simple, pour détecter si le périphérique en cours peut avoir des problèmes lors de la diffusion de la vidéo. Maintenant, ce que j'ai fait et je peux également vous aider, est de sauvegarder la vidéo de Youtube dans un fichier sur la VideoView et de configurer ce fichier comme source pour votre VideoView . J'écrirai quelques extraits de code pour voir comment ma démarche était:

     private class GetYoutubeFile extends Thread{ private String mUrl; private String mFile; public GetYotubeFile(String url,String file){ mUrl=url; mFile=file; } @Override public void run() { super.run(); try { File bufferingDir=new File(Environment.getExternalStorageDirectory() +"/YoutubeBuff"); File bufferFile=new File(bufferingDir.getAbsolutePath(), mFile); //bufferFile.createNewFile(); BufferedOutputStream bufferOS=new BufferedOutputStream( new FileOutputStream(bufferFile)); URL url=new URL(mUrl); URLConnection connection=url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla"); connection.connect(); InputStream is=connection.getInputStream(); BufferedInputStream bis=new BufferedInputStream(is,2048); byte[] buffer = new byte[16384]; int numRead; boolean started=false; while ((numRead = bis.read(buffer)) != -1 && !mActivityStopped) { //Log.i("Buffering","Read :"+numRead); bufferOS.write(buffer, 0, numRead); bufferOS.flush(); mBuffPosition += numRead; if(mBuffPosition>120000 &&!started){ Log.e("Player","BufferHIT:StartPlay"); setSourceAndStartPlay(bufferFile); started=true; } } Log.i("Buffering","Read -1?"+numRead+" stop:"+mActivityStopped); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public void setSourceAndStartPlay(File bufferFile) { try { mPlayer.setVideoPath(bufferFile.getAbsolutePath()); mPlayer.prepare(); mPlayer.start(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 

    Un autre problème se produira lorsque la VideoView a cessé de jouer avant la fin du fichier, car il n'y avait pas suffisamment de tampon dans le fichier. Pour cela, vous devez définir un onCompletionListener() et si vous n'êtes pas à la fin de la vidéo, vous devez recommencer la lecture vidéo de la dernière position:

     public void onCompletion(MediaPlayer mp) { mPlayerPosition=mPlayer.getCurrentPosition(); try { mPlayer.reset(); mPlayer.setVideoPath( new File("mnt/sdcard/YoutubeBuff/"+mBufferFile).getAbsolutePath()); mPlayer.seekTo(mPlayerPosition); mPlayer.start(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 

    En fin de compte, bien sûr, le thread GetYoutubeFile est démarré dans la méthode onCreate() :

     public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //init views,player,etc new GetYoutubeFile().start(); } 

    Certaines modifications et adaptations, je pense, devront être faites pour ce code, et ce ne sera peut-être pas la meilleure approche, mais cela m'a aidé et je n'ai pas trouvé d'alternative.

    J'ai abordé ce problème à ma manière. Avant chaque lecture de votre chat. Si vous avez

     Error (1,-1) 

    Cela signifie que vous serez sorry,this video can not play message . Dans ce cas, terminez cette activité, donnez une barre de progression personnalisée et téléchargez la sorry,this video can not play message . Ensuite, après le téléchargement, enregistrez-la dans un dossier temporaire, puis jouez-la. Après la lecture, supprimez ce dossier.

    À la lecture de chat de journal —

      try { Process process = Runtime.getRuntime().exec("logcat -d"); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); StringBuilder log=new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { log.append(line); } } catch (IOException e) { } 

    Lisez également cette réponse. Bien qu'il ne s'agisse que d'une expérience utilisateur qui n'est pas liée à l'application. Mais cela arrive parfois dans une application par défaut aussi

    Des tas de vidéos, même si j'ai une couverture complète du réseau 3G, diront: "Désolé, cette vidéo ne peut pas être jouée". Un jour, je me suis tellement ennuyé avec ça, je continuais d'appuyer sur «OK» pour rejeter le message, puis je recommençais la vidéo pour voir le message «Désolé, cette vidéo ne peut pas être lue» à nouveau. J'ai répété ce processus (dans ma colère aveugle), mais finalement, après environ 5 essais, la vidéo a décidé de jouer miraculeusement!

    Cette méthode fonctionne à peu près à chaque fois. La plupart des vidéos ne veulent pas jouer la première fois, mais finalement, si je suis persévérant et je ne peux pas continuer à jouer, même s'il me dit qu'il ne peut pas jouer la vidéo, ça va jouer! Bien que, certaines vidéos, j'ai dû appuyer sur «OK», appuyer sur la vidéo, appuyer sur «OK», appuyer sur la vidéo, etc. … comme 20 fois avant même de décider de jouer. À ce moment-là, j'ai été incroyablement proche d'avoir eu mon téléphone et de le jeter dans le sol à cause de la merde avec laquelle youtube ne fonctionnera pas.

    J'aimerais qu'il y ait un moyen de résoudre ce problème. Personne ne semble avoir trouvé une solution. Tout le monde dit simplement "oh, oui, j'ai le même problème", mais personne ne contribue à rien. GOOGLE, RESTEZ CE PROBLÈME SUR VOS TÉLÉPHONES. CELUI-CE POURRAIT ETRE ENREGISTREMENT DANS LE MONDE, SUR UNE GAMME DE TÉLÉPHONES ANDROIDES.

    Ce message échoue souvent à partir du codage inapproprié de la vidéo ("Impossible de lire la vidéo. Désolé, cette vidéo ne peut pas être lue.") J'avais des difficultés avec la visualisation vidéo pendant un moment, maintenant les vidéos encodées correctes fonctionnent sur tous les appareils testés, même si vous utilisez Wifi Ou 3G. On sait si vous voulez savoir comment coder les vidéos. Et pour diffuser les vidéos, j'ai utilisé la démo de Android sdk apis et ça fonctionne parfaitement.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.