11

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

    RingtoneManager ringMan = new RingtoneManager(getActivity());
    ringMan.stopPreviousRingtone();
    getActivity().finish();

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

4

3 回答 3

36

stopPreviousRingtone() 不停止铃声的原因

我发现只有RingtoneManager.stopPreviousRingtone()Ringtone一个RingtoneManager实例创建的情况下才能停止使用铃声。确认这一点的一种简单方法是创建一个带有 aRingtoneManager和三个按钮的活动:

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

完成此操作后,您应该会发现只有单击第二个按钮才会停止铃声。

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

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

Ringtone ringtone = RingtoneManager.getRingtone(getActivity());
ringtone.play();
...
ringtone.stop();

在保留对原始铃声的引用时停止铃声是不可能的

您可以尝试创建一个服务,该服务将在铃声启动时加载和播放铃声,并在铃声被销毁时停止铃声。这是一个例子:

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();
    }
}

然后,您只需启动服务即可在后台启动铃声:

Intent startIntent = new Intent(context, RingtonePlayingService.class);
startIntent.putExtra("ringtone-uri", ringtoneUri);
context.startService(startIntent);

而且,要停止铃声,只需停止服务:

Intent stopIntent = new Intent(context, RingtonePlayingService.class);
context.stopService(stopIntent);
于 2013-04-04T12:15:01.370 回答
5

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

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

服务类代码:

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();
}
}

Activity 调用服务的代码:

Intent i = new Intent(context, AlarmRing.class);
context.startService(i);

活动结束或关闭服务:

Intent i = new Intent(this, AlarmRing.class);
stopService(i);`

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

于 2013-11-23T03:40:17.857 回答
0

像这样使用应用程序上下文创建 RingtoneManager 对象

RingtoneManager ringMan = new RingtoneManager(getApplicationContext());
    ringMan.stopPreviousRingtone();

和 RingTone 对象也只能这样创建。

mRingTome = RingtoneManager.getRingtone(getApplicationContext(), notification);
            mRingTome.play();

它对我有用。

于 2016-11-29T12:25:15.023 回答