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

在Android中监控来电和去电

2012-04-20 16:57 162 查看
作者:温尚书,华清远见嵌入式培训中心讲师。
在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文件略。
嵌入式及3G相关资源及学习请点击:嵌入式开发视频 android开发视频 android培训 3G培训 QT培训 QT开发视频 物联网培训 物联网技术视频 嵌入式学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: