Android开发总结-获取来电号码

通过之前对Android 的学习,认为来电话时应该是通过广播(broadcast)通知给应用的.所以就在Reference里找,知道Broadcast Action应该在 anroid.content.Intent类里找.找了找Standard Broadcast Action,竟然没有...但觉得ACTION_ANSWER比较像, (Activity Action: Handle an incoming phone call.)但又是Activity Action.BroadCast的Filter应该是用不了的. 找了半天,感觉这条路比较难达到目的,就去Google了.非常郁闷的是,很多搜索结果的网站都让中国给屏闭了,很多都打不开. 不过总算也找到了一些零碎的代码, 试着去运行,但在Console里一直没有输出日志,那会以为是代码问题,解决了半天,最后才恍然大悟,日志应该在LogCat里看,才发现代码是好的.不知道什么时候我把Logcat视图给关了,之后就忘了这事了.还要注意的是,权限一定要在Manifest文件中设置(<uses-permission android:name="android.permission.READ_PHONE_STATE" />)

运行代码,成功!!在LogCat里也输出了电话号码.但看代码有很多迷惑的地方,比如说Manifest文件里intent-filter的action:android.intent.action.PHONE_STATE这是哪来的?我在官方的Reference里没有搜到!!后面在以前的Reference里找到有,难道2.1把它不推荐使用了?在2.1的Reference里,一点它的身影都没有.

后面想看看官方自带的Phone应用在这里是怎么写的,去官方下载了Phone App应用 的源代码

git clone git://android.git.kernel.org/platform/packages/apps/Phone.git

但奇怪的是也搜不到android.intent.action.PHONE_STATE这个字符串,说明不是用的这种方式.

静下心来看了看Phone的源代码,有点失望,没看明白是怎么捕获到的.还用了很多内部的类,这些类都SDK中都没有暴露出来,去Google了一下,还有人和我一样的疑问,不知道怎样使用这些内部的类.估计官方不想我们这么去用.但应该怎么用呢?

下面这些代码在2.1上是可以运行的.但觉得不是2.1推荐的方式,因为android.intent.action.PHONE_STATE在2.1Reference里找不到....

Java代码 复制代码 收藏代码
  1. public class CustomBroadcastReceiver extends BroadcastReceiver {
  2. private static final String TAG = "CustomBroadcastReceiver";
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. Log.i(TAG, "WE ARE INSIDE!!!!!!!!!!!");
  6. TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
  7. CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener();
  8. telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
  9. Bundle bundle = intent.getExtras();
  10. String phoneNr= bundle.getString("incoming_number");
  11. Log.i(TAG, "phoneNr: "+phoneNr);
  12. }
  13. }
public class CustomBroadcastReceiver extends BroadcastReceiver {

	private static final String TAG = "CustomBroadcastReceiver";

	@Override
	public void onReceive(Context context, Intent intent) {
	    Log.i(TAG, "WE ARE INSIDE!!!!!!!!!!!");
	    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
	    CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener();

	    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);

	    Bundle bundle = intent.getExtras();
	    String phoneNr= bundle.getString("incoming_number");
	    Log.i(TAG, "phoneNr: "+phoneNr);	    
	}
}
Java代码 复制代码 收藏代码
  1. public class CustomPhoneStateListener extends PhoneStateListener {
  2. private static final String TAG = "CustomPhoneStateListener";
  3. @Override
  4. public void onCallStateChanged(int state, String incomingNumber){
  5. Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");
  6. Log.v(TAG, incomingNumber);
  7. switch(state){
  8. case TelephonyManager.CALL_STATE_RINGING:
  9. Log.d(TAG, "RINGING");
  10. break;
  11. case TelephonyManager.CALL_STATE_IDLE:
  12. Log.d(TAG, "IDLE");
  13. break;
  14. case TelephonyManager.CALL_STATE_OFFHOOK:
  15. Log.d(TAG, "OFFHOOK");
  16. break;
  17. }
  18. }
  19. }
public class CustomPhoneStateListener extends PhoneStateListener {

	private static final String TAG = "CustomPhoneStateListener";
	
	@Override
	public void onCallStateChanged(int state, String incomingNumber){

		Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");
        Log.v(TAG, incomingNumber);

        switch(state){
            case TelephonyManager.CALL_STATE_RINGING:
	            Log.d(TAG, "RINGING");
	            break;
            case TelephonyManager.CALL_STATE_IDLE:
                Log.d(TAG, "IDLE");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d(TAG, "OFFHOOK");
                break;
        }       
	}
}
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.xjgz"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <receiver android:name=".CustomBroadcastReceiver" >
  8. <intent-filter>
  9. <action android:name="android.intent.action.PHONE_STATE" />
  10. </intent-filter>
  11. </receiver>
  12. </application>
  13. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  14. <uses-sdk android:minSdkVersion="7" />
  15. </manifest>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值