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

时间:2012-12-30 08:32:20

标签: android ringtone

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

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

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

3 个答案:

答案 0 :(得分:29)

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

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

  1. 点击第一个按钮将使用RingtoneManager启动铃声。
  2. 点击第二个按钮会拨打stopPreviousRingtone()上的RingtoneManager
  3. 点击第三个按钮会在完全不同的stopPreviousRingtone()个实例上调用RingtoneManager
  4. 执行此操作后,您会发现只有在单击第二个按钮时铃声才会停止。

    如果您有权访问原始铃声实例

    ,则停止铃声

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

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

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

    您可以尝试创建一个service,它会在启动时加载和播放铃声,并在铃声被破坏时停止播放。这是一个例子:

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

    然后,只需启动服务即可{@ 3}}后台的铃声:

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

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

    Intent stopIntent = new Intent(context, RingtonePlayingService.class);
    context.stopService(stopIntent);
    

答案 1 :(得分:3)

您必须创建一个从Service类扩展的类,演示代码如下所示

请注意,这是我的College Project的代码表单,它用于使用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();
}
}

调用服务的活动代码:

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

活动结束或关闭服务:

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

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

答案 2 :(得分:0)

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

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

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

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

这对我有用。