作者:温尚书,华清远见嵌入式培训中心讲师。
在Android中,有的时候我们需要监控拨出电话和拨入电话,在Android中,可以使用其提供的API来实现这2个功能。
如果要实现监控来电电话,可以通过Android中提供的TelephonyManager这个类,这是一个系统服务,其中提供了对手机状态、手机通话状态以及运营商信息等的访问方法。我们这里主要来看如何通过它来获得拨入电话号码。
获得来电的步骤主要如下:
1、获得系统服务TelephonyManager对象,这可以通过Context上的getSystemService(String serviceName)来获得;
2、在TelephonyManager对象上调用listen()方法,让其监听电话状态的变化,其中需要给它注册一个监听器:PhoneStateListener,以及制定其监听的事件类型为通话状态(CALL STATE),可以通过PhoneStateListener.LISTEN_CALL_STATE常量来指定,如下:
telMgr.listen(PhoneStateListenerImpl lsn,PhoneStateListener.LISTEN_CALL_STATE)
3、在实现的PhoneStateListener类中,覆盖onCallStateChanged()方法,这个方法是一个回调方法,当电话通话状态发生改变时会被调用,这个方法会将来电号码传入,我们直接使用这个号码即可。下面是获得来电号码的关键代码:
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
CallListener lsn = new CallListener();
tm.listen(lsn,
PhoneStateListener.LISTEN_CALL_STATE);
… …
class CallListener extends PhoneStateListener
{
public void onCallStateChanged(int state, String incomingNumber)
{
// 响铃
if (state == TelephonyManager.CALL_STATE_RINGING)
{
Log.e("", "Incoming Call:" + incomingNumber);
}
}
}
而如果要获得拨出电话号码,则需要使用BroadcastReceiver来处理。因为当在Android手机上拨出电话时,它会发出一个广播消息,其对应的Intent的action为android.intent.action.NEW_OUTGOING_CALL,并且将拨出电话号码放到了Intent.EXTRA_PHONE_NUMBER这个名称对应的Extra中,数据类型为String,因此,我们可以在覆盖的onReceive()方法中将其读取出来,下面是对应的BroadcastReceiver的定义:
public class ServiceReceiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
String pn = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.e("","phone num:"+pn);
}
}
然后在AndroidManifest.xml中,注册这个Receiver,代码如下:
<receiver android:name=".ServiceReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
</intent-filter>
</receiver>
另外要注意的是,读取拨出电话需要给应用加上相关的权限,其定义如下:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
完整的Java代码如下:(包括如何读取运营商信息等)
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.TextView;
public class Main extends Activity
{
TextView tv6;
TextView tv7;
ServiceReceiver receiver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv1 = (TextView) findViewById(R.id.textView1);
TextView tv2 = (TextView) findViewById(R.id.textView2);
TextView tv3 = (TextView) findViewById(R.id.textView3);
TextView tv4 = (TextView) findViewById(R.id.textView4);
TextView tv5 = (TextView) findViewById(R.id.textView5);
tv6 = (TextView) findViewById(R.id.textView6);
tv7 = (TextView) findViewById(R.id.textView7);
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tv1.setText("设备编号:" + tm.getDeviceId());
tv2.setText("Sim卡国家代号:" + tm.getSimCountryIso());
tv3.setText("Sim卡系列号:" + tm.getSimSerialNumber());
tv4.setText("Sim卡状态:" + tm.getSimState());
tv5.setText("网络运营商:" + tm.getNetworkOperatorName());
// tv7.setText(""+tm.getLine1Number());
android.util.Log.e("", "aaa" + tm.getLine1Number());
CallListener lsn = new CallListener();
tm.listen(lsn,
//PhoneStateListener.LISTEN_CALL_STATE);
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
receiver = new ServiceReceiver();
IntentFilter filter = new IntentFilter();
registerReceiver(receiver, filter);
}
@Override
public void onPause()
{
Log.e("", "onPause");
super.onPause();
}
public void onDestroy()
{
unregisterReceiver(receiver);
super.onDestroy();
}
class CallListener extends PhoneStateListener
{
public void onCallStateChanged(int state, String incomingNumber)
{
// 响铃
if (state == TelephonyManager.CALL_STATE_RINGING)
{
Log.e("", "Incoming Call:" + incomingNumber);
}
// 摘机
if (state == TelephonyManager.CALL_STATE_OFFHOOK)
{
Log.e("", "Dialing");
}
}
}
}
layout文件略。