0

我正在尝试为我的儿子编写一个小型 android 应用程序。这个想法是让铃声在按钮单击时开始播放,并且应该通过单击另一个按钮来停止。就像您单击一个按钮开始通话,然后单击另一个按钮来接听电话一样。我设法做的是通过以下代码使第一个响铃按钮工作:

 CallLukas.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
            MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
        }
    });

但是,停止铃声的第二个按钮无法正常工作。我使用以下代码:

Incoming.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(mp.isPlaying()) {
                mp.stop();
                mp.release();
            }
        }
    });

它会停止铃声,但同时会使应用程序崩溃。停止先前激活的铃声的正确方法是什么?谢谢你...

4

2 回答 2

1

这个答案应该对你有所帮助。

我相信问题在于您正在创建多个 MediaPlayer 对象。也尝试使用.reset()而不是 . stop().

于 2020-04-14T14:30:00.907 回答
1

我的问题的解决方案是将MediaPlayer服务作为服务。我创建了一个新的 Java 类来扩展服务类。这是它的代码:

public class RingtoneService extends Service {
private MediaPlayer mp;

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mp = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI);
    mp.setLooping(true);
    mp.start();
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    mp.stop();
}
}

然后我用下面的代码更新了我的 MainActivity 类:

CallLukas.setOnClickListener(this);
Incoming.setOnClickListener(this);

 @Override
public void onClick(View v) {
    if (v == CallLukas){
        startService(new Intent(this, RingtoneService.class));

    }else if (v == Incoming) {
        stopService(new Intent(this, RingtoneService.class));

    }
}

该代码基本上在我的按钮上设置 OnClickListener 并在单击一个时启动服务,如果单击另一个则停止服务。

最后一步是将新创建的服务添加到 AndroidManifest 文件中。它需要添加到<application>标签内。

<application        
    <service android:name=".RingtoneService"></service>        
</application>

可在此处找到有关如何实现此功能的完整说明: https ://www.youtube.com/watch?v=p2ffzsCqrs8&t=315s

于 2020-04-17T10:26:55.460 回答