【发布时间】:2013-04-30 22:12:51
【问题描述】:
我有一个看起来像这样的活动,
public class TestActivity extends Activity {
private SensorManager mSensorManager;
private ShakeEventListener mSensorListener;
private MediaPlayer mPlayer;
private boolean mIsPlaying;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.testsound);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorListener = new ShakeEventListener();
mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() {
@Override
public void onShake() {
toggleSound();
}
});
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(mSensorListener);
stopSound();
}
protected void toggleSound() {
if (!mIsPlaying) {
startSound();
} else {
stopSound();
}
}
protected void startSound() {
if (mPlayer == null)
{
mPlayer = MediaPlayer.create(TestActivity.this, R.raw.test);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setLooping(true);
mPlayer.start();
mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopSound();
}
});
mIsPlaying = true;
}
}
protected void stopSound() {
if (mPlayer != null) {
if (mPlayer.isPlaying())
{
mPlayer.stop();
}
mPlayer.release();
mPlayer = null;
}
mIsPlaying = false;
}
}
我知道这可能不是最好的方法,但我只是从一些随机测试开始。我没有包含 ShakeEventListener,但这几乎只是检测到一个抖动事件,在该事件上循环播放一个样本声音(是的,这很烦人!)直到下一次抖动。
这实际上工作得很好,除了我得到带有标签 MediaPlayer 的 LogCat 条目,在执行启动和停止命令时显示 start() mUri is null 或 stop() mUri is null。这让我相信我做错了什么,但当我在谷歌上搜索了一下时,我无法找出它是什么,这显然也不是一个流行的错误。
有人知道这意味着什么吗?对不起,如果我太厚了——我还是有点困惑。
更新(来自 cmets):我做的一件事是给它一个实际的 Uri(从路径构建),然后它带有一个类似的警告,现在说 start() mUri is android.resource://com.joris.soundtest/2130968576(D 级),这次之前是一个 E -level Uri is android.resource//...(点给出相同的 uri)。这些 LogCat 条目是否可能只是“信息性”,用于调试? E级的听起来不像..
谢谢! -乔里斯。
【问题讨论】:
-
尝试将上下文传递给 startSound 方法,如图所示here
-
不幸的是,这并没有改变 LogCat 的输出。我做的一件事是给它一个实际的 Uri(从路径构建),然后它带有一个类似的警告,现在说
start() mUri is android.resource://com.joris.soundtest/2130968576(D 级),这次之前是 E 级Uri is android.resource//...(点给出相同乌里)。那些 LogCat 条目是否可能只是“提供信息”,用于调试?
标签: java android uri android-mediaplayer