在Android设备上播放视频

时间:2013-08-16 12:41:06

标签: android android-videoview

我想在Android上显示youtube视频。我用谷歌搜索,但我找不到任何解决我的上一个错误的方法:

08-16 12:05:55.950: E/MediaPlayer(2418): error (1, -2147483648)
08-16 12:05:56.274: E/MediaPlayer(2418): Error (1,-2147483648)

我向Manifest文件添加了对互联网的用户权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name="com.example.myapp.MainActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.myapp.MovieActivity"
            android:parentActivityName="com.example.myapp.MainActivity">

            <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>
</manifest>

这是我的MovieActivity.java:

package com.example.myapp;

import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.renderscript.Element;
import android.support.v4.app.NavUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.VideoView;

@SuppressLint("NewApi")
public class MovieActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.movie_activity);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
    {
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }
    ImageView m_avatar = (ImageView) findViewById(R.id.Avatar);
    m_avatar.setImageResource(R.drawable.lambda);

    TextView m_pagedescription = (TextView) findViewById( R.id.pageDescription);
    m_pagedescription.setText("What do you like to do?");

    TextView m_nickname = (TextView) findViewById(R.id.nickName);
    m_nickname.setText("User");

    new MoviePlayer("http://www.youtube.com/watch?v=1FJHYqE0RDg",this).execute();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    switch (item.getItemId()) 
    {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void btnSkip_OnClick(View v)
{
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
}

public class MoviePlayer extends  AsyncTask<Void, Void, Void>
{
    ProgressBar m_progressBar;
    VideoView m_movieView;
    String m_movieUrl;
    MediaController m_mc;
    Context c;
    public MoviePlayer(final String url, Context context)
    {
        c = context;
        m_movieUrl = url;
        m_progressBar = (ProgressBar) findViewById(R.id.progressBar);
        m_movieView = (VideoView) findViewById(R.id.movie);
        m_mc = (MediaController) findViewById(R.id.mediaController);
    }

   @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        m_progressBar.setVisibility(View.VISIBLE);
        m_movieView.setVisibility(View.GONE);
    }

    @SuppressLint("NewApi")
    @Override
    protected Void doInBackground(Void... params)
    {
        try
        {
            if(m_movieUrl.isEmpty())
            {
                String url = "http://www.youtube.com/watch?v=1FJHYqE0RDg";
                m_movieUrl = getUrlVideoRTSP(url);
            }
            Log.e("Video url for playing=========>>>>>", m_movieUrl);
        }
        catch (Exception e)
        {
            Log.e("Login Soap Calling in Exception", e.toString());
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result)
    {
        super.onPostExecute(result);
        m_progressBar.setVisibility(View.GONE);
        m_movieView.setVisibility(View.VISIBLE);

        m_movieView.setVideoURI(Uri.parse(m_movieUrl));
        m_mc = new MediaController(c);
        m_movieView.setMediaController(m_mc);
        m_movieView.requestFocus();
        m_movieView.start();          
        m_mc.show();
    }

    public 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 = (Element) doc.getDocumentElement();
            NodeList list = ((Document) 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 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;
        }       
}
}

最后这是我的movie_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

<ImageView
    android:id="@+id/Avatar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:contentDescription="@string/Avatar"
    android:maxHeight="80dp"
    android:maxWidth="80dp"
    android:src="@drawable/ic_launcher">
</ImageView>

<TextView
    android:id="@+id/nickName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/Avatar"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@id/Avatar"
    android:gravity="center_vertical"
    android:maxLength="15"
    android:paddingLeft="16dp"
    android:text="@string/nicknamePH"
    android:textAlignment="gravity"
    android:textAppearance="?android:attr/textAppearanceLarge" >
</TextView>

<View
    android:id="@+id/Ruler1"
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:layout_below="@id/nickName"
    android:background="#000000">
</View>

<TextView
    android:id="@+id/pageDescription"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/Ruler1"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/pageDescription"
    android:textAlignment="gravity"
    android:textAppearance="?android:attr/textAppearanceSmall">
</TextView>

<View
    android:id="@+id/Ruler2"
    android:layout_width="fill_parent"
    android:layout_height="1dp"        
    android:background="#000000"
    android:layout_below="@id/pageDescription">
</View>

<Button
    android:id="@+id/Skip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:onClick="btnSkip_OnClick"
    android:text="@string/skipebutton">
</Button>

<TextView
        android:id="@+id/details"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/Skip"
        android:clickable="true"
        android:gravity="center_vertical|center_horizontal"
        android:linksClickable="true"
        android:text="@string/detailspc"
        android:textAlignment="gravity"
        android:textAppearance="?android:attr/textAppearanceLarge" >
</TextView>

<MediaController
    android:id="@+id/mediaController"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/details" >
</MediaController>

<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@id/Ruler2" android:layout_above="@id/mediaController">

    <VideoView
        android:id="@+id/movie"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </VideoView>
    <!--
    <ProgressDialog
        android:id="@+id/progressDialog"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical">
    </ProgressDialog>
    -->

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:contentDescription="@string/progressbar"
        android:indeterminate="true" >

        </ProgressBar>


    </FrameLayout>      

</RelativeLayout>

在模拟器上,当我尝试运行视频时,我得到:“无法播放此视频。”错误信息。 我读了一些归咎于视频格式/分辨率的帖子。如果您认为这是我的情况,可以提供应该起作用的链接吗? 错误并不能解释错误。所以也许比我更熟练的人可以提供帮助:)

提前感谢任何提示。

1 个答案:

答案 0 :(得分:1)

@bofredo:不,它甚至在真实设备上也不起作用。

我发现了我的问题。我使用Hemant Vc的代码编写了我的代码:"can't video play error display" after playing video in android

但我意识到DOM解析器不起作用,至少对我而言。所以我写了两个实现:

第一个基于DOM作为Hemant Vc的代码, 第二个基于XPath(我认为这些情况更简单)。

通过方法调用[1]或[2]在[0]处更改MediaPlayer切换到获取URL的方式。我认为我的DOM解析器很丑,所以我会使用XPath,但也许有些读者可以改进它。 XPath的最大问题是了解如何设置命名空间。我使用了Suraj的代码:Multiple NameSpace in Xml Xpath value

[编辑]:由于我的代码来自一个更大的项目,可能会有一些未使用的导入

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.radarmeup.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import android.support.v4.app.NavUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.VideoView;

@SuppressLint("NewApi")
public class MovieActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.movie_activity);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
        {            
                getActionBar().setDisplayHomeAsUpEnabled(true);
        }                   
        new MoviePlayer("http://www.youtube.com/watch?v=1FJHYqE0RDg",this).execute();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        switch (item.getItemId()) 
        {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {       
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void btnSkip_OnClick(View v)
    {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

    private class MyNamespaceContext implements NamespaceContext 
    {               
        public String getNamespaceURI(String prefix) 
        {
            if (prefix == null) {
                throw new IllegalArgumentException("No prefix provided!");
            } else if (prefix.equals("namespace")) {
                return "http://www.w3.org/2005/Atom";
            } else if (prefix.equals("media")) {
                return "http://search.yahoo.com/mrss/";
            } else if (prefix.equals("gd")) {
                return "http://schemas.google.com/g/2005";
            } else if (prefix.equals("yt")) {
                return "http://gdata.youtube.com/schemas/2007";
            } else {
                return XMLConstants.NULL_NS_URI;
            }
        }

        public String getPrefix(String namespaceURI) 
        {
            return null;
        }

        public Iterator<?> getPrefixes(String namespaceURI) 
        {
            return null;
        }
    }

    private class MoviePlayer extends  AsyncTask<Void, Void, Void>
    {
        ProgressBar m_progressBar;
        VideoView m_movieView;
        String m_movieUrl;
        MediaController m_mc;
        Context c;
        public MoviePlayer(final String url, Context context)
        {
            c = context;
            m_movieUrl = url;
            m_progressBar = (ProgressBar) findViewById(R.id.progressBar);
            m_movieView = (VideoView) findViewById(R.id.movie);
            m_mc = (MediaController) findViewById(R.id.mediaController);
        }

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();           
            m_progressBar.setVisibility(View.VISIBLE);
            m_movieView.setVisibility(View.GONE);
        }

        @SuppressLint("NewApi")
        @Override
        protected Void doInBackground(Void... params)
        {
            try
            {   
                m_movieUrl = getUrlVideoRTSPByXPath(m_movieUrl);//[0]               
                Log.e("Video url for playing =>", m_movieUrl);//here must be shown an url like rtsp://something/video.3gp
            }
            catch (Exception e)
            {
                Log.e("Login Soap Calling in Exception", e.toString());
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result)
        {
            super.onPostExecute(result);       
            m_movieView = (VideoView) findViewById(R.id.movie);        
            m_progressBar = (ProgressBar) findViewById(R.id.progressBar);
            m_mc = (MediaController) findViewById(R.id.mediaController);
            m_progressBar.setVisibility(View.GONE);
            m_movieView.setVisibility(View.VISIBLE);
            m_movieView.setVideoURI(Uri.parse(m_movieUrl));
            m_mc = new MediaController(c);          
            m_movieView.setMediaController(m_mc);
            m_movieView.requestFocus();
            m_movieView.start();          
            m_mc.show();
        }

        //[1]
        public String getUrlVideoRTSPByXPath(String urlYoutube)
        {
            String ret = "";
            try
            {       
                String gdy = "http://gdata.youtube.com/feeds/api/videos/";
                String id = extractYoutubeId(urlYoutube);
                URL url = new URL(gdy + id);
                InputSource xml = new InputSource(url.openStream()); 
                XPath xpath = XPathFactory.newInstance().newXPath();
                xpath.setNamespaceContext(new MyNamespaceContext());
                ret = xpath.evaluate("//media:content[@yt:format='1']/@url",xml);                           
            }
            catch(Exception ex)
            {
                ret = "";
                Log.e("Get Url Video RTSP Exception======>>", ex.toString());
            }
            return ret;         
        }

        //[2]
        public String getUrlVideoRTSPByDOM(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 = (Element) doc.getDocumentElement();//entry
                NodeList list = el.getElementsByTagName("media:content");///media:content
                Node n;
                NamedNodeMap nnm;
                Attr a;
                String urlString = "";
                boolean found = false;
                for(int i = 0; i<list.getLength();++i)
                {//loop nodes media:content:
                    n = list.item(i);
                    if(n != null)
                    {
                        nnm = n.getAttributes();
                        for(int j=0;j<nnm.getLength();++j)
                        {//loop i-th node's attributes:
                            a = (Attr) nnm.item(j);
                            if(a.getName().equalsIgnoreCase("url"))
                                urlString = a.getValue();
                            if(a.getName().equalsIgnoreCase("yt:format") && a.getValue().equalsIgnoreCase("1"))
                            {
                                found = true;
                                break;
                            }
                            else if (a.getName().equalsIgnoreCase("yt:format") && !a.getValue().equalsIgnoreCase("1"))
                            {//wrong node => urlString cleaning:
                                urlString = "";
                            }   
                        }
                        if(found)
                        {
                            if (urlString.isEmpty())
                            {//if i didn't find url yet I have to loop again in node's attributes:
                                for(int j=0;j<nnm.getLength();++j)
                                {//loop i-th node's attributes:
                                    a = (Attr) nnm.item(j);
                                    if(a.getName().equalsIgnoreCase("url"))
                                        urlString = a.getValue();
                                }
                            }else{
                                urlYoutube = urlString;
                                break;
                            }
                        }
                    }
                }  
            }
            catch (Exception ex)
            {
                Log.e("Get Url Video RTSP Exception======>>", ex.toString());
            }
            return urlYoutube;
        }   

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

我希望它对其他人有用。