11

着信音を再生するはずのリマインダーを時々起動するアプリを書いています。着信音を鳴らすことはできますが、止めることはできません。フラグメントに、現在再生中の着信音を停止してアクティビティを閉じるべき却下メソッドがありますが、正しく機能しません。これが何をするかです:

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

メソッドは実行され、アクティビティは終了しますが、着信音は鳴り続けます。私は何を間違っていますか?

4

3 に答える 3

36

stopPreviousRingtone() が着信音を停止しない理由

同じインスタンスによって作成されたRingtoneManager.stopPreviousRingtone()場合にのみ、を使用してのみ着信音を停止できることがわかりました。これを確認する簡単な方法は、1 つと 3 つのボタンを持つアクティビティを作成することです。RingtoneRingtoneManagerRingtoneManager

  1. 最初のボタンをクリックすると、 を使用しRingtoneManagerて着信音が開始されます。
  2. 2 番目のボタンをクリックすると、 が呼び出さstopPreviousRingtone()れますRingtoneManager
  3. 3 番目のボタンをクリックするとstopPreviousRingtone()、まったく別のRingtoneManagerインスタンスが呼び出されます。

これを行った後、2番目のボタンをクリックした場合にのみ着信音が停止することがわかります。

元の Ringtone インスタンスにアクセスできる場合の Ringtone の停止

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 拡張アクティビティからの着信音を使用してデフォルトのアラームを起動し、別の通常の 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);`

注: コンテキスト参照に注意してください。

于 2013-11-23T03:40:17.857 に答える
0

このように Application Context を使用して RingtoneManager オブジェクトを作成します

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

RingTone オブジェクトもこのように作成するだけです。

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

それは私のために働いています。

于 2016-11-29T12:25:15.023 に答える