Android YouTube App Video Intent abspielen

148

Ich habe eine App erstellt, in der Sie YouTube-Videos für Android herunterladen können. Jetzt möchte ich, dass Sie ein Video, das Sie in der nativen YouTube-App abspielen, auch herunterladen können. Dazu muss ich die Absicht kennen, die die native YouTube-App ausgibt, um die YouTube-App abspielen zu können.
Ich könnte dies einfach tun, wenn ich das YouTube-Programm auf meinem Emulator hätte. Meine erste Frage lautet also:
1. Kann ich die YouTube-App für meinen Emulator herunterladen oder ...
2. Welche Absicht wird verwendet, wenn der Benutzer ein Video auswählt zur Wiedergabe.

Isaac Waller
quelle
Hey, ich versuche auch, eine YouTube-Video-Downloader-App zu erstellen. Also, ich möchte wissen, dass ich dafür einen API-Schlüssel bekommen muss oder einfach Webview in meiner App verwenden kann? @ ASP
Jaydip Kalkani

Antworten:

263

Und wie wäre es damit:

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

Hinweis: Wenn Sie diese Methode verwenden, kann YouTube Ihren Kanal aufgrund von Spam sperren. Dies ist bei mir zweimal passiert

Roger Garzon Nieto
quelle
5
Requisiten zur Unterstützung der YouTube-App, falls verfügbar, und ggf. zum Zurückgreifen auf den Webbrowser. Für diejenigen, die zu dieser Frage kommen, ist dies die Antwort.
Luke Sapan
So starten Sie die YouTube-App für die Suche über ein Schlüsselwort, z. Ich möchte, dass die Youtube-App gestartet wird und dann in dieser Suche nach "Steve Jobs"
Rusheel Jain
@ RusheelJain das wäre ein neues Problem. Was ich tun würde, ist nach "Android Youtube Intent Search Text" oder so etwas zu suchen.
VoghDev
2
IMHO sollte dies die akzeptierte Antwort sein. Vielen Dank!
Nacho L.
1
Dies ist die Antwort, aber vielleicht sollten Sie statische Aufladung in der Funktionsdeklaration entfernen
Ampersanda
176

Dies funktioniert auf einem Gerät, jedoch nicht auf dem Emulator gemäß Lemmys Antwort .

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
emmby
quelle
Dies war der Gewinner für mich. Wenn Sie die YouTube-App installiert haben, werden Sie gefragt, ob Sie diese stattdessen verwenden möchten.
Tristan Warner-Smith
Verwenden Sie diesen Code Ich bekomme die Absicht Auswahl für YouTube und Browser. wie man es versteckt? Ich muss mich nur direkt mit dem YouTube-Player verbinden.
Praveen
@Praveen Chandrasekaran Die Youtube-App ist möglicherweise nicht verfügbar. Verwenden Sie am besten die Absicht und lassen Sie das System herausfinden, welche installierten Apps die Anforderung unterstützen.
Cofiem
3
Sie müssen setClassName in der Absicht aufrufen, bevor Sie startActivity aufrufen, wie folgt: intent.videoClient.setClassName ("com.google.android.youtube", "com.google.android.youtube.PlayerActivity"); In der Antwort von Sana finden Sie ein Beispiel für einen funktionierenden Code.
Symmetrisch
Dies funktioniert bei mir nicht, auf einem realen Gerät mit installierter YouTube-App. Der Webbrowser wird weiterhin geöffnet. Der Ansatz von Bibbity unten funktioniert jedoch. Oder vielleicht hat Symmetrics Kommentar das nicht versucht.
Mathias Conradt
33

So habe ich dieses Problem gelöst:

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

Nachdem ich weitere Nachforschungen angestellt habe, brauchte ich anscheinend nur 'vnd.youtube:VIDEO_ID' anstelle von zwei Schrägstrichen nach dem Doppelpunkt (':' vs. ': //'):

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

Ich habe die meisten Vorschläge hier ausprobiert und sie funktionierten nicht wirklich gut mit allen angeblichen "direkten" Methoden, die Ausnahmen auslösen. Ich würde davon ausgehen, dass bei meiner Methode, wenn die YouTube-App NICHT installiert ist, das Betriebssystem eine Standard-Fallback-Position hat, die nicht zum Absturz der App führt. Die App läuft theoretisch sowieso nur auf Geräten mit der YouTube-App, daher sollte dies kein Problem sein.

Bibbity Bobbity Boo
quelle
Hallo, ist es möglich, YouTube-Videos in der App abzuspielen, anstatt sie in Webview abzuspielen?
Scorpion
@ Scorpion Es gibt eine YouTube-API mit einer solchen Möglichkeit.
Matthewek
1
Es funktioniert super! In der ersten Zeile fehlt jedoch eine rechte Klammer.
KostasC
18

Verwenden Sie meinen Code. Mit diesem Code kann ich YouTube-Videos abspielen. Sie müssen lediglich die YouTube-Video-ID in der Variablen "videoId" angeben.

String videoId = "Fee5vbFLYM4";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId)); 
intent.putExtra("VIDEO_ID", videoId); 
startActivity(intent); 
Soubhab Pathak
quelle
3
Dadurch wird die YouTube-Anwendung direkt gestartet und das Auswahlmenü umgangen, in dem Sie auf JellyBean zwischen Chrome und YouTube wählen können.
r1k0
2
@ r1k0 Ja .... Dieser Code startet direkt die Standard-Youtube-App, um das Youtube-Video in allen Arten von Android-Betriebssystemen abzuspielen (nicht nur in JellyBean).
Soubhab Pathak
1
Wenn Sie mehr als eine YouTube-Player-App haben (Beispiel Firetube), werden Sie trotzdem ausgewählt. Nur sagen und klar machen.
jj_
11
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
startActivityForResult(videoClient, 1234);

Wo videoIdist die Video-ID des YouTube-Videos, das abgespielt werden muss? Dieser Code funktioniert einwandfrei unter Motorola Milestone .

Grundsätzlich können wir jedoch überprüfen, welche Aktivität beim Starten der Youtube-App geladen wird, und den Paketnamen und den Klassennamen entsprechend ersetzen.

Sana
quelle
Ich erhalte den folgenden Fehler. 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? Bitte lösen Sie dies.
Vinothkumar Arputharaj
Was ist dein Gerät? Dieser Aktivitätsname ist nur für einen Motorola-Meilenstein spezifisch. Wenn Sie jedoch den Aktivitätsnamen für den Youtube-Aktivitätsstecker in Ihrem Gerät im USB-Debugging-Modus anzeigen und die LogCat anzeigen möchten, wenn Sie auf die Youtube-App klicken. Es sollte Ihnen den Paketnamen alogn mit dem Aktivitätsnamen geben.
Sana
7

Das Youtube (und die Market-Anwendung) dürfen nur mit speziellen ROMs verwendet werden, die Google für das G1 und das G2 veröffentlicht hat. Sie können sie also leider nicht in einem OpenSource-ROM ausführen, wie es im Emulator verwendet wird. Nun, vielleicht können Sie, aber nicht auf offiziell unterstützte Weise.

Lemmy
quelle
Kennen Sie den nicht unterstützten Weg?
Isaac Waller
Entschuldige Nein. Ich wollte die Möglichkeit einfach nicht ausschließen.
Lemmy
6

BEARBEITEN: Die folgende Implementierung hatte Probleme mit mindestens einigen HTC-Geräten (sie stürzten ab). Aus diesem Grund verwende ich nicht setclassname und halte mich an das Aktionsauswahlmenü. Ich rate dringend davon ab, meine alte Implementierung zu verwenden.

Es folgt die alte Implementierung:

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

Wobei Utility meine persönliche Utility-Klasse mit folgender Methode ist:

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

Zuerst überprüfe ich, ob YouTube installiert ist. Wenn es installiert ist, sage ich Android, welches Paket ich lieber meine Absicht öffnen möchte.

Warpzit
quelle
Was ist Dienstprogramm? Ich sehe es nicht als verfügbaren Import.
IgorGanapolsky
+1 für die BEARBEITUNG. Die Verwendung eines expliziten Klassennamens ist definitiv unzuverlässig.
Giulio Piancastelli
5

Fand es:

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
quelle
Genial! Haben Sie dafür gerade einen Rundfunkempfänger erstellt?
Dan
4

Auf die alte Frage zu antworten, nur um euch zu informieren, dass sich das Paket geändert hat, hier ist das Update

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

Dies funktioniert sehr gut, aber wenn Sie normale Absicht mit ACTION_VIEW mit gültiger YouTube-URL aufrufen, erhält der Benutzer trotzdem die Aktivitätsauswahl.

Shardul
quelle
3

Der sicherste Weg, Videos in einer anderen App auszuführen, besteht darin, zunächst zu versuchen, das Paket aufzulösen. Mit anderen Worten, überprüfen Sie, ob die App auf dem Gerät installiert ist. Wenn du also ein Video auf YouTube laufen lassen willst, machst du ungefähr so:

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

Sie können auch einfach die greifen 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;
}

Hat in meiner App gut funktioniert.

Auri Rahimzadeh
quelle
Denken Sie daran, dass Google niemals das Abspielen von YouTube-Videos in Webview zulässt. Weil sie eine Youtube-API zum Abspielen von Youtube-Videos in der Android-App bereitstellen. Wenn Sie Youtube-Videos in der Webansicht abspielen, entfernt Google Ihre Anwendung aus dem Playstore.
Santosh Devnath
1

Versuche dies:

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

Dies funktioniert, wenn die YouTube-App installiert ist. Wenn nicht, wird eine Auswahl angezeigt, um eine andere Anwendung auszuwählen:

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

Versuche dies,

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
quelle
Das funktioniert bei mir auch nicht. Gibt es eine Anforderung an den Flash Player im Emulator?
Der iCoder
0

Diese Funktion funktioniert gut für mich ... übergeben Sie einfach die URL-Zeichenfolge in der Funktion:

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

Sie können die Youtube Android Player-API verwenden, um das Video abzuspielen, wenn die Youtube-App installiert ist. Andernfalls fordern Sie den Benutzer einfach auf, aus den verfügbaren Webbrowsern auszuwählen.

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
quelle