如何停止以前的铃声?

How to stop previous ringtone?

我正在尝试为我儿子编写一个 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();
            }
        }
    });

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

This answer should help you.

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

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

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 class:

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