Java 当我在mp3播放器中多次按下播放按钮时,我的应用程序崩溃

Java 当我在mp3播放器中多次按下播放按钮时,我的应用程序崩溃,java,android,performance,android-fragments,crash,Java,Android,Performance,Android Fragments,Crash,这是片段活动,我创建了一个播放器来播放在线mp3。当我第一次按下播放按钮时,它工作正常,我启动音频,如果我暂停,它会暂停 问题是在应用程序崩溃后,我再次按下播放按钮。请帮忙 public class ListenFragment extends Fragment { final String url[] = { "HTTP://counterexample"}; private MediaPlayer mediaPlayer; @Overrid

这是片段活动,我创建了一个播放器来播放在线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;
    }
}
这是日志猫,请复习并回答

注意:您必须捕获或传递IllegalArgumentException和 使用setDataSource()时发生IOException,因为您正在使用的文件 引用可能不存在

事情是这样的。您还必须捕获
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);
            }
        }

有关在状态栏中显示通知的详细信息

您遇到了什么错误。你能在这里发布你的错误日志吗?日志已发布,请帮助我使用字符串数组,否则我无法实时流式传输此链接。请首先帮助改进,如果答案解决了问题,请接受它。我稍后会为您重构代码。未解决:(现在应用程序在真实设备上崩溃,但在虚拟设备上运行良好。请帮助我可以粘贴到该问题的链接问题出在媒体播放器和我使用暂停按钮的方式上,现在我制作并改进了代码,现在运行良好。