Android 在不使用youtube应用程序的情况下播放youtube视频

Android 在不使用youtube应用程序的情况下播放youtube视频,android,android-youtube-api,Android,Android Youtube Api,有很多这样的问题,我已经看了所有的问题,但是没有一个正确的答案,或者由于youtube api的改变,正确的答案已经过时了。 在前往文档领域寻找最佳答案之前,我想问一下您是如何流式传输youtube视频的?我认为使用youtube播放器api并限制用户安装youtube应用程序是非常可怕的做法 使用下面建议的方法,我得到“抱歉,这段视频无法播放”,即使我可以使用Youtube播放器Api播放它 07-03 16:58:47.139: D/MediaPlayer(20518): getMetada

有很多这样的问题,我已经看了所有的问题,但是没有一个正确的答案,或者由于youtube api的改变,正确的答案已经过时了。 在前往文档领域寻找最佳答案之前,我想问一下您是如何流式传输youtube视频的?我认为使用youtube播放器api并限制用户安装youtube应用程序是非常可怕的做法

使用下面建议的方法,我得到“抱歉,这段视频无法播放”,即使我可以使用Youtube播放器Api播放它

07-03 16:58:47.139: D/MediaPlayer(20518): getMetadata
07-03 16:58:47.139: E/MediaPlayerService(82): getMetadata failed -38
07-03 16:58:47.680: E/ARTSPConnection(82): err = 111 (Connection refused)
07-03 16:58:47.680: I/MyHandler(82): connection request completed with result -111 (Connection refused)
07-03 16:58:47.740: E/MediaPlayer(20518): error (1, -2147483648)
07-03 16:58:47.740: E/MediaPlayer(20518): Error (1,-2147483648)
07-03 16:58:47.740: D/VideoView(20518): Error: 1,-2147483648
新建VideoAsyncTask().execute()//调用以在videoview中播放视频

private class VideoAsyncTask extends AsyncTask<Void, Void, Void> {
    ProgressDialog progressDialog;
    String videoUrl;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = ProgressDialog.show(GallaryActivity.this, "",
                "Loading Video wait...", true);
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            //

            String id = videosBean.getV_youtubelink(); //id of video

            String url = "http://www.youtube.com/watch?v=" + id;
            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();
         */

        if (myvideoview.isPlaying())
            myvideoview.stopPlayback();
        myvideoview.setVideoURI(Uri.parse(videoUrl));
        MediaController mc = new MediaController(GallaryActivity.this);
        myvideoview.setMediaController(mc);
        myvideoview.requestFocus();

        myvideoview.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;
}
私有类VideoAsyncTask扩展了AsyncTask{
进行对话进行对话;
字符串videoUrl;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=progressDialog.show(GallaryActivity.this,“,
“正在加载视频等待…”,为真);
}
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
//
String id=videosBean.getV_youtubelink();//视频的id
字符串url=”http://www.youtube.com/watch?v=“+id;
videoUrl=getUrlVideoRTSP(url);
Log.e(“播放的视频url===>>>>”,视频url);
}捕获(例外e){
e(“登录Soap调用异常”,e.toString());
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
progressDialog.disclose();
/*
*videoView.setVideoURI(Uri.parse(
* "rtsp://v4.cache1.c.youtube.com/CiILENy73wIaGQk4RDShYkdS1BMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp"
*);videoView.setMediaController(新
*MediaController(AlertDetail.this));videoView.requestFocus();
*videoView.start();
*/
if(myvideoview.isPlaying())
myvideoview.stopPlayback();
myvideoview.setVideoURI(Uri.parse(videoUrl));
MediaController mc=新的MediaController(GallaryActivity.this);
设置媒体控制器(mc);
myvideoview.requestFocus();
myvideoview.start();
mc.show();
}
}
公共静态字符串getUrlVideoRTSP(字符串urlYoutube){
试一试{
字符串gdy=”http://gdata.youtube.com/feeds/api/videos/";
DocumentBuilder DocumentBuilder=DocumentBuilderFactory
.newInstance().newDocumentBuilder();
String id=extractYoutubeId(urlYoutube);
URL=新URL(gdy+id);
HttpURLConnection连接=(HttpURLConnection)url
.openConnection();
Document doc=documentBuilder.parse(connection.getInputStream());
Element el=doc.getDocumentElement();
NodeList list=el.getElementsByTagName(“媒体:内容”);///媒体:内容
字符串游标=urlYoutube;
对于(int i=0;i>”,例如toString();
}
返回YouTube;
}
受保护的静态字符串extractYoutubeId(字符串url)
抛出错误的DurException{
字符串id=null;
试一试{
字符串查询=新URL(URL).getQuery();
if(查询!=null){
String[]param=query.split(&);
for(字符串行:param){
字符串[]param1=行。拆分(“”);
if(param1[0]。等于(“v”)){
id=param1[1];
}
}
}否则{
if(url.contains(“嵌入”)){
id=url.substring(url.lastIndexOf(“/”)+1);
}
}
}捕获(例外情况除外){
Log.e(“异常”,例如toString());
}
返回id;
}

谢谢!我正在为OUYA开发一个应用程序,它没有Youtube应用程序(因此不能使用普通的Youtube API)。你的解决方案立竿见影!我认为这不再有效<代码>https://gdata.youtube.com/feeds/api/videos/返回字符串
不再可用
是否有其他api可以在android中不使用youtube应用程序播放youtube视频。