This is fragment activity and i have created a player to play online mp3 it works fine when i hit play button first time and i start the audio and if i pause it pauses.
Problem is when i hit play button more then once application crashes. please help
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;
}
}
here is log cat, please review and answer.
Caution: You must either catch or pass IllegalArgumentException and IOException when using setDataSource(), because the file you are referencing might not exist.
Here is the thing. You must catch IllegalArgumentException
too because the file you're trying to load might not be in existence since you're getting it from an online server. Replace your code with the following:
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();
}
}
});
Furthermore, I don't know why you're using string array instead of normal string. Read more
UPDATE You can show notification in your app bar when the music has started playing using below snippet:
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);
}
}
More on displaying notification in status bar HERE
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.