如何停止当前正在播放的铃声?

Gri*_*a S 7 android ringtone

我正在写一个应用程序,有时会触发应该播放铃声的提醒.我可以启动铃声OK,但无法阻止它.我的片段中有一个dismiss方法,应该停止当前正在播放的铃声并关闭活动,但它不能正常工作.这是它的作用:

    RingtoneManager ringMan = new RingtoneManager(getActivity());
    ringMan.stopPreviousRingtone();
    getActivity().finish();
Run Code Online (Sandbox Code Playgroud)

该方法确实执行并且活动关闭,但铃声仍在继续播放.我究竟做错了什么?

lmi*_*ika 30

stopPreviousRingtone()没有停止铃声的原因

我发现这是唯一可能使用停止铃声RingtoneManager.stopPreviousRingtone()只有当Ringtone由同一个创建RingtoneManager实例.确认这一点的简单方法是使用一个RingtoneManager和三个按钮创建一个活动:

  1. 单击第一个按钮将使用RingtoneManager启动铃声.
  2. 单击第二个按钮将调用stopPreviousRingtone()RingtoneManager.
  3. 单击第三个按钮将调用stopPreviousRingtone()完全不同的RingtoneManager实例.

执行此操作后,您会发现只有在单击第二个按钮时才会停止铃声.

如果您有权访问原始铃声实例,则停止铃声

如果您可以访问原始Ringtone实例,则只需调用该stop()方法:

Ringtone ringtone = RingtoneManager.getRingtone(getActivity());
ringtone.play();
...
ringtone.stop();
Run Code Online (Sandbox Code Playgroud)

无法在保持对原始铃声的引用时停止铃声

你可以尝试的是创建一个服务,它将在启动时加载和播放铃声,并在铃声被破坏时停止铃声.这是一个例子:

public class RingtonePlayingService extends Service
{
    private Ringtone ringtone;

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        Uri ringtoneUri = Uri.parse(intent.getExtras().getString("ringtone-uri"));

        this.ringtone = RingtoneManager.getRingtone(this, ringtoneUri);
        ringtone.play();

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy()
    {
        ringtone.stop();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过启动服务在后台启动铃声:

Intent startIntent = new Intent(context, RingtonePlayingService.class);
startIntent.putExtra("ringtone-uri", ringtoneUri);
context.startService(startIntent);
Run Code Online (Sandbox Code Playgroud)

并且,要停止铃声,请停止服务:

Intent stopIntent = new Intent(context, RingtonePlayingService.class);
context.stopService(stopIntent);
Run Code Online (Sandbox Code Playgroud)


小智 5

您必须创建一个从 Service 类扩展的类,下面给出了演示代码

请注意,这是我的大学项目的代码,它用于使用来自 BroadcastReciever 扩展活动的铃声启动默认警报,并停止来自不同正常 Android 活动的铃声。

服务等级代码:

import android.app.Service;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.IBinder;
public class AlarmRing extends Service {
static Ringtone r;

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    //activating alarm sound
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    r = RingtoneManager.getRingtone(getBaseContext(), notification);
    //playing sound alarm
    r.play();

    return START_NOT_STICKY;
}
@Override
public void onDestroy()
{
    r.stop();
}
}
Run Code Online (Sandbox Code Playgroud)

调用服务的活动代码:

Intent i = new Intent(context, AlarmRing.class);
context.startService(i);
Run Code Online (Sandbox Code Playgroud)

结束或关闭服务的活动:

Intent i = new Intent(this, AlarmRing.class);
stopService(i);`
Run Code Online (Sandbox Code Playgroud)

注意:请注意上下文参考。