当我在我的 mp3 播放器中多次点击播放按钮时,我的应用程序崩溃了
when i hit play button more then once in my mp3 player my application crashes
这是片段 activity 我已经创建了一个播放器来播放在线 mp3,当我第一次按下播放按钮并开始播放音频时它工作正常,如果我暂停它会暂停。
问题 是当我多次点击播放按钮然后应用程序崩溃时。请帮忙
public class ListenFragment extends Fragment {
final String url[] = {
"HTTP://counterexample"};
private MediaPlayer mediaPlayer;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(fragment_listen, container, false);
ImageButton btn_play = rootView.findViewById(R.id.btn_play);
ImageButton btn_pause = rootView.findViewById(R.id.btn_pause);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
btn_pause.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mediaPlayer.pause();
}
});
btn_play.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
mediaPlayer.setDataSource(String.valueOf(url[0]));
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
}
});
return rootView;
}
}
这里是日志猫,请查看并回答。
Caution: You must either catch or pass IllegalArgumentException and
IOException when using setDataSource(), because the file you are
referencing might not exist.
事情是这样的。您也必须捕获 IllegalArgumentException
,因为您尝试加载的文件可能不存在,因为您是从在线服务器获取它的。用以下内容替换您的代码:
btn_play.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
mediaPlayer.setDataSource(String.valueOf(url[0]));
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException | IllegalArgumentException e) {
e.printStackTrace();
}
}
});
此外,我不知道您为什么使用字符串数组而不是普通字符串。阅读更多
更新
当音乐开始播放时,您可以使用以下代码段在应用栏中显示通知:
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (mp.isPlaying()){
//Show notification if music have started play
showNotif(context, CHANNEL_ID)
}
}
});
public void showNotif(Context context, String CHANNEL_ID){
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_bubble_notif)
.setContentTitle("New Item Remind!")
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setContentText(context.getString(R.string.notif_msg, reminder.getNumberOfItems()))
.setPriority(NotificationCompat.PRIORITY_HIGH);
createNotificationChannel(context);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
// notificationId is a unique int for each notification that you must define
notificationManager.notify(0, mBuilder.build());
}
private void createNotificationChannel(Context context) {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "CHANEL_NAME";
String description = "CHANNEL_DESC";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
更多关于在状态栏中显示通知的信息HERE
这是片段 activity 我已经创建了一个播放器来播放在线 mp3,当我第一次按下播放按钮并开始播放音频时它工作正常,如果我暂停它会暂停。
问题 是当我多次点击播放按钮然后应用程序崩溃时。请帮忙
public class ListenFragment extends Fragment {
final String url[] = {
"HTTP://counterexample"};
private MediaPlayer mediaPlayer;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(fragment_listen, container, false);
ImageButton btn_play = rootView.findViewById(R.id.btn_play);
ImageButton btn_pause = rootView.findViewById(R.id.btn_pause);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
btn_pause.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mediaPlayer.pause();
}
});
btn_play.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
mediaPlayer.setDataSource(String.valueOf(url[0]));
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
}
});
return rootView;
}
}
这里是日志猫,请查看并回答。
Caution: You must either catch or pass IllegalArgumentException and IOException when using setDataSource(), because the file you are referencing might not exist.
事情是这样的。您也必须捕获 IllegalArgumentException
,因为您尝试加载的文件可能不存在,因为您是从在线服务器获取它的。用以下内容替换您的代码:
btn_play.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
mediaPlayer.setDataSource(String.valueOf(url[0]));
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException | IllegalArgumentException e) {
e.printStackTrace();
}
}
});
此外,我不知道您为什么使用字符串数组而不是普通字符串。阅读更多
更新 当音乐开始播放时,您可以使用以下代码段在应用栏中显示通知:
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (mp.isPlaying()){
//Show notification if music have started play
showNotif(context, CHANNEL_ID)
}
}
});
public void showNotif(Context context, String CHANNEL_ID){
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_bubble_notif)
.setContentTitle("New Item Remind!")
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setContentText(context.getString(R.string.notif_msg, reminder.getNumberOfItems()))
.setPriority(NotificationCompat.PRIORITY_HIGH);
createNotificationChannel(context);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
// notificationId is a unique int for each notification that you must define
notificationManager.notify(0, mBuilder.build());
}
private void createNotificationChannel(Context context) {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "CHANEL_NAME";
String description = "CHANNEL_DESC";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
更多关于在状态栏中显示通知的信息HERE