Android 广播接收机中的PhoneStateListener

Android 广播接收机中的PhoneStateListener,android,broadcastreceiver,phone-state-listener,Android,Broadcastreceiver,Phone State Listener,我正在制作一个应用程序,它将触发报警管理器的传出呼叫。此外,应该监控该传出呼叫,以检查呼叫是否成功、忙或其他情况。我的问题是如何在BroadCastReceiver中调用PhoneStateListener 主要活动 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(s

我正在制作一个应用程序,它将触发报警管理器的传出呼叫。此外,应该监控该传出呼叫,以检查呼叫是否成功、忙或其他情况。我的问题是如何在BroadCastReceiver中调用PhoneStateListener

主要活动

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startAlert(View view) {
        EditText text = (EditText) findViewById(R.id.time);
        int i = Integer.parseInt(text.getText().toString());
        Intent intent = new Intent(this, MyBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (i * 1000), pendingIntent);
    }
}
广播接收机

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        PackageManager pm = context.getPackageManager();
        int hasPerm = pm.checkPermission(android.Manifest.permission.PROCESS_OUTGOING_CALLS,context.getPackageName());
        if (hasPerm != PackageManager.PERMISSION_GRANTED) {
            Intent myIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+38163670832"));;
            myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(myIntent);
        }
    }
}
我想应用的PhoneStateListener示例

public void onCallStateChanged(int state, String incomingNumber) {
    super.onCallStateChanged(state, incomingNumber);
    switch (state) {
        case TelephonyManager.CALL_STATE_OFFHOOK:
            //Kada se korisnik javi
            Toast.makeText(context, "Veza uspostavljena", Toast.LENGTH_LONG).show();
            break;
        case TelephonyManager.CALL_STATE_IDLE:
            //Idle stanje
            Toast.makeText(context, "Idle mod", Toast.LENGTH_LONG).show();
            break;
    }
}

试试下面的例子

public class PhoneStatReceiver extends BroadcastReceiver{        

        private static final String TAG = "PhoneStatReceiver"; 

        private static boolean incomingFlag = false;

        private static String incoming_number = null;



        @Override

        public void onReceive(Context context, Intent intent) {


                if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){                        

                        incomingFlag = false;

                        String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);        

                        Log.i(TAG, "call OUT:"+phoneNumber);                        

                }else{                        


                        TelephonyManager tm = 

                            (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);                        



                        switch (tm.getCallState()) {

                        case TelephonyManager.CALL_STATE_RINGING:

                                incomingFlag = true;

                                incoming_number = intent.getStringExtra("incoming_number");

                                Log.i(TAG, "RINGING :"+ incoming_number);

                                break;

                        case TelephonyManager.CALL_STATE_OFFHOOK:                                

                                if(incomingFlag){

                                        Log.i(TAG, "incoming ACCEPT :"+ incoming_number);

                                }

                                break;



                        case TelephonyManager.CALL_STATE_IDLE:                                

                                if(incomingFlag){

                                        Log.i(TAG, "incoming IDLE");                                

                                }

                                break;

                        } 

                }

        }

}
在您的
AndroidManifest.xml
中注册它

<receiver android:name=".PhoneStatReceiver">  

            <intent-filter>

                 <action android:name="android.intent.action.PHONE_STATE"/>           

                 <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

            </intent-filter>

</receiver>

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>

如何在BroadCastReceiver中调用PhoneStateListener

嗯。。。为什么?BroadCastReceiver本身可以为您提供有关当前手机状态的所有必要信息,所以您不需要任何其他信息

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        final String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        /* Incoming call */
        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
        } else

        /* Outgoing call */
        if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) {
        } else

        /* Call ended */
        if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
        }
    }

}

您好,请检查:问题是我已经在BroadCastReceiver的onReceive中拨打了一个电话。我不确定在这种情况下监听呼叫状态会如何。应用程序的目的不是监视传入呼叫,它应该监视传出呼叫。我添加了CustomPhoneStateListener phoneListener=新的CustomPhoneStateListener();与您的示例类似,但状态始终为空闲,即使B端接听电话。我猜这是因为PhoneStateListener仅在BroadCastReceiver中触发,并且不一直工作。您是否也更新了操作的
?是的。它从一开始就是这样。现在看起来它工作了,我做了一些改变。也许你知道如何区分B方电话铃响和B方接听电话?你可以通过存储上一次(最后一次)通话状态来检查。如果以前的呼叫状态为
OUTGOING
,当前呼叫状态为
OFFHOOK
,则B侧应答呼叫。如果以前的通话状态为
RINGING
,当前通话状态为
OFFHOOK
,则一方接听电话。