How to play Youtube videos in Android Video View?
Solution 1
As I can't find any way to load the rtsp URL in video view (for all devices & android versions), I solved my problem with another work around. I used a webview to embed the youtube player within it, and this method working nicely in all tested devices.
Here is my code:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginState(PluginState.ON);
mWebView.loadUrl("http://www.youtube.com/embed/" + videoID + "?autoplay=1&vq=small");
mWebView.setWebChromeClient(new WebChromeClient());
Thank you very much for all your help guys.
Solution 2
private class YourAsyncTask extends AsyncTask<Void, Void, Void>
{
ProgressDialog progressDialog;
@Override
protected void onPreExecute()
{
super.onPreExecute();
progressDialog = ProgressDialog.show(AlertDetail.this, "", "Loading Video wait...", true);
}
@Override
protected Void doInBackground(Void... params)
{
try
{
String url = "http://www.youtube.com/watch?v=1FJHYqE0RDg";
videoUrl = getUrlVideoRTSP(url);
Log.e("Video url for playing=========>>>>>", videoUrl);
}
catch (Exception e)
{
Log.e("Login Soap Calling in Exception", e.toString());
}
return null;
}
@Override
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
progressDialog.dismiss();
/*
videoView.setVideoURI(Uri.parse("rtsp://v4.cache1.c.youtube.com/CiILENy73wIaGQk4RDShYkdS1BMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp"));
videoView.setMediaController(new MediaController(AlertDetail.this));
videoView.requestFocus();
videoView.start();*/
videoView.setVideoURI(Uri.parse(videoUrl));
MediaController mc = new MediaController(AlertDetail.this);
videoView.setMediaController(mc);
videoView.requestFocus();
videoView.start();
mc.show();
}
}
public static String getUrlVideoRTSP(String urlYoutube)
{
try
{
String gdy = "http://gdata.youtube.com/feeds/api/videos/";
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
String id = extractYoutubeId(urlYoutube);
URL url = new URL(gdy + id);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
Document doc = documentBuilder.parse(connection.getInputStream());
Element el = doc.getDocumentElement();
NodeList list = el.getElementsByTagName("media:content");///media:content
String cursor = urlYoutube;
for (int i = 0; i < list.getLength(); i++)
{
Node node = list.item(i);
if (node != null)
{
NamedNodeMap nodeMap = node.getAttributes();
HashMap<String, String> maps = new HashMap<String, String>();
for (int j = 0; j < nodeMap.getLength(); j++)
{
Attr att = (Attr) nodeMap.item(j);
maps.put(att.getName(), att.getValue());
}
if (maps.containsKey("yt:format"))
{
String f = maps.get("yt:format");
if (maps.containsKey("url"))
{
cursor = maps.get("url");
}
if (f.equals("1"))
return cursor;
}
}
}
return cursor;
}
catch (Exception ex)
{
Log.e("Get Url Video RTSP Exception======>>", ex.toString());
}
return urlYoutube;
}
protected static String extractYoutubeId(String url) throws MalformedURLException
{
String id = null;
try
{
String query = new URL(url).getQuery();
if (query != null)
{
String[] param = query.split("&");
for (String row : param)
{
String[] param1 = row.split("=");
if (param1[0].equals("v"))
{
id = param1[1];
}
}
}
else
{
if (url.contains("embed"))
{
id = url.substring(url.lastIndexOf("/") + 1);
}
}
}
catch (Exception ex)
{
Log.e("Exception", ex.toString());
}
return id;
}
Solution 3
Due to current version of YouTube you are likely to get a “Can’t play this video” error if you will use VideoView
to show your video.
Take a look at this approcach with YouTubePlayerView
:
http://xinyustudio.wordpress.com/2014/03/17/android-development-play-youtube-video-in-your-app-cant-play-this-video-and-troubleshooting/
Solution 4
Use YouTube Android Player API. It works perfectly. Check my example from here:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.andreaskonstantakos.vfy.MainActivity">
<com.google.android.youtube.player.YouTubePlayerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_centerHorizontal="true"
android:id="@+id/youtube_player"
android:layout_alignParentTop="true" />
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="195dp"
android:visibility="visible"
android:id="@+id/button" />
</RelativeLayout>
MainActivity.java:
package com.example.andreaskonstantakos.vfy;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.google.android.youtube.player.YouTubeBaseActivity;
import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerView;
public class MainActivity extends YouTubeBaseActivity {
YouTubePlayerView youTubePlayerView;
Button button;
YouTubePlayer.OnInitializedListener onInitializedListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
youTubePlayerView = (YouTubePlayerView) findViewById(R.id.youtube_player);
button = (Button) findViewById(R.id.button);
onInitializedListener = new YouTubePlayer.OnInitializedListener(){
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
youTubePlayer.loadVideo("Hce74cEAAaE");
youTubePlayer.play();
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
}
};
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
youTubePlayerView.initialize(PlayerConfig.API_KEY,onInitializedListener);
}
});
}
}
and the PlayerConfig.java class:
package com.example.andreaskonstantakos.vfy;
/**
* Created by Andreas Konstantakos on 13/4/2017.
*/
public class PlayerConfig {
PlayerConfig(){}
public static final String API_KEY =
"xxxxx";
}
Replace the "Hce74cEAAaE" with your video ID from https://www.youtube.com/watch?v=Hce74cEAAaE. Get your API_KEY from Console.developers.google.com and also replace it on the PlayerConfig.API_KEY. For any further information you can follow the following tutorial step by step: https://www.youtube.com/watch?v=3LiubyYpEUk
Solution 5
Using Video View:
1.Code in the layout xml:
<VideoView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/YoutubeVideoView” />
2.Code in java class:
VideoView v = (VideoView) findViewById(R.id.YoutubeVideoView);
v.setVideoURI(Uri.parse(“rtsp://v4.cache3.c.youtube.com/CjYLENy73wIaLQlW_ji2apr6AxMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYOr_86Xm06e5UAw=/0/0/0/video.3gp”));
v.setMediaController(new MediaController(this)); //sets MediaController in the video view
// MediaController containing controls for a MediaPlayer
v.requestFocus();//give focus to a specific view
v.start();//starts the video
We set the VideoUri by specifying the 3gp link of Youtube video for mobile platforms. To add media controls such as Play, Pause, Rewind, Fast Forward and a progress slider ,we add MediaController to the VideoView.
uri.parse( 3gp link of the video )...you can get this from youtube
Midhu
I am an Android developer since early 2011, and interested in building great Applications which every user love to use. I got the luck to put my hands in these areas: Android (Development career starts from Froyo, Android 2.2) ;-) Blackberry (for a lesser span of time) Tizen (only for a single project) Java SQLite XML JSON Kotlin Eclipse Android Studio Netbeans Git (SourceTree, GIT GUI, GitHub, BitBucket) SVN Jira Mantis Redmine Glue jcenter maven central
Updated on October 02, 2020Comments
-
Midhu over 3 years
I am developing an android application which requires a youtube video player embedded within it. I successfully got the RTSP video URL from the API, but while trying to load this rtsp url in my android video view, it says "
Can't play this video.
". Previously I developed a similar application in this method, and it worked fine at that time, but it also failing to load now.I'm sure about that, I'm getting the correct RTSP url from the API.
rtsp://v6.cache6.c.youtube.com/CiULENy73wIaHAlV9VII3c64lRMYESARFEgGUglwbGF5bGlzdHMM/0/0/0/video.3gp
Here is my activity code:
mVideoURL = getIntent().getStringExtra("EXT_URL"); Log.i("VIDEO URL", " " + mVideoURL); MediaController mc = new MediaController(this); mVideoStreamView = (VideoView) findViewById(R.id.vidPlayer); mVideoStreamView.setVideoURI(Uri.parse(mVideoURL)); mVideoStreamView.setMediaController(mc); mVideoStreamView.requestFocus(); mVideoStreamView.start();
EDIT Found some additional information from the logcat:
ARTSPConnection(6607): status: RTSP/1.0 200 OK ASessionDescription(6607): v=0 ASessionDescription(6607): o=GoogleStreamer 378992432 328144046 IN IP4 74.125.213.182 ASessionDescription(6607): s=Video ASessionDescription(6607): c=IN IP4 0.0.0.0 ASessionDescription(6607): b=AS:29 ASessionDescription(6607): t=0 0 ASessionDescription(6607): a=control:* ASessionDescription(6607): a=range:npt=0-1703.000000 ASessionDescription(6607): m=video 0 RTP/AVP 98 ASessionDescription(6607): b=AS:17 ASessionDescription(6607): a=rtpmap:98 H263-2000/90000 ASessionDescription(6607): a=control:trackID=0 ASessionDescription(6607): a=cliprect:0,0,144,176 ASessionDescription(6607): a=framesize:98 176-144 ASessionDescription(6607): a=fmtp:98 profile=0;level=10 ASessionDescription(6607): m=audio 0 RTP/AVP 99 ASessionDescription(6607): b=AS:12 ASessionDescription(6607): a=rtpmap:99 AMR/8000/1 ASessionDescription(6607): a=control:trackID=1 ASessionDescription(6607): a=fmtp:99 octet-align ARTSPConnection(6607): status: RTSP/1.0 200 OK ARTSPConnection(6607): status: RTSP/1.0 200 OK ARTSPConnection(6607): status: RTSP/1.0 200 OK ARTSPConnection(6607): status: RTSP/1.0 200 OK ARTSPConnection(6607): status: RTSP/1.0 200 OK ASessionDescription(6607): v=0 ASessionDescription(6607): o=GoogleStreamer 1299458498 503248054 IN IP4 74.125.213.182 ASessionDescription(6607): s=Video ASessionDescription(6607): c=IN IP4 0.0.0.0 ASessionDescription(6607): b=AS:29 ASessionDescription(6607): t=0 0 ASessionDescription(6607): a=control:* ASessionDescription(6607): a=range:npt=0-1703.000000 ASessionDescription(6607): m=video 0 RTP/AVP 98 ASessionDescription(6607): b=AS:17 ASessionDescription(6607): a=rtpmap:98 H263-2000/90000 ASessionDescription(6607): a=control:trackID=0 ASessionDescription(6607): a=cliprect:0,0,144,176 ASessionDescription(6607): a=framesize:98 176-144 ASessionDescription(6607): a=fmtp:98 profile=0;level=10 ASessionDescription(6607): m=audio 0 RTP/AVP 99 ASessionDescription(6607): b=AS:12 ASessionDescription(6607): a=rtpmap:99 AMR/8000/1 ASessionDescription(6607): a=control:trackID=1 ASessionDescription(6607): a=fmtp:99 octet-align ARTSPConnection(6607): status: RTSP/1.0 461 Unsupported Transport ARTSPConnection(6607): status: RTSP/1.0 461 Unsupported Transport
Please suggest me a way to load youtube videos in android video view.
Thanks in Advance...
EDIT Just checked in another device, HTC Desire (2.2). The code worked fine. I'm wondering about thinking, What will be the problem with Nexus (4.1)??