Aplikacja YouTube na Androida Play Video Intent

148

Stworzyłem aplikację, w której można pobierać filmy z YouTube'a na Androida. Teraz chcę, żebyś odtwarzał wideo w natywnej aplikacji YouTube, abyś mógł go również pobrać. Aby to zrobić, muszę znać zamiar, który generuje natywna aplikacja YouTube, aby móc odtwarzać aplikację YouTube.
Mógłbym to łatwo zrobić, gdybym miał program YouTube na moim emulatorze, więc moje pierwsze pytanie brzmi:
1. Czy mogę pobrać aplikację YouTube dla mojego emulatora, czy ...
2. Jaka jest intencja używana, gdy użytkownik wybiera wideo do odtwarzania.

Isaac Waller
źródło
hej, próbuję też stworzyć aplikację do pobierania filmów z YouTube. Więc chcę wiedzieć, że muszę uzyskać do tego dowolny klucz API, czy po prostu mogę użyć funkcji Webview w mojej aplikacji? @ASP
Jaydip Kalkani

Odpowiedzi:

263

A co powiesz na to:

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

Uwaga: uważaj, gdy używasz tej metody, YouTube może zawiesić Twój kanał z powodu spamu, zdarzyło się to dwa razy ze mną

Roger Garzon Nieto
źródło
5
Podziękowania za obsługę aplikacji YouTube, jeśli jest dostępna, i powrót do przeglądarki internetowej, jeśli to konieczne. Dla tych, którzy przychodzą na to pytanie, jest to odpowiedź do użycia.
Luke Sapan
Jak uruchomić aplikację youtube do wyszukiwania za pomocą słowa kluczowego, np. chcę, aby aplikacja youtube została uruchomiona, a następnie w
wynikach
@RusheelJain to byłby nowy problem. Poszukałbym hasła „tekst wyszukiwania intencji androida w YouTube” lub coś w tym rodzaju.
voghDev
2
IMHO powinna to być akceptowana odpowiedź. Wielkie dzięki!
Nacho L.
1
To jest odpowiedź, ale może powinieneś usunąć static w deklaracji funkcji
Ampersanda
176

To zadziała na urządzeniu, ale nie na emulatorze zgodnie z odpowiedzią Lemmy'ego .

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
emmby
źródło
To był dla mnie zwycięzca, jeśli masz zainstalowaną aplikację YouTube, zapyta, czy chcesz jej użyć.
Tristan Warner-Smith
użyj tego kodu i otrzymam narzędzie wyboru intencji dla youtube i przeglądarki. jak to ukryć? Muszę tylko bezpośrednio połączyć się z odtwarzaczem YouTube.
Praveen
@Praveen Chandrasekaran aplikacja youtube może być niedostępna - najlepiej skorzystać z intencji i pozwolić systemowi ustalić, które zainstalowane aplikacje obsługują żądanie.
cofiem
3
Przed wywołaniem startActivity musisz wywołać setClassName w intencji, na przykład: intent.videoClient.setClassName ("com.google.android.youtube", "com.google.android.youtube.PlayerActivity"); Zobacz odpowiedź Sany, aby zapoznać się z działającym przykładem kodu.
Symmetric
To nie działa dla mnie na prawdziwym urządzeniu z zainstalowaną aplikacją YouTube. Nadal otwiera przeglądarkę internetową. Podejście Bibbity poniżej działa jednak. A może komentarz Symmetrica, nie próbował tego.
Mathias Conradt
33

Oto jak rozwiązałem ten problem:

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

Teraz, gdy przeprowadziłem więcej badań, wygląda na to, że potrzebowałem tylko „vnd.youtube:VIDEO_ID” zamiast dwóch ukośników po dwukropku („:” vs. „: //”):

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

Wypróbowałem większość sugestii tutaj i nie działały one zbyt dobrze ze wszystkimi rzekomymi metodami „bezpośrednimi”, które wywoływały wyjątki. Zakładam, że przy mojej metodzie, jeśli aplikacja YouTube NIE jest zainstalowana, system operacyjny ma domyślną pozycję awaryjną czegoś innego niż awaria aplikacji. Aplikacja i tak działa tylko na urządzeniach z aplikacją YouTube, więc nie powinno to stanowić problemu.

Bibbity Bobbity Boo
źródło
Witam, czy można odtwarzać filmy z YouTube'a w aplikacji zamiast w Webview?
Scorpion
@Scorpion Jest youtube API, z taką możliwością.
Matthewek
1
Działa świetnie! Ale brakuje ci jednego prawego nawiasu w pierwszym wierszu.
KostasC
18

Użyj mojego kodu .. Mogę odtwarzać wideo z YouTube za pomocą tego kodu ... wystarczy podać identyfikator wideo z YouTube w zmiennej „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
źródło
3
To bezpośrednio uruchamia aplikację YouTube, pomijając menu wyboru, w którym możesz wybierać między Chrome a YouTube w JellyBean.
r1k0
2
@ r1k0 Tak .... Ten kod bezpośrednio uruchomi domyślną aplikację YouTube do odtwarzania wideo z YouTube na wszystkich typach systemów Android (nie tylko w JellyBean).
Soubhab Pathak
1
Jeśli masz więcej niż jedną aplikację odtwarzacza YouTube (na przykład Firetube), nadal będziesz wybierać. Po prostu mówię i wyjaśniam.
jj_
11
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
startActivityForResult(videoClient, 1234);

Gdzie videoIdjest identyfikator filmu z YouTube, który ma zostać odtworzony. Ten kod działa dobrze na Motorola Milestone .

Ale w zasadzie to, co możemy zrobić, to sprawdzić, jakie działanie jest ładowane po uruchomieniu aplikacji Youtube i odpowiednio zastąpić pakiet PackageName i className.

Sana
źródło
Otrzymuję następujący błąd. 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? Prosimy o rozwiązanie tego problemu.
Vinothkumar Arputharaj
Jakie jest Twoje urządzenie? Ta nazwa działania jest specyficzna tylko dla Motorola Milestone, ale jeśli chcesz zobaczyć nazwę aktywności dla aktywności youtube, podłącz urządzenie w trybie debugowania USB i zobacz LogCat po kliknięciu aplikacji Youtube. Powinien dać ci nazwę pakietu razem z nazwą działania.
Sana
7

Youtube (i aplikacja Market) mają być używane tylko ze specjalnymi ROMami, które Google wydał dla G1 i G2. Nie możesz więc niestety uruchomić ich w OpenSource-ROM, jak ten używany w emulatorze. Cóż, może możesz, ale nie w oficjalnie wspierany sposób.

Lemmy
źródło
Czy znasz nieobsługiwany sposób?
Isaac Waller
Przepraszam, nie. Po prostu nie chciałem wykluczać takiej możliwości.
Lemmy
6

EDYCJA: Poniższa implementacja okazała się mieć problemy na co najmniej niektórych urządzeniach HTC (uległa awarii). Z tego powodu nie używam setclassname i trzymam się menu wyboru akcji. Zdecydowanie odradzam używanie mojej starej implementacji.

Poniżej znajduje się stara implementacja:

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

Gdzie Utility jest moją osobistą klasą użytkową z następującą metodą:

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

Najpierw sprawdzam, czy youtube jest zainstalowany, jeśli jest zainstalowany, mówię androidowi, który pakiet wolę otworzyć.

Warpzit
źródło
Co to jest Utility? Nie widzę tego jako dostępnego importu.
Igor Ganapolsky
+1 do EDYCJI. Używanie jawnej nazwy klasy jest zdecydowanie zawodne.
Giulio Piancastelli
5

Znalazłem to:

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
źródło
Niesamowite! Więc czy właśnie stworzyłeś do tego odbiornik telewizyjny?
Dan
4

Odpowiadając na stare pytanie, żeby poinformować was, że pakiet się zmienił, oto aktualizacja

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

Działa to bardzo dobrze, ale kiedy dzwonisz do zwykłej intencji z ACTION_VIEW z prawidłowym adresem URL YouTube, użytkownik i tak otrzymuje selektor aktywności.

Shardul
źródło
3

Najbezpieczniejszym sposobem uruchamiania filmów w innej aplikacji jest próba rozwiązania pakietu, innymi słowy, sprawdzenie, czy aplikacja jest zainstalowana na urządzeniu. Więc jeśli chcesz uruchomić wideo na youtube, zrób coś takiego:

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
źródło
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
źródło
1

Możesz także po prostu pobrać plik 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;
}

Działało dobrze w mojej aplikacji.

Auri Rahimzadeh
źródło
Pamiętaj, że alwasy - Google nigdy nie pozwala na odtwarzanie wideo z YouTube'a w Webview. Ponieważ zapewniają interfejs API YouTube do odtwarzania filmów z YouTube w aplikacji na Androida. Jeśli zagrasz wideo z YouTube'a w widoku internetowym, Google usunie Twoją aplikację z Playstore.
santosh devnath
1

Spróbuj tego:

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
źródło
0

To zadziała, jeśli zainstalowana jest aplikacja YouTube. Jeśli nie, pojawi się selektor, aby wybrać inną aplikację:

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
źródło
0

Spróbuj tego,

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
źródło
To też nie działa dla mnie. Czy w emulatorze jest wymagany odtwarzacz flash?
iCoder
0

Ta funkcja działa dobrze dla mnie ... po prostu podaj ciąg adresu URL w funkcji:

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
źródło
0

Możesz użyć interfejsu API odtwarzacza YouTube Android, aby odtworzyć wideo, jeśli zainstalowana jest aplikacja YouTube, w przeciwnym razie po prostu poproś użytkownika o wybranie jednej z dostępnych przeglądarek internetowych.

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
źródło