Ich habe eine App erstellt, mit der Sie YouTube-Videos für Android herunterladen können. Nun, ich möchte es so haben, dass Sie es auch herunterladen können, wenn Sie ein Video in der nativen YouTube-App abspielen. Dazu muss ich die Absicht kennen, die die native YouTube-App ausgibt, um die YouTube-App abzuspielen.
Ich könnte dies leicht tun, wenn ich das YouTube-Programm auf meinem Emulator hätte. Daher lautet meine erste Frage:
1. Kann ich die YouTube-App für meinen Emulator herunterladen oder ...
2. Welche Absicht wird verwendet, wenn der Benutzer ein Video für die Wiedergabe auswählt?.
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);
}
}
Dies funktioniert auf einem Gerät, aber nicht dem Emulator pro Lemmys Antwort .
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=cxLG2wtE7TM")));
So habe ich dieses Problem gelöst:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube://" + video_id));
startActivity(intent);
Nun, da ich noch etwas recherchiert habe, scheint es, als hätte ich nur 'vnd.youtube:VIDEO_ID' anstelle von zwei Schrägstrichen nach dem Doppelpunkt (':' vs. ': //') benötigt:
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 zu Ausnahmen führten. Ich würde davon ausgehen, dass das Betriebssystem bei meiner Methode, wenn die YouTube-App NICHT installiert ist, eine Standard-Fallback-Position hat, die nicht zum Absturz der App führt. Die App läuft theoretisch ohnehin nur auf Geräten, auf denen die YouTube-App installiert ist, daher sollte dies kein Problem sein.
Verwenden Sie meinen Code .. Ich kann mit diesem Code Youtube-Video abspielen ... Sie müssen lediglich die Youtube-Video-ID in der "videoId" -Variable angeben.
String videoId = "Fee5vbFLYM4";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:"+videoId));
intent.putExtra("VIDEO_ID", videoId);
startActivity(intent);
Intent videoClient = new Intent(Intent.ACTION_VIEW);
videoClient.setData(Uri.parse("http://m.youtube.com/watch?v="+videoId));
startActivityForResult(videoClient, 1234);
dabei ist videoId die Video-ID des Youtube-Videos, das abgespielt werden muss. Dieser Code funktioniert gut bei Motorola Milestone.
Im Grunde können wir jedoch prüfen, welche Aktivität beim Start der Youtube-App geladen wird, und den Paketnamen und den Klassennamen entsprechend ersetzen.
Youtube (und die Market-Anwendung) dürfen nur mit speziellen ROMs verwendet werden, die Google für G1 und G2 veröffentlicht hat. Sie können sie daher nicht in einem OpenSource-ROM ausführen, wie es leider im Emulator verwendet wird. Vielleicht können Sie das, aber nicht auf offiziell unterstützte Weise.
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) }
BEARBEITEN: Die unten beschriebene Implementierung hatte zumindest bei einigen HTC-Geräten Probleme (sie stürzten ab). Aus diesem Grund verwende ich setclassname nicht und bleibe beim Aktionsauswahlmenü. Ich rate dringend davon ab, meine alte Implementierung zu verwenden.
Nachfolgend 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);
Wo Utility ist meine persönliche Utility-Klasse mit folgender Methode:
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 meine Absicht vorziehen möchte.
Antworten auf die alte Frage, nur um Sie zu informieren, dass sich das Paket geändert hat, hier 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);
Das funktioniert sehr gut, aber wenn Sie normale Absichten mit ACTION_VIEW mit gültiger Youtube-URL aufrufen, erhält der Benutzer die Aktivitätsauswahl trotzdem.
Der sicherste Weg, Videos in einer anderen App auszuführen, besteht darin, zunächst das Paket aufzulösen, dh zu überprüfen, ob die App auf dem Gerät installiert ist. Wenn Sie also ein Video auf youtube abspielen möchten, würden Sie Folgendes tun:
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);
}
/**
* 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;
}
Youtube hat jetzt eine Spieler-API, das solltest du versuchen.
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
}
}
}
Sie können auch einfach die WebViewClient
greifen
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;
}
Funktionierte gut in meiner App.
Dies funktioniert, wenn die YouTube-App installiert ist. Ist dies nicht der Fall, erscheint eine Auswahl, 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 ) );
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");
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);
}
Diese Funktion funktioniert gut für mich ... einfach URL-String in Funktion übergeben:
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);
}
}