作者:温尚书,华清远见嵌入式培训中心讲师。

在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开发视频物联网培训物联网技术视频嵌入式学习

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android进程保活总结
  5. Android中的ViewDragHelper
  6. Android之可以做的两件坏事---破解锁屏密码和获取Wifi密码
  7. [置顶] Android热补丁技术—dexposed原理简析(手机淘宝采用方案)
  8. Android学习之路笔记
  9. Android(安卓)绑定Service 实现android控制service的生命周期

随机推荐

  1. Android实现文本的展开收起
  2. Android获得屏幕的宽和高
  3. android GridView 只显示一行,可以左右滑
  4. android TelephonyManager
  5. android 实现图片的裁剪
  6. Android分享功能
  7. ch07 Android(安卓)回调方法
  8. android 获取 json 数据
  9. Android(安卓)Wear 进阶 5 Creating Watc
  10. Android(安卓)加载图片并存放在缓存中