BroadCastReceiver中的PhoneStateListener

时间:2016-09-27 07:55:10

标签: android broadcastreceiver phone-state-listener

我制作的应用会触发警报管理员的拨出电话。此外,应监听该呼出,以检查呼叫是否成功,忙或其他。我的问题是如何在BroadCastReceiver中调用PhoneStateListener?

MainActivity

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;
    }
}

2 个答案:

答案 0 :(得分:2)

  

如何在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)) {
        }
    }

}

答案 1 :(得分:0)

尝试以下示例......

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>