How to play Youtube videos in Android Video View?

95,899

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

Share:
95,899
Midhu
Author by

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, 2020

Comments

  • Midhu
    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)??