1

私はAndroidアプリを書いています.サービス内でブロードキャストレシーバーを実行する必要があります.レシーバーは着信があったことを検出し、通話が終了または応答したときにサービスが電話をサイレントモードにし、レシーバーがいつ検出するかを検出します.着信がある場合、受信者は着信音モードを呼び出し音に設定し、通常どおり振動し、通話に応答するか終了すると、受信者は着信音をサイレントモードに再度設定します。

ここに私の受信機があります:

private final BroadcastReceiver CallReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
        amanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
        {
            amanager.setRingerMode(2);  //Ringer ON
        }
        if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
        {
            amanager.setRingerMode(0);  //Ringer Silent
        }
        if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state))
        {
            amanager.setRingerMode(0);  ////Ringer Silent
        }
    }
       };

私のサービスの onStartCommand メソッド内:

      IntentFilter filter = new IntentFilter();
      filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
      registerReceiver(CallReceiver, filter);

サービスは正常に実行されており、受信者は着信があることを検出しますが、その後アプリがクラッシュします。なぜこれが起こっているのですか? あなたの助けに感謝します!

編集:問題を解決しました。マニフェストに間違ったアクションを書いたことがわかりました。変更してもクラッシュしません。

しかし、現在、受信機は着信のみを検出しますが、通話が応答または終了したことを検出しません。数回検出しましたが、ほとんどの場合は検出しません。通話が終了した後もリンガーはオンのままです! 何か案は?

4

1 に答える 1

3

ついに抜け道を発見!着信音モードをサイレントに設定する前に 1 秒の遅延を追加しました。この解決策がどのように機能するかはわかりませんが、機能しました!

private final BroadcastReceiver CallReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
        amanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (TelephonyManager.EXTRA_STATE_IDLE.equals(state))
        {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            amanager.setRingerMode(0);  //Ringer Silent
        }
        if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state))
        {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            amanager.setRingerMode(0);  ////Ringer Silent
        }
        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
        {
            amanager.setRingerMode(2);  //Ringer ON
        }
    }
       };
于 2013-04-07T00:24:22.840 に答える