Application YouTube pour Android Play Video Intent

148

J'ai créé une application où vous pouvez télécharger des vidéos YouTube pour Android. Maintenant, je le veux pour que si vous lisez une vidéo dans l'application native YouTube, vous puissiez la télécharger également. Pour ce faire, j'ai besoin de connaître l'intention de l'application native YouTube pour pouvoir lire l'application YouTube.
Je pourrais le faire facilement si j'avais le programme YouTube sur mon émulateur, donc ma première question est:
1. Puis-je télécharger l'application YouTube pour mon émulateur, ou ...
2. Quelle est l'intention utilisée lorsque l'utilisateur sélectionne une vidéo pour la lecture.

Isaac Waller
la source
hé, j'essaie également de créer une application de téléchargement de vidéos youtube. Donc, je veux savoir que je dois obtenir une clé API pour cela ou simplement je peux utiliser la vue Web dans mon application ?? @ASP
Jaydip Kalkani

Réponses:

263

Et que diriez-vous de ceci:

public static void watchYoutubeVideo(Context context, String id){
    Intent appIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + id));
    Intent webIntent = new Intent(Intent.ACTION_VIEW,
                Uri.parse("http://www.youtube.com/watch?v=" + id));
    try {
        context.startActivity(appIntent);
    } catch (ActivityNotFoundException ex) {
        context.startActivity(webIntent);
    }
} 

Remarque: méfiez-vous lorsque vous utilisez cette méthode, YouTube peut suspendre votre chaîne en raison de spam, cela s'est produit deux fois avec moi

Roger Garzon Nieto
la source
5
Accessoires pour prendre en charge l'application YouTube si elle est disponible et revenir au navigateur Web si nécessaire. Pour ceux qui viennent à cette question, c'est la réponse à utiliser.
Luke Sapan
Comment lancer l'application YouTube pour la recherche via un mot-clé, par exemple. je veux que l'application youtube soit lancée, puis dans cette recherche de "steve jobs"
Rusheel Jain
@RusheelJain ce serait un nouveau problème. Ce que je ferais, c'est rechercher "texte de recherche d'intention android youtube" ou quelque chose du genre.
voghDev
2
IMHO cela devrait être la réponse acceptée. Merci beaucoup!
Nacho L.
1
C'est la réponse, mais vous devriez peut-être supprimer les éléments statiques dans la déclaration de fonction
Ampersanda
176

Cela fonctionnera sur un appareil mais pas sur l'émulateur selon la réponse de Lemmy .

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
emmby
la source
C'était le gagnant pour moi, si vous avez installé l'application YouTube, elle vous demande si vous souhaitez l'utiliser à la place.
Tristan Warner-Smith
utilisez ce code, j'obtiens le sélecteur d'intention pour youtube et le navigateur. comment le cacher? j'ai juste besoin de me connecter directement au lecteur youtube.
Praveen
@Praveen Chandrasekaran, l'application youtube peut ne pas être disponible - il est préférable d'utiliser l'intention et de laisser le système déterminer quelles applications installées prennent en charge la demande.
cofiem
3
Vous devrez appeler setClassName sur Intent avant d'appeler startActivity, comme ceci: intent.videoClient.setClassName ("com.google.android.youtube", "com.google.android.youtube.PlayerActivity"); Voir la réponse de Sana pour un exemple de code fonctionnel.
Symétrique du
Cela ne fonctionne pas pour moi, sur un vrai appareil avec une application YouTube installée. Il ouvre toujours le navigateur Web. L'approche de Bibbity ci-dessous fonctionne cependant. Ou peut-être le commentaire de Symmetric, je n'ai pas essayé cela.
Mathias Conradt
33

Voici comment j'ai résolu ce problème:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube://" + video_id));
startActivity(intent);

Maintenant que j'ai fait quelques recherches supplémentaires, il semble que je n'avais besoin que de 'vnd.youtube:VIDEO_ID' au lieu de deux barres obliques après les deux points (':' vs ': //'):

http://it-ride.blogspot.com/2010/04/android-youtube-intent.html

J'ai essayé la plupart des suggestions ici et elles ne fonctionnaient pas vraiment très bien avec toutes les méthodes supposées "directes" soulevant des exceptions. Je suppose que, avec ma méthode, si l'application YouTube n'est PAS installée, le système d'exploitation a une position de repli par défaut autre que le crash de l'application. L'application ne fonctionne théoriquement que sur les appareils avec l'application YouTube sur eux de toute façon, cela ne devrait donc pas être un problème.

Bibbity Bobbity Boo
la source
Bonjour, Est-il possible de lire des vidéos YouTube dans l'application au lieu de les lire dans Webview?
Scorpion
@Scorpion Il existe une API youtube, avec une telle possibilité.
Matthewek
1
Cela fonctionne très bien! Mais il vous manque une parenthèse droite sur la première ligne.
KostasC
18

Utilisez mon code .. Je peux lire une vidéo youtube en utilisant ce code ... il vous suffit de fournir l'identifiant de la vidéo youtube dans la variable "videoId" ....

String videoId = "Fee5vbFLYM4";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId)); 
intent.putExtra("VIDEO_ID", videoId); 
startActivity(intent); 
Soubhab Pathak
la source
3
Cela démarre directement l'application YouTube, en contournant le menu de sélection dans lequel vous pouvez choisir entre Chrome et YouTube sur JellyBean.
r1k0
2
@ r1k0 Oui .... Ce code démarrera directement l'application Youtube par défaut pour lire la vidéo youtube dans tous les types d'oses Android (pas seulement dans JellyBean).
Soubhab Pathak
1
Si vous avez plus d'une application de lecteur youtube (exemple Firetube), cela vous fera toujours choisir. Juste dire et clarifier les choses.
jj_
11
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
startActivityForResult(videoClient, 1234);

Où se videoIdtrouve l'ID vidéo de la vidéo YouTube à lire. Ce code fonctionne bien sur Motorola Milestone .

Mais en gros, ce que nous pouvons faire est de vérifier quelle activité est chargée lorsque vous démarrez l'application Youtube et de remplacer en conséquence le packageName et le className.

Sana
la source
J'obtiens l'erreur suivante. ERROR/AndroidRuntime(1519): Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.google.android.youtube/com.google.android.youtube.PlayerActivity}; have you declared this activity in your AndroidManifest.xml? Veuillez résoudre ceci.
Vinothkumar Arputharaj
Quel est ton appareil? Ce nom d'activité n'est spécifique que pour un Motorola Milestone, mais si vous souhaitez voir le nom de l'activité de l'activité youtube, branchez votre appareil en mode de débogage USB et voyez le LogCat lorsque vous cliquez sur l'application Youtube. Il devrait vous donner le nom du package alogn avec le nom de l'activité.
Sana
7

YouTube (et l'application Market) ne sont censés être utilisés qu'avec des ROM spéciales, que Google a publiées pour le G1 et le G2. Vous ne pouvez donc pas les exécuter dans une ROM OpenSource, comme celle utilisée dans l'émulateur, malheureusement. Eh bien, peut-être que vous le pouvez, mais pas d'une manière officiellement prise en charge.

Lemmy
la source
Connaissez-vous la manière non prise en charge?
Isaac Waller
Non désolé. Je ne voulais tout simplement pas écarter cette possibilité.
Lemmy
6

EDIT: L'implémentation ci-dessous s'est avérée avoir des problèmes sur au moins certains appareils HTC (ils ont planté). Pour cette raison, je n'utilise pas setclassname et je m'en tiens au menu du sélecteur d'action. Je déconseille fortement d'utiliser mon ancienne implémentation.

Voici l'ancienne implémentation:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(youtubelink));
if(Utility.isAppInstalled("com.google.android.youtube", getActivity())) {
    intent.setClassName("com.google.android.youtube", "com.google.android.youtube.WatchActivity");
}
startActivity(intent);

Où Utility est ma propre classe d'utilité personnelle avec la méthode suivante:

public static boolean isAppInstalled(String uri, Context context) {
    PackageManager pm = context.getPackageManager();
    boolean installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        installed = false;
    }
    return installed;
}

Tout d'abord, je vérifie si YouTube est installé, s'il est installé, je dis à Android quel package je préfère ouvrir mon intention.

Warpzit
la source
Qu'est-ce que l'utilité? Je ne le vois pas comme une importation disponible.
IgorGanapolsky
+1 pour l'EDIT. L'utilisation d'un nom de classe explicite n'est certainement pas fiable.
Giulio Piancastelli
5

Je l'ai trouvé:

03-18 12:40:02.842: INFO/ActivityManager(68): Starting activity: Intent { action=android.intent.action.VIEW data=(URL TO A FLV FILE OF THE VIDEO) type=video/* comp={com.google.android.youtube/com.google.android.youtube.YouTubePlayer} (has extras) }
Isaac Waller
la source
Impressionnant! Alors venez-vous de créer un récepteur de diffusion pour cela?
Dan le
4

En réponse à une vieille question, juste pour vous informer que le paquet a changé, voici la mise à jour

Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData("VALID YOUTUBE LINK WITH HTTP");
videoClient.setClassName("com.google.android.youtube", "com.google.android.youtube.WatchActivity");
startActivity(videoClient);

Cela fonctionne très bien, mais lorsque vous appelez Intent normal avec ACTION_VIEW avec une URL youtube valide, l'utilisateur obtient quand même le sélecteur d'activité.

Shardul
la source
3

Le moyen le plus sûr d'exécuter des vidéos sur une application différente consiste à essayer d'abord de résoudre le package, en d'autres termes, de vérifier que l'application est installée sur l'appareil. Donc, si vous voulez diffuser une vidéo sur youtube, vous feriez quelque chose comme ceci:

public void playVideo(String key){

    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + key));

    // Check if the youtube app exists on the device
    if (intent.resolveActivity(getPackageManager()) == null) {
        // If the youtube app doesn't exist, then use the browser
        intent = new Intent(Intent.ACTION_VIEW,
                Uri.parse("http://www.youtube.com/watch?v=" + key));
    }

    startActivity(intent);
}
Ahmad
la source
2
/**
 * Intent to open a YouTube Video
 * 
 * @param pm
 *            The {@link PackageManager}.
 * @param url
 *            The URL or YouTube video ID.
 * @return the intent to open the YouTube app or Web Browser to play the video
 */
public static Intent newYouTubeIntent(PackageManager pm, String url) {
    Intent intent;
    if (url.length() == 11) {
        // youtube video id
        intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube://" + url));
    } else {
        // url to video
        intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    }
    try {
        if (pm.getPackageInfo("com.google.android.youtube", 0) != null) {
            intent.setPackage("com.google.android.youtube");
        }
    } catch (NameNotFoundException e) {
    }
    return intent;
}
Jared Rummler
la source
1

Vous pouvez également simplement saisir le WebViewClient

wvClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
  if (url.startsWith("youtube:")) {
    String youtubeUrl = "http://www.youtube.com/watch?v="
    + url.Replace("youtube:", "");
  startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(youtubeUrl)));
}
return false;
}

A bien fonctionné dans mon application.

Auri Rahimzadeh
la source
N'oubliez pas que toujours - Google n'autorise jamais la lecture de vidéo YouTube dans Webview. Parce qu'ils fournissent une API Youtube pour lire des vidéos Youtube sur l'application Android. Si vous lisez une vidéo Youtube dans la vue Web, Google supprimera votre application de Playstore.
santosh devnath
1

Essaye ça:

public class abc extends Activity implements OnPreparedListener{

  /** Called when the activity is first created. */

  @Override
    public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));          


    @Override
      public void onPrepared(MediaPlayer mp) {
        // TODO Auto-generated method stub

    }
  }
}
premsagar
la source
0

Cela fonctionnera si l'application youtube est installée. Sinon, un sélecteur apparaîtra pour sélectionner une autre application:

Uri uri = Uri.parse( "https://www.youtube.com/watch?v=bESGLojNYSo" );
uri = Uri.parse( "vnd.youtube:" + uri.getQueryParameter( "v" ) );
startActivity( new Intent( Intent.ACTION_VIEW, uri ) );
RonTLV
la source
0

Essaye ça,

WebView webview = new WebView(this); 

String htmlString = 
    "<html> <body> <embed src=\"youtube link\"; type=application/x-shockwave-flash width="+widthOfDevice+" height="+heightOfDevice+"> </embed> </body> </html>";

webview.loadData(htmlString ,"text/html", "UTF-8");
Raju Jadhav
la source
Cela ne fonctionne pas non plus pour moi. Y a-t-il une exigence de lecteur flash dans l'émulateur.
L'iCoder
0

Cette fonction fonctionne bien pour moi ... il suffit de passer la chaîne d'URL dans la fonction:

void watch_video(String url)
{
    Intent yt_play = new Intent(Intent.ACTION_VIEW, Uri.parse(url))
    Intent chooser = Intent.createChooser(yt_play , "Open With");

    if (yt_play .resolveActivity(getPackageManager()) != null) {
                    startActivity(chooser);
                }
}
Manthan Patel
la source
0

Vous pouvez utiliser l'API du lecteur Youtube Android pour lire la vidéo si l'application Youtube est installée, sinon invitez simplement l'utilisateur à choisir parmi les navigateurs Web disponibles.

if(YouTubeIntents.canResolvePlayVideoIntent(mContext)){
                    mContext.startActivity(YouTubeIntents.createPlayVideoIntent(mContext, mVideoId));
}else {
    Intent webIntent = new Intent(Intent.ACTION_VIEW, 
           Uri.parse("http://www.youtube.com/watch?v=" + mVideoId));

    mContext.startActivity(webIntent);
}
Manpreet
la source