1

我制作一个音乐应用只是为了好玩。我可以从 sd 卡读取我所有的音乐文件,但 MediaPlayer 不会播放声音。我有传递给媒体播放器的文件的路径,setDataSource但没有任何反应,我也没有例外。这是我使用的代码。

Uri songUri;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);
        setUpViews();
        MediaPlayer mp = new MediaPlayer();

        try {
            mp.setDataSource(songUri.toString());
            mp.prepare();

        } catch (IllegalArgumentException e) {
            Toast.makeText(this, "ILLEGAL ARGUMENT EXCEPTION", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (SecurityException e) {
            Toast.makeText(this, "SECURITY EXCEPTION", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (IllegalStateException e) {
            Toast.makeText(this, "ILLEGAL STATE EXCEPTION", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (IOException e) {
            Toast.makeText(this, "IO EXCEPTION", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
          mp.start();
          Log.d("URI AFTER SET UP", songUri.toString());
    }

正如我之前所说,当我打开此活动时没有任何反应,但我仍然在控制台中获得所有 Log.d。媒体播放器是否有更多配置来播放音乐?提前致谢。

4

4 回答 4

0

setDataSource() 需要一个路径参数。您将整个 uri 作为字符串传递。试试这个 :

mp.setDataSource(songUri.getPath());
mp.prepare();
mp.start();

此外,如果您尝试使用content://uri 访问文件,它将无法正常工作。您必须找到文件的真实路径,即file://uri。

于 2013-04-22T14:48:21.110 回答
0

我认为您必须将setAudioStreamType添加到您的MediaPlayer对象中。您可以mp.setDataSource(your_URI);像下面这样在之前添加它

mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

还有其他类型,您可以选择AudioManager.STREAM_MUSIC音乐播放器

于 2013-04-23T07:27:38.063 回答
0

我刚刚解决了这个问题,我只是不知道它为什么会起作用。我所做的是放一个按钮来停止正在播放的音乐。我不明白为什么它会起作用,所以如果有人能解释它为什么会起作用,我会很感激的。

于 2013-04-23T14:09:40.233 回答
0

通过查询MEDIASTORE-EXTERNAL_URI获取歌曲的路径。这个字段MEDIASTORE.AUDIO.MEDIA.DATA将为您提供歌曲的路径(即字符串)。你可以直接将它设置为mediaplayer.setDataSource(Your_path_from_mediastore)。它会比它工作得更好。

于 2013-04-24T10:39:30.403 回答