Aplicación Android YouTube Reproducir Intención de video


148

He creado una aplicación donde puedes descargar videos de YouTube para Android. Ahora, lo quiero para que si reproduces un video en la aplicación nativa de YouTube, también puedas descargarlo. Para hacer esto, necesito saber la intención que la aplicación nativa de YouTube publica para reproducir la aplicación de YouTube.
Podría hacerlo fácilmente si tuviera el programa de YouTube en mi emulador, así que mi primera pregunta es:
1. ¿Puedo descargar la aplicación de YouTube para mi emulador, o ...
2. ¿Cuál es la intención utilizada cuando el usuario selecciona un video? para la reproducción


Hola, también estoy tratando de hacer una aplicación de descarga de videos de YouTube. Entonces, quiero saber que tengo que obtener cualquier clave de API para eso o simplemente puedo usar webview en mi aplicación. @ASP
Jaydip Kalkani

Respuestas:


263

Y qué tal esto:

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);
    }
} 

Nota: Tenga cuidado cuando use este método, YouTube puede suspender su canal debido a spam, esto sucedió dos veces conmigo


55
Consejos para apoyar la aplicación de YouTube si está disponible y recurrir al navegador web si es necesario. Para aquellos que vienen a esta pregunta, esta es la respuesta a usar.
Luke Sapan,

Cómo iniciar la aplicación de YouTube para la búsqueda a través de palabras clave, por ejemplo. Quiero que se inicie la aplicación de YouTube y luego en esa búsqueda de "Steve
Jobs

@RusheelJain eso sería un nuevo problema. Lo que haría es buscar "texto de búsqueda de intención de YouTube para Android" o algo así.
voghDev

2
En mi humilde opinión, esta debería ser la respuesta aceptada. ¡Muchas gracias!
Nacho L.

1
Esta es la respuesta, pero tal vez usted debería eliminar la estática en la declaración de función
Ampersanda

176

Esto funcionará en un dispositivo pero no en el emulador según la respuesta de Lemmy .

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));

Este fue el ganador para mí, si tienes instalada la aplicación de YouTube, te pregunta si quieres usarla.
Tristan Warner-Smith

use este código, obtengo el selector de intención para youtube y navegador. como esconderlo Solo necesito vincular directamente al reproductor de YouTube.
Praveen

@Praveen Chandrasekaran, la aplicación de YouTube puede no estar disponible; es mejor usar la intención y dejar que el sistema determine qué aplicaciones instaladas admiten la solicitud.
cofiem el

3
Deberá llamar a setClassName en la intención antes de llamar a startActivity, de esta manera: intent.videoClient.setClassName ("com.google.android.youtube", "com.google.android.youtube.PlayerActivity"); Vea la respuesta de Sana para un ejemplo de código de trabajo.
Simétrico

Esto no funciona para mí, en un dispositivo real con la aplicación de YouTube instalada. Todavía abre el navegador web. Sin embargo, el enfoque de Bibbity a continuación funciona. O tal vez el comentario de Symmetric, no lo he intentado.
Mathias Conradt

33

Así es como resolví este problema:

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

Ahora que he investigado un poco más, parece que solo necesitaba 'vnd.youtube:VIDEO_ID' en lugar de dos barras después de los dos puntos (':' vs. ': //'):

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

Intenté la mayoría de las sugerencias aquí y realmente no funcionaron muy bien con todos los supuestos métodos "directos" que generan excepciones. Supongo que, con mi método, si la aplicación de YouTube NO está instalada, el sistema operativo tiene una posición de respaldo predeterminada de algo más que bloquear la aplicación. La aplicación teóricamente solo funciona en dispositivos con la aplicación de YouTube de todos modos, por lo que esto no debería ser un problema.


Hola, ¿es posible reproducir videos de YouTube en la aplicación en lugar de reproducirlos en Webview?
Scorpion

@Scorpion Existe la API de youtube, con tal posibilidad.
Matthewek

1
¡Funciona muy bien! Pero le falta un paréntesis correcto en la primera línea.
KostasC

18

Use mi código ... Puedo reproducir videos de YouTube usando este código ... solo necesita proporcionar la identificación del video de YouTube en 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); 

3
Esto inicia directamente la aplicación de YouTube, sin pasar por el menú de selección en el que puede elegir entre Chrome y YouTube en JellyBean.
r1k0

2
@ r1k0 Sí ... Este código iniciará directamente la aplicación de Youtube predeterminada para reproducir el video de YouTube en todo tipo de aplicaciones Android (no solo en JellyBean).
Soubhab Pathak

1
Si tiene más de una aplicación de reproductor de youtube (por ejemplo, Firetube), todavía le hará elegir. Solo digo y lo dejo claro.
jj_

11
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
startActivityForResult(videoClient, 1234);

¿Dónde videoIdestá la identificación de video del video de YouTube que debe reproducirse? Este código funciona bien en Motorola Milestone .

Pero básicamente, lo que podemos hacer es verificar qué actividad se carga cuando inicia la aplicación de Youtube y, en consecuencia, sustituir el packageName y el className.


Recibo el siguiente error. 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? Resuelva amablemente esto.
Vinothkumar Arputharaj

Cual es tu dispositivo El nombre de esta actividad solo es específico para un Motorola Milestone, pero si desea ver el nombre de la actividad de YouTube, conecte su dispositivo en modo de depuración USB y vea LogCat cuando haga clic en la aplicación de YouTube. Debería darle el nombre del paquete alogn con el nombre de la actividad.
Sana

7

Se supone que Youtube (y la aplicación Market) solo deben usarse con ROM especiales, que Google lanzó para el G1 y el G2. Por lo tanto, no puede ejecutarlos en un OpenSource-ROM, como el que se usa en el emulador, desafortunadamente. Bueno, tal vez puedas, pero no de manera oficial.


¿Conoces la forma no admitida?
Isaac Waller

Lo siento, no. Simplemente no quería descartar la posibilidad.
Lemmy

6

EDITAR: La implementación a continuación demostró tener problemas en al menos algunos dispositivos HTC (se bloquearon). Por esa razón, no uso setclassname y me quedo con el menú de selección de acciones. Desaconsejo encarecidamente usar mi antigua implementación.

La siguiente es la implementación anterior:

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);

Donde Utility es mi propia clase de utilidad personal con el siguiente método:

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;
}

Primero verifico si YouTube está instalado, si está instalado, le digo a Android qué paquete prefiero abrir mi intención.


¿Qué es la utilidad? No lo veo como una importación disponible.
IgorGanapolsky

+1 para la edición. Usar un nombre de clase explícito definitivamente no es confiable.
Giulio Piancastelli

5

Lo encontré:

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) }

¡Increíble! Entonces, ¿acabas de crear un receptor de difusión para esto?
Dan

4

Respondiendo a la pregunta anterior, solo para informarles que el paquete ha cambiado, aquí está la actualización

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);

Esto funciona muy bien, pero cuando llamas a Intención normal con ACTION_VIEW con un usuario válido de URL de YouTube, obtienes el selector de Actividad de todos modos.


3

La forma más segura de ejecutar videos en una aplicación diferente es primero intentar resolver el paquete, en otras palabras, verificar que la aplicación esté instalada en el dispositivo. Entonces, si quieres ver un video en YouTube, harías algo como esto:

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);
}


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;
}

1

También puedes agarrar el 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;
}

Funcionó bien en mi aplicación.


Recuerde eso siempre: Google nunca permite reproducir videos de YouTube dentro de Webview. Porque proporcionan API de Youtube para reproducir videos de Youtube en la aplicación de Android. Si reproducirá un video de Youtube dentro de la vista web, Google eliminará su aplicación de Playstore.
santosh devnath

1

Prueba esto:

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

    }
  }
}

0

Esto funcionará si la aplicación de YouTube está instalada. De lo contrario, aparecerá un selector para seleccionar otra aplicación:

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 ) );

0

Prueba esto,

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");

Esto tampoco me funcionó. ¿Hay algún requerimiento de flash player en el emulador?
El iCoder

0

Esta función funciona bien para mí ... solo pasa la cadena url en la función:

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);
                }
}

0

Puede usar la API del reproductor Android de Youtube para reproducir el video si la aplicación Youtube está instalada; de lo contrario, solo solicite al usuario que elija entre los navegadores 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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.