Android 广播接收机中的PhoneStateListener
我正在制作一个应用程序,它将触发报警管理器的传出呼叫。此外,应该监控该传出呼叫,以检查呼叫是否成功、忙或其他情况。我的问题是如何在BroadCastReceiver中调用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
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
,则一方接听电话。