Aplicativo do YouTube para Android Reproduzir intenção de vídeo

148

Eu criei um aplicativo onde você pode baixar vídeos do YouTube para Android. Agora, quero que, se você reproduzir um vídeo no aplicativo nativo do YouTube, também possa fazer o download. Para fazer isso, preciso saber a Intenção que o aplicativo nativo do YouTube divulga para reproduzir o aplicativo do YouTube.
Eu poderia fazer isso facilmente se tivesse o programa do YouTube no meu emulador, então minha primeira pergunta é:
1. Posso baixar o aplicativo do YouTube para o meu emulador ou ...
2. Qual é a intenção usada quando o usuário seleciona um vídeo para reprodução.

Isaac Waller
fonte
Ei, também estou tentando criar um aplicativo de download de vídeos do YouTube. Então, eu quero saber que eu tenho que obter qualquer chave API para isso ou simplesmente posso usar o webview no meu aplicativo? @ASP
Jaydip Kalkani

Respostas:

263

E quanto a isso:

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: cuidado ao usar esse método, o YouTube pode suspender seu canal devido a spam, isso aconteceu duas vezes comigo

Roger Garzon Nieto
fonte
5
Adereços para dar suporte ao aplicativo do YouTube, se estiver disponível, e voltar ao navegador da Web, se necessário. Para quem vem a esta pergunta, esta é a resposta a ser usada.
Luke Sapan
Como iniciar o aplicativo do YouTube para pesquisa por palavra-chave, por exemplo. eu quero o aplicativo do YouTube para ser lançado e, em seguida, que pesquisa "Steve Jobs"
Rusheel Jain
@RusheelJain que seria um novo problema. O que eu faria é procurar "texto de pesquisa por intenção do youtube do Android" ou algo assim.
precisa saber é o seguinte
2
IMHO esta deve ser a resposta aceita. Muito obrigado!
Nacho L.
1
Esta é a resposta, mas talvez você deve remover a estática na declaração da função
Ampersanda
176

Isso funcionará em um dispositivo, mas não no emulador de acordo com a resposta de Lemmy .

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
empapar
fonte
Esse foi o vencedor para mim, se você tiver o aplicativo do youtube instalado, ele perguntará se deseja usá-lo.
Tristan Warner-Smith
usar esse código, recebo o seletor de intenções para o youtube e o navegador. como esconder isso? eu só preciso ligar diretamente até o player do youtube.
Praveen
@Praveen Chandrasekaran, o aplicativo do YouTube pode não estar disponível - é melhor usar o Intent e deixar o sistema descobrir quais aplicativos instalados suportam a solicitação.
cofiem 23/09/10
3
Você precisará chamar setClassName no Intent antes de chamar startActivity, assim: intent.videoClient.setClassName ("com.google.android.youtube", "com.google.android.youtube.PlayerActivity"); Veja a resposta de Sana para um exemplo de código funcional.
Simétrico
Isso não funciona para mim, em um dispositivo real com o aplicativo do youtube instalado. Ainda abre o navegador da web. A abordagem de Bibbity abaixo funciona embora. Ou talvez o comentário de Symmetric, não tenha tentado isso.
Mathias Conradt
33

Aqui está como eu resolvi esse problema:

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

Agora que fiz mais pesquisas, parece que eu só precisava de 'vnd.youtube:VIDEO_ID' em vez de duas barras após os dois pontos (':' vs. ': //'):

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

Tentei a maioria das sugestões aqui e elas realmente não funcionaram muito bem com todos os supostos métodos "diretos" gerando exceções. Suponho que, com meu método, se o aplicativo do YouTube NÃO estiver instalado, o sistema operacional terá uma posição de fallback padrão de algo diferente de travar o aplicativo. Teoricamente, o aplicativo só funciona em dispositivos com o aplicativo do YouTube, então isso não deve ser um problema.

Bibbity Bobbity Boo
fonte
Olá, é possível reproduzir vídeos do youtube no aplicativo em vez de reproduzi-lo no Webview?
Scorpion
@ Escorpião Existe uma API do youtube, com essa possibilidade.
Matthewek 31/05
1
Isso funciona muito bem! Mas você está perdendo um parêntese certo na primeira linha.
KostasC
18

Use meu código .. Eu posso reproduzir vídeo do youtube usando esse código ... você só precisa fornecer o ID do vídeo do youtube na variável "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
fonte
3
Isso inicia diretamente o aplicativo do YouTube, ignorando o menu de seleção no qual você pode escolher entre o chrome e o YouTube no JellyBean.
R1k0
2
@ r1k0 Sim .... Este código iniciará diretamente o aplicativo padrão do YouTube para reproduzir o vídeo do youtube em todos os tipos de sistemas operacionais Android (não apenas no JellyBean).
Soubhab Pathak
1
Se você tiver mais de um aplicativo player do youtube (por exemplo, Firetube), ele ainda fará você escolher. Apenas dizendo e deixando claro.
jj_
11
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
startActivityForResult(videoClient, 1234);

Onde videoIdestá o ID do vídeo do youtube que deve ser reproduzido. Esse código funciona bem no Motorola Milestone .

Mas basicamente o que podemos fazer é verificar qual atividade é carregada quando você inicia o aplicativo do Youtube e, portanto, substitui o packageName e o className.

Sana
fonte
Estou recebendo o seguinte erro. 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? Por favor, resolva isso.
Vinothkumar Arputharaj
Qual é o seu dispositivo? Esse nome de atividade é específico apenas para um Motorola Milestone, mas se você quiser ver o nome da atividade do youtube, conecte seu dispositivo no modo de depuração USB e veja o LogCat ao clicar no aplicativo do YouTube. Ele deve fornecer o nome do pacote alogn com o nome da atividade.
Sana
7

O YouTube (e o aplicativo Market) devem ser usados ​​apenas com ROMs especiais, lançadas pelo Google para o G1 e o G2. Portanto, você não pode executá-los em um OpenSource-ROM, como o usado no emulador, infelizmente. Bem, talvez você possa, mas não de uma maneira oficialmente suportada.

Lemmy
fonte
Você conhece a maneira não suportada?
Isaac Waller
Desculpe, não. Só não queria descartar a possibilidade.
Lemmy
6

EDIT: A implementação abaixo provou ter problemas em pelo menos alguns dispositivos HTC (eles travaram). Por esse motivo, não uso o setclassname e fico com o menu do seletor de ações. Eu desencorajo fortemente usar minha antiga implementação.

A seguir está a implementação antiga:

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

Onde Utility é minha própria classe de utilitário pessoal com o seguinte 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;
}

Primeiro, verifico se o youtube está instalado, se estiver instalado, digo ao android qual pacote eu prefiro abrir minha intenção.

Warpzit
fonte
O que é utilitário? Não o vejo como uma importação disponível.
precisa saber é o seguinte
+1 para a edição. Usar um nome de classe explícito é definitivamente não confiável.
Giulio Piancastelli
5

Encontrei:

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
fonte
Impressionante! Então você acabou de criar um receptor de transmissão para isso?
Dan
4

Respondendo à pergunta antiga, apenas para informar a vocês que o pacote mudou, veja a atualização

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

Isso funciona muito bem, mas quando você chama Intent normal com ACTION_VIEW com URL válido, o usuário do YouTube obtém o seletor de atividades de qualquer maneira.

Shardul
fonte
3

A maneira mais segura de executar vídeos em um aplicativo diferente é tentar primeiro resolver o pacote, ou seja, verificar se o aplicativo está instalado no dispositivo. Então, se você quiser rodar um vídeo no youtube, faça algo assim:

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
fonte
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
fonte
1

Você também pode simplesmente pegar o 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;
}

Funcionou bem no meu aplicativo.

Auri Rahimzadeh
fonte
Lembre-se disso: o Google nunca permite a reprodução de vídeos do YouTube dentro do Webview. Porque eles fornecem a API do YouTube para reproduzir vídeos do YouTube no aplicativo Android. Se você reproduzir um vídeo do YouTube dentro da visualização na web, o Google removerá seu aplicativo do Playstore.
devnath santosh
1

Tente o seguinte:

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
fonte
0

Isso funcionará se o aplicativo do youtube estiver instalado. Caso contrário, um seletor aparecerá para selecionar outro aplicativo:

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
fonte
0

Tente isso,

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
fonte
Isso também não é funcionado para mim. Existe algum requisito do flash player no emulador.
O iCoder
0

Essa função funciona bem para mim ... basta passar a string de URL na função:

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
fonte
0

Você pode usar a API do player Android do YouTube para reproduzir o vídeo se o aplicativo do Youtube estiver instalado; caso contrário, peça ao usuário para escolher entre os navegadores da web disponíveis.

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
fonte