4

私のアプリでは、発信通話の状態が待機中、受信済み、または拒否されているかどうかを識別したいと考えています。私はこれらの下のリンクで多くを検索しました
発信通話ステータス発信通話 で応答または拒否された状態を検出する方法、Android BroadcastReceiverを介した発信通話情報、発信通話接続イベントの識別しかし
、適切な答えを見つけることができませんでした.Plz help me.Thanx.

4

4 に答える 4

0

同様の問題がありました。発信通話のいくつかの状態を検出したかったのです。Androidのビジュアライザークラスを使用して問題を解決しました。スピーカーで再生中の現在のオーディオのフーリエ変換を返すことができます。再生中のオーディオの種類 (フロント スピーカーの小さなビープ音) を使用して、発信通話の状態を判断できます。たとえば、受話器で電話が鳴り始めたかどうかを知ることができます。ビジュアライザーがゼロ以外のサンプルを返した場合、それはイエスです。

通話中に発信者アプリが他のすべての音声をシャットダウンするため、バックグラウンド音声が邪魔になることはありません。

ステータスが off_hook になるのを待ってから、ビジュアライザー クラスを開始します

于 2016-03-19T16:08:44.563 に答える
-2

これを試してみてください。PhoneListener を使用して、PhoneStateListener に拡張できます。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class ListenToCallState extends BroadcastReceiver {

// private LoadProfImage mProfile;
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    // mProfile = new LoadProfImage(context);

    PhoneListener phoneListener = new PhoneListener(context);
    TelephonyManager telephony = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

}

class PhoneListener extends PhoneStateListener {
    private Context context;

    public PhoneListener(Context context) {
        // TODO Auto-generated constructor stub
        this.context = context;
    }

    public void onCallStateChanged(int state, String incomingNumber) {

        switch (state) {

        case TelephonyManager.CALL_STATE_IDLE:
                            //Do your stuff
            break;

        case TelephonyManager.CALL_STATE_RINGING:
                             //Do your stuff
            break;

        case TelephonyManager.CALL_STATE_OFFHOOK:
                              //Do your stuff
            break;

        }
    }
}

}

于 2013-09-20T07:00:55.930 に答える
-2

これを試してください。他の部分を見て、そこで変更を加えてください。動作します。

public class CallBr extends BroadcastReceiver {
        Bundle bundle;
        String state;
        String inCall, outCall;
        public boolean wasRinging = false;

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ACTION_IN)) {
                if ((bundle = intent.getExtras()) != null) {
                    state = bundle.getString(TelephonyManager.EXTRA_STATE);
                    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                        inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                        wasRinging = true;
                        Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG).show();
                    } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
                        if (wasRinging == true) {

                            Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG).show();

                            String out = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss").format(new Date());
                            File sampleDir = new File(Environment.getExternalStorageDirectory(), "/TestRecordingDasa1");
                            if (!sampleDir.exists()) {
                                sampleDir.mkdirs();
                            }
                            String file_name = "Record";
                            try {
                                audiofile = File.createTempFile(file_name, ".amr", sampleDir);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            String path = Environment.getExternalStorageDirectory().getAbsolutePath();

                            recorder = new MediaRecorder();
//                          recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

                            recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
                            recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
                            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                            recorder.setOutputFile(audiofile.getAbsolutePath());
                            try {
                                recorder.prepare();
                            } catch (IllegalStateException e) {
                                e.printStackTrace();
                            } catch (IOException e) { 
                                e.printStackTrace();
                            }
                            recorder.start();
                            recordstarted = true;
                        }
                    } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
                        wasRinging = false;
                        Toast.makeText(context, "REJECT || DISCO", Toast.LENGTH_LONG).show();
                        if (recordstarted) {
                            recorder.stop();
                            recordstarted = false;
                        }
                    }
                }
            } else if (intent.getAction().equals(ACTION_OUT)) {
                if ((bundle = intent.getExtras()) != null) {
                    outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                    Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG).show();
                }
            }
        }
    }
于 2013-09-20T06:54:42.313 に答える