E/MediaPlayer:错误(1,-19),E/MediaPlayer:错误(0,-38)
E/MediaPlayer: error (1, -19), E/MediaPlayer: error (0, -38)
我的问题是关于我在处理媒体播放器时不断遇到的一个问题,不仅是音频文件,还有视频文件。当 "play button" 被按下超过约 10 次而不重新启动应用程序时,应用程序将停止并且 LogCat 将显示错误消息 "E/MediaPlayer: error (1, -19)"。
我搜索了 Stack 以及媒体播放器上的 Android 开发人员页面,但无法弄清楚如何解决这个问题。下面的代码似乎让我按下了大约 16 次播放按钮,但仅此而已。这比我尝试过的其他方法要多得多。
此特定代码会播放简短的动物叫声,让我的侄子能够识别。我觉得我在媒体播放器上遗漏了一些东西,但又不能指手画脚。
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient"
tools:context="com.curiousca.griddemo.MainActivity">
<GridLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<Button
android:id="@+id/bluejay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_draw"
android:layout_margin="5dp"
android:layout_column="0"
android:layout_columnWeight="1"
android:layout_gravity="fill"
android:layout_row="0"
android:layout_rowWeight="1"
android:onClick="onClick"
android:text="Bluejay" />
</GridLayout>
`
public void onClick(View view) {
int id = view.getId();
String songId = "";
songId = view.getResources().getResourceEntryName(id);
int resourceId = getResources().getIdentifier(songId, "raw", getPackageName());
MediaPlayer mediaPlayer = MediaPlayer.create(this, resourceId);
if (mediaPlayer != null){
mediaPlayer.start();
}
//Log.i("Click", String.valueOf(view.getId()));
Log.i("tap", songId);
}
swooby,
实例化媒体播放器
private static MediaPlayer mediaPlayer;
public static MediaPlayer getMediaPlayer() {
return mediaPlayer;
最好将代码放在 try/catch 块中以处理发生的任何异常
try {
if (btn == firstBird){
stopPlaying();
mediaPlayer = MediaPlayer.create(getActivity()
.getApplicationContext(),R.raw.bird_one);
mediaPlayer.start();
mediaPlayer.setLooping(true);
timerTextView.setText("15:00");
catch (IllegalStateException e){
stopPlaying();
}
创建额外的方法来防止重写代码
"stopPlaying()" 方法有助于停止和释放媒体播放器。
应调用此方法以确保媒体播放器之前没有参与或从另一个 activity、片段或当前 activity/fragment.
播放
public void stopPlaying() {
if (mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
- 在开始新的 mediaPlayer 实例之前调用 stopPlaying() 方法。参见#2。
如果您在倒数计时器中循环播放声音,请务必使用类似这样的方法...
@Override
public void onFinish() {
resetTimer();
stopPlaying();
}
最后在您的 "stop button" 代码中包含一个 onCompletion() 方法
if (btn == stopPlay){
onCompletion(mediaPlayer);
}
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
}
这样媒体播放器就会停止并释放以进行下一次操作。
我的问题是关于我在处理媒体播放器时不断遇到的一个问题,不仅是音频文件,还有视频文件。当 "play button" 被按下超过约 10 次而不重新启动应用程序时,应用程序将停止并且 LogCat 将显示错误消息 "E/MediaPlayer: error (1, -19)"。
我搜索了 Stack 以及媒体播放器上的 Android 开发人员页面,但无法弄清楚如何解决这个问题。下面的代码似乎让我按下了大约 16 次播放按钮,但仅此而已。这比我尝试过的其他方法要多得多。
此特定代码会播放简短的动物叫声,让我的侄子能够识别。我觉得我在媒体播放器上遗漏了一些东西,但又不能指手画脚。
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient"
tools:context="com.curiousca.griddemo.MainActivity">
<GridLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<Button
android:id="@+id/bluejay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_draw"
android:layout_margin="5dp"
android:layout_column="0"
android:layout_columnWeight="1"
android:layout_gravity="fill"
android:layout_row="0"
android:layout_rowWeight="1"
android:onClick="onClick"
android:text="Bluejay" />
</GridLayout>
`
public void onClick(View view) {
int id = view.getId();
String songId = "";
songId = view.getResources().getResourceEntryName(id);
int resourceId = getResources().getIdentifier(songId, "raw", getPackageName());
MediaPlayer mediaPlayer = MediaPlayer.create(this, resourceId);
if (mediaPlayer != null){
mediaPlayer.start();
}
//Log.i("Click", String.valueOf(view.getId()));
Log.i("tap", songId);
}
swooby,
实例化媒体播放器
private static MediaPlayer mediaPlayer; public static MediaPlayer getMediaPlayer() { return mediaPlayer;
最好将代码放在 try/catch 块中以处理发生的任何异常
try { if (btn == firstBird){ stopPlaying(); mediaPlayer = MediaPlayer.create(getActivity() .getApplicationContext(),R.raw.bird_one); mediaPlayer.start(); mediaPlayer.setLooping(true); timerTextView.setText("15:00"); catch (IllegalStateException e){ stopPlaying(); }
创建额外的方法来防止重写代码
"stopPlaying()" 方法有助于停止和释放媒体播放器。 应调用此方法以确保媒体播放器之前没有参与或从另一个 activity、片段或当前 activity/fragment.
播放public void stopPlaying() { if (mediaPlayer != null){ mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null;
- 在开始新的 mediaPlayer 实例之前调用 stopPlaying() 方法。参见#2。
如果您在倒数计时器中循环播放声音,请务必使用类似这样的方法...
@Override public void onFinish() { resetTimer(); stopPlaying(); }
最后在您的 "stop button" 代码中包含一个 onCompletion() 方法
if (btn == stopPlay){ onCompletion(mediaPlayer); } @Override public void onCompletion(MediaPlayer mediaPlayer) { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); }
这样媒体播放器就会停止并释放以进行下一次操作。