如何停止以前的铃声?
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
我正在尝试为我儿子编写一个 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