您的位置:首页 > 移动开发 > Android开发

android 之电话监听

2011-09-25 20:49 323 查看
在android中,要监听来电与去电是比较简单的,至少有如下两种方法。

1. Receiver

定义一个Receiver派生类,并指定action:android.intent.action.PHONE_STATE即可, 直接上代码。

public class PhoneStateReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String phoneNumber = intent
.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
Toast.makeText(context, "Receiver" + phoneNumber + " 去电",
Toast.LENGTH_SHORT).show();
} else {
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);

switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
Toast.makeText(context, "Receiver" + phoneNumber + " 来电",
Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Toast.makeText(context, "Receiver 正在通话",
Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
}

Note:去电需要在manifest文件中加上action: android.intent.action.NEW_OUTGOING_CALL

2.利用系统服务TelephonyManager。

利用TelephonyManager::listen注册一个listeners来监听电话状态,listen原型如下,

void listen
(PhoneStateListener listener, int events)

其中events可设为:PhoneStateListener.LISTEN_CALL_STATE。

完整代码如下:

public class PhoneStateMonitorActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

tm.listen(new MyPhoneStateListener(),
PhoneStateListener.LISTEN_CALL_STATE);
}

class MyPhoneStateListener extends PhoneStateListener {

@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Toast.makeText(PhoneStateMonitorActivity.this,
incomingNumber + " 来电", Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Toast.makeText(PhoneStateMonitorActivity.this, "正在通话",
Toast.LENGTH_SHORT).show();
break;
default:
break;
}

super.onCallStateChanged(state, incomingNumber);
}
}
}


在模拟器测试该代码,可以通过DDMS Emulator Control模拟电话拨入。

注意:两种方法都需要加上READ_PHONE_STATE 权限。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: