MediaPlayer错误(1,-1004)

时间:2015-01-14 14:44:24

标签: android android-mediaplayer

我正在尝试使用MediaPlayer来传输我的网络电台,但我得到了:

  

MediaPlayer:错误(1,-1004)

来自setDataSource(url)

public class MainActivity extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new RetrieveFeedTask().execute();

    }

    class RetrieveFeedTask extends AsyncTask<String, Void, Void> {

        protected Void doInBackground(String... urls) {
            try {
                String url;
                URL completeURL = new URL("http://streaming.radionomy.com/Radio-Mozart.m3u"); 
                BufferedReader in = new BufferedReader(new InputStreamReader(completeURL.openStream()));
                while ((url = in.readLine()) != null) { break; }
                in.close();
                MediaPlayer mp = new MediaPlayer();
                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mp.setDataSource(url);
                mp.prepareAsync();
            } catch (Exception e) {}
            return null;
        }
    }
}

我检查了网址,如果我把它放在我的浏览器中,它就可以了。我做错了什么? 我有以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2 个答案:

答案 0 :(得分:0)

<击> 您尚未将URL传递给setDataSource()。

我看到的唯一网址是completeURL或doInBackground(String ... urls)中的url集合;

但是,url变量是您在completeURL和stream!= url的流中读取的变量。

编辑:

您的评论表明,completeURL指向第一行包含其他网址的文件。但是,您不必只读取completeURL指向的文件的第一行,而是阅读整个文件。

编辑2:

您可能想重新考虑将completeURL重命名为fileListURL(或类似的东西)。由于命名混乱,我的回答和其他发布的内容都误解了你的意图。从现在开始3个月,你在阅读自己的代码时也会犯同样的错误。

编辑3: 正如您正确指出的那样,您的代码只读取completeURL指向的文件的第一行。但是,当我尝试访问给出的示例时,我的浏览器将我重定向到另一个资源。我怀疑setDataSource()需要一个直接指向(没有重定向)的URL到被访问的资源。

此时,似乎传递给setDataSource()的url有问题。你应该对网址进行硬编码并验证它是否有效,然后仔细检查你读出的网址并查看它的错误。

答案 1 :(得分:0)

我的猜测是你正在调用错误的setDataSource方法。

从你正在使用的documentation方法开始,期待一个FilePath。您需要拨打setDataSource(context, Uri)。 (要使用的上下文是MainActivity.this

您正在使用的文件似乎在最后一行有一个无效的网址。而不是

while ((url = in.readLine()) != null) { break; }

使用

url = in.readLine();

像这样留下你的代码

    protected Void doInBackground(String... urls) {
        try {
            String url;
            URL completeURL = new URL("http://streaming.radionomy.com/Radio-Mozart.m3u"); 
            BufferedReader in = new BufferedReader(new InputStreamReader(completeURL.openStream()));
            url = in.readLine();
            in.close();
            URL url = new URL(thisUrl);
            Uri.Builder builder;
            builder =  new Uri.Builder()
                        .scheme(url.getProtocol())
                        .authority(url.getAuthority())
                        .appendPath(url.getPath());
            MediaPlayer mp = new MediaPlayer();
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setDataSource(MainActivity.this,builder.build());
            mp.prepareAsync();
        } catch (Exception e) {}
        return null;
    }