【问题标题】:How do I stop the currently playing ringtone?如何停止当前播放的铃声?
【发布时间】:2012-12-30 08:32:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: android ringtone


    【解决方案1】:

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

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

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

    这样做之后,你应该会发现只有点击第二个按钮,铃声才会停止。

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

    如果您可以访问原始的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();
        }
    }
    

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

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

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

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

    【讨论】:

      【解决方案2】:

      您必须创建一个从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);`
      

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

      【讨论】:

        【解决方案3】:

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

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

        而且 RingTone 对象也只能这样创建。

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

        它对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          • 2020-10-17
          • 2014-06-10
          • 1970-01-01
          • 1970-01-01
          • 2015-03-24
          相关资源
          最近更新 更多