【问题标题】:Error in state 4 of MediaPlayerMediaPlayer 状态 4 出错
【发布时间】:2015-02-07 17:19:31
【问题描述】:

我正在尝试创建一个 MediaPlayer 应用程序。为了实现同样的功能,我创建了一个在 MediaPlayer 中播放 mp3 文件的服务。 打开 mp3 文件时出现 NullPointerException。

实例化媒体播放器的代码在onStartCommand()中,如下所示:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {        
    mediaPlayer = new MediaPlayer();
    return super.onStartCommand(intent, flags, startId);
}

服务中实现的处理程序在 MediaPlayer 上设置数据源并准备播放歌曲,如下所示:

class MyHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case Constants.INT_PLAY_SONG:
                try {
                    mediaPlayer.reset();
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    File file = new File(msg.getData().getString(Constants.STRING_BUNDLE_KEY_PLAY_SONG));
                    Uri uri = Uri.fromFile(file);
                    mediaPlayer.setDataSource(getApplicationContext(), uri);
                    mediaPlayer.prepareAsync();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            default:
                super.handleMessage(msg);
        }
    }
}

在上面的代码sn-p中,msg.getData().getString(Constants.STRING_BUNDLE_KEY_PLAY_SONG)代表的是mp3文件的路径。相同的示例: /storage/extSdCard/Songs/yaara re.mp3 这是我手机中歌曲的相同路径。

mp3 文件的路径取自 MediaStore.Audio.Media.DATA

向服务发送消息的代码被添加到 Activity 中。代码如下:

private void sendMessageToService(String stringPath) {
    Message message = Message.obtain(null, Constants.INT_PLAY_SONG, 0, 0);
    Bundle bundle = new Bundle();
    bundle.putString(Constants.STRING_BUNDLE_KEY_PLAY_SONG, stringPath);
    message.setData(bundle);
    try {
        messenger.send(message);
    } catch (RemoteException e) {
        System.out.println("exception while sending message in messenger");
    }
}

新的堆栈跟踪

    02-07 23:29:50.019    1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ isPlaying: 0
    02-07 23:29:50.019    1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ reset
    02-07 23:29:50.029    1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
    02-07 23:29:50.029    1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ setDataSource(55, 0, 576460752303423487)
    02-07 23:29:50.059    1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ setVideoSurfaceTexture
    02-07 23:29:50.059    1399-1399/com.varunk314.mymp3 V/MediaPlayer﹕ prepareAsync
    02-07 23:29:50.069    1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ message received msg=5, ext1=0, ext2=0
    02-07 23:29:50.069    1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ New video size 0 x 0
    02-07 23:29:50.069    1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ callback application
    02-07 23:29:50.069    1399-1411/com.varunk314.mymp3 V/MediaPlayer﹕ back from callback
    02-07 23:29:50.069    1399-1399/com.varunk314.mymp3 I/MediaPlayer﹕ Don't send intent. msg.arg1 = 0, msg.arg2 = 0
    02-07 23:29:50.069    1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
    02-07 23:29:50.069    1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ prepared
    02-07 23:29:50.069    1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ callback application
    02-07 23:29:50.069    1399-1412/com.varunk314.mymp3 V/MediaPlayer﹕ back from callback

OnPreparedListener 也是如下实现的:

@Override
public void onPrepared(MediaPlayer mp) {
    mediaPlayer.start();
}

谁能帮我找出我的代码中的实际问题。

【问题讨论】:

  • 你在哪里使用MyHandler
  • MyHandler 在我的服务中。
  • 显示相关代码你在Message中添加数据的地方?
  • 您是否尝试删除文件名中的空格?
  • @ρяσѕρєя K:现在添加了向服务发送消息的代码。

标签: android nullpointerexception android-mediaplayer mediastore


【解决方案1】:

两种选择:

  1. msg.getData() 的值为NULL
  2. msg.getData().getString(Constants.STRING_BUNDLE_KEY_PLAY_SONG) 的值为NULL

附加一个调试器或定义一些额外的检查来了解哪个是真正的原因(1 或 2)。

更新:您以错误的顺序传递了一些参数! 改变这个:

bundle.putString(stringPath, Constants.STRING_BUNDLE_KEY_PLAY_SONG);

到这里:

bundle.putString(Constants.STRING_BUNDLE_KEY_PLAY_SONG, stringPath);

这引发了java.io.File.fixSlashes 方法的错误,因为Constants.STRING_BUNDLE_KEY_PLAY_SONG 不是文件名。

更新 2 你需要打电话

mediaplayer.prepare()

而不是

prepareAsync()

如果你想直接在下一行玩。 async 方法将在准备就绪时触发专用回调(这是启动媒体播放器的正确位置)

【讨论】:

  • 已经试过了。 msg.getData() 和 msg.getData().getString(Constants.STRING_BUNDLE_KEY_PLAY_SONG) 都不是 NULL。
  • 您能否建议我添加一些额外的检查以识别问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多