Android YouTube приложение Play Video Intent


148

Я создал приложение, где вы можете скачать видео с YouTube для Android. Теперь я хочу, чтобы, если вы воспроизводите видео в нативном приложении YouTube, вы также можете его скачать. Для этого мне нужно знать намерение, которое выдает нативное приложение YouTube, чтобы воспроизвести приложение YouTube.
Я мог бы сделать это легко, если бы на моем эмуляторе была установлена ​​программа YouTube, поэтому мой первый вопрос:
1. Могу ли я загрузить приложение YouTube для своего эмулятора или ...
2. Какое намерение используется, когда пользователь выбирает видео для воспроизведения.


эй, я также пытаюсь сделать приложение для загрузки видео на YouTube. Итак, я хочу знать, что я должен получить любой ключ API для этого или просто я могу использовать веб-просмотр в моем приложении? @ASP
Джайдип Калкани

Ответы:


263

А как насчет этого:

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

Примечание: будьте осторожны, когда вы используете этот метод, YouTube может приостановить ваш канал из-за спама, это случилось со мной два раза


5
Рекомендуете поддерживать приложение YouTube, если оно доступно, и при необходимости обращаться к веб-браузеру. Для тех, кто подходит к этому вопросу, это ответ для использования.
Люк Сапан

Как запустить приложение YouTube для поиска по ключевому слову, например. я хочу, чтобы приложение youtube было запущено, а затем в этом поиске «steve jobs»
Rusheel Jain

@RusheelJain, это будет новая проблема. То, что я бы сделал, это поиск "android youtube intent search text" или что-то в этом роде.
voghDev

2
ИМХО это должен быть принятый ответ. Большое спасибо!
Начо Л.

1
Это ответ, но, возможно, вы должны удалить статические в объявлении функции
Ampersanda

176

Это будет работать на устройстве, но не на эмуляторе согласно ответу Лемми .

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

Для меня это победило, если у вас установлено приложение youtube, оно спросит, хотите ли вы использовать его вместо этого.
Тристан Уорнер-Смит

используйте этот код, я получаю намерение выбора для YouTube и браузера. как это скрыть? Мне просто нужно напрямую связаться с YouTube Player.
Правин

@Praveen Chandrasekaran приложение youtube может быть недоступно - лучше всего использовать Intent и позволить системе определить, какие установленные приложения поддерживают запрос.
cofiem,

3
Вам нужно вызвать setClassName в Intent перед вызовом startActivity, например: intent.videoClient.setClassName ("com.google.android.youtube", "com.google.android.youtube.PlayerActivity"); Смотрите ответ Саны для примера рабочего кода.
Симметричный

Это не работает для меня, на реальном устройстве с установленным приложением YouTube. Он по-прежнему открывает веб-браузер. Подход Bibbity ниже работает, хотя. Или, возможно, комментарий Симметрика, не пробовал это.
Матиас Конрадт

33

Вот как я решил эту проблему:

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

Теперь, когда я провел еще какое-то исследование, похоже, мне нужен был только vnd.youtube:VIDEO_ID, а не две косые черты после двоеточия (':' vs. ': //'):

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

Я попробовал большинство предложений здесь, и они не очень хорошо работали со всеми предполагаемыми «прямыми» методами, вызывающими исключения. Я бы предположил, что с моим методом, если приложение YouTube НЕ установлено, ОС по умолчанию имеет запасную позицию, отличную от сбоя приложения. Приложение теоретически работает только на устройствах с приложением YouTube, так что это должно быть проблемой.


Здравствуйте, возможно ли воспроизводить видео на YouTube в приложении вместо воспроизведения в Webview?
Скорпион

@ Scorpion Есть API YouTube, с такой возможностью.
Matthewek

1
Работает отлично! Но вам не хватает одной правильной скобки в первой строке.
KostasC

18

Используйте мой код ... Я могу воспроизводить видео YouTube с помощью этого кода ... вам просто нужно предоставить идентификатор видео YouTube в переменной "videoId" ....

String videoId = "Fee5vbFLYM4";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId)); 
intent.putExtra("VIDEO_ID", videoId); 
startActivity(intent); 

3
Это непосредственно запускает приложение YouTube, минуя меню выбора, в котором вы можете выбрать между Chrome и YouTube в JellyBean.
r1k0

2
@ r1k0 Да .... Этот код напрямую запустит приложение Youtube по умолчанию для воспроизведения видео на YouTube во всех типах ОС Android (не только в JellyBean).
Soubhab Pathak

1
Если у вас есть более одного приложения на YouTube (например, Firetube), оно все равно заставит вас выбрать. Просто говорю и проясняю.
jj_

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

Где videoIdнаходится идентификатор видео для YouTube видео, которое должно быть воспроизведено. Этот код отлично работает на Motorola Milestone .

Но в основном то, что мы можем сделать, это проверить, какая активность загружается при запуске приложения Youtube и, соответственно, заменить имя_пакета и имя_класса.


Я получаю следующую ошибку. 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? Пожалуйста, разрешите это.
Виноткумар Арпутарадж

Какое у тебя устройство? Это имя активности относится только к Motorola Milestone, но если вы хотите увидеть имя активности для подключаемого модуля активности YouTube на вашем устройстве в режиме отладки по USB и увидеть LogCat при нажатии на приложение Youtube. Он должен дать вам имя пакета alogn с именем активности.
Сана

7

Предполагается, что Youtube (и приложение Market) будут использоваться только со специальными ПЗУ, которые Google выпустила для G1 и G2. Таким образом, вы не можете запускать их в OpenSource-ROM, например, используемом в эмуляторе, к сожалению. Ну, может быть, вы можете, но не официально поддерживаемым способом.


Вы знаете неподдерживаемый способ?
Исаак Уоллер

Извините но нет. Просто не хотел исключать возможность.
Лемми

6

РЕДАКТИРОВАТЬ: ниже реализация оказалась проблема по крайней мере на некоторых устройствах HTC (они потерпели крах). По этой причине я не использую setclassname и придерживаюсь меню выбора действий. Я настоятельно не рекомендую использовать мою старую реализацию.

Ниже приводится старая реализация:

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

Где Utility - это мой собственный класс утилит со следующим методом:

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

Сначала я проверяю, установлен ли YouTube, если он установлен, я сообщаю android, в каком пакете я предпочитаю открывать свои намерения.


Что такое утилита? Я не вижу в этом доступного импорта.
Игорь Ганапольский

+1 за РЕДАКТИРОВАТЬ. Использование явного имени класса определенно ненадежно.
Джулио Пьянкастелли

5

Нашел это:

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

Потрясающие! Так вы только что создали трансляцию для этого?
Дэн

4

Отвечая на старый вопрос, просто чтобы сообщить вам, ребята, что пакет изменился, вот обновление

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

Это работает очень хорошо, но когда вы вызываете обычный Intent с ACTION_VIEW с действительным URL-адресом YouTube, пользователь все равно получает селектор Activity.


3

Самый безопасный способ запуска видео в другом приложении - сначала попытаться разрешить пакет, другими словами, проверить, установлено ли приложение на устройстве. Так что если вы хотите запустить видео на YouTube, вы должны сделать что-то вроде этого:

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

Вы также можете просто взять 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;
}

Работало нормально в моем приложении.


Помните, что всегда - Google никогда не позволяет воспроизводить видео на YouTube внутри Webview. Потому что они предоставляют YouTube API для воспроизведения видео YouTube на Android App. Если вы будете воспроизводить видео с YouTube внутри веб-просмотра, Google удалит ваше приложение из Playstore.
Сантош Девнат

1

Попробуй это:

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

Это будет работать, если приложение YouTube установлено. Если нет, то выбирается программа выбора, чтобы выбрать другое приложение:

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

Попробуй это,

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

Это тоже не сработало для меня. Есть ли необходимость в использовании флеш-плеера в эмуляторе?
iCoder

0

Эта функция отлично работает для меня ... просто передайте строку url в функцию:

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

Вы можете использовать API проигрывателя Android Android для воспроизведения видео, если установлено приложение Youtube, в противном случае просто предложите пользователю выбрать один из доступных веб-браузеров.

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);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.