【问题标题】:Android SDK Media Recorder. State 4Android SDK 媒体记录器。状态 4
【发布时间】:2012-02-11 16:17:59
【问题描述】:

我刚刚开发出一个快速的 Android 应用程序。

小问题。什么是状态 4?

我正在使用 MediaPlayer,每次运行应用程序时都会收到一条错误消息,指出首先在状态 0 中调用 Media Player“start()”,然后在状态 4 中调用。

有人知道状态 4 是什么吗?

如果我知道状态 1 和 2 之类的状态,我就能找出问题所在...

谢谢,

【问题讨论】:

  • 您的问题是“什么是状态 4”,您得到了很好的答案。你应该接受这个答案。如果您的代码还没有工作,请去问另一个问题。

标签: android sdk media-player state android-2.2-froyo


【解决方案1】:

这是来自 Android 源代码中的 MediaPlayer.h:

enum media_player_states {
  MEDIA_PLAYER_STATE_ERROR        = 0,
  MEDIA_PLAYER_IDLE               = 1 << 0,
  MEDIA_PLAYER_INITIALIZED        = 1 << 1,
  MEDIA_PLAYER_PREPARING          = 1 << 2,
  MEDIA_PLAYER_PREPARED           = 1 << 3,
  MEDIA_PLAYER_DECODED            = 1 << 4,
  MEDIA_PLAYER_STARTED            = 1 << 5,
  MEDIA_PLAYER_PAUSED             = 1 << 6,
  MEDIA_PLAYER_STOPPED            = 1 << 7,
  MEDIA_PLAYER_PLAYBACK_COMPLETE  = 1 << 8
};

因此,0 将是 MEDIA_PLAYER_STATE_ERROR,4 将是 MEDIA_PLAYER_PREPARING。 你在调用 start() 之前调用了 prepare() 还是 prepareAsync()?

这些是 MediaRecorder 状态:

enum media_recorder_states {
  MEDIA_RECORDER_ERROR                 =      0,
  MEDIA_RECORDER_IDLE                  = 1 << 0,
  MEDIA_RECORDER_INITIALIZED           = 1 << 1,
  MEDIA_RECORDER_DATASOURCE_CONFIGURED = 1 << 2,
  MEDIA_RECORDER_PREPARED              = 1 << 3,
  MEDIA_RECORDER_RECORDING             = 1 << 4,
};

所以对于录制,状态 4 是 MEDIA_RECORDER_DATASOURCE_CONFIGURED。

【讨论】:

  • 这是我在代码中实现的。我在我的班级/“扩展”中创建了一个全局变量:final MediaPlayer mediaPlayer = new MediaPlayer(); 当我要启动 MediaPlayer 时,我调用reset(),然后在try 块中按顺序使用setAudioStreamType, setDataSource(/sdcard/audio.3gp), and prepareAsync() 进行try and catch 语句。那是我终于打电话给start();
  • 我还没有添加准备。是否应该直接在 prepareAsync() 的 try and catch 之后?
  • 使用prepareAsync()时,必须实现OnPreparedListener,调用setOnPreparedListener(),等待onPrepared()回调后再调用start()。
  • 如果你正在回放一个文件,你可以使用prepare()而不是prepareAsync()。在这种情况下,您可以在 prepare() 之后立即调用 start(),而无需实现监听器。
  • 非常前进。现在,我导入了媒体OnPreparedListenerimplements OnPreparedListener,将setOnPreparedListener(this) 添加到setdatasource, audiostreamtype, etc 所在的try 语句中,在setOnPreparedListener, setsource, prepareAsync 的try/catch 块之后在其自己的try/catch 块中添加mediaPlayer.prepare() ,并将mediaPlayer.start() 移至外部public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start();} 函数。现在,我在状态 4“E 级”中调用了 prepareAsync,MediaPlayer.prepare 存在非法异常“W 级”。
猜你喜欢
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多