android app获得来电号码

2014-12-24 13:09:29     人阅读    

我现在有个android需求,需要在android手机来电话的时候捕获到电话号码,我是试验过下面的方法,无法获得有效的号码,我的目的是,在后台跑一个进程只要是来电就捕获电话号码。
 
   如何才能让我的main activity在后台运行》我已经在mainfest文件中配置了 uses-permission

android:name="android.permission.READ_PHONE_STATE

public class MainActivity extends Activity
{

    protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_layout);
   }

  public class myPhoneStateChangeListener extends PhoneStateListener
{
    @Override
    public void onCallStateChanged(int state, String incomingNumber)
    {
        super.onCallStateChanged(state, incomingNumber);
        if (state == TelephonyManager.CALL_STATE_RINGING)
        {
            String phoneNumber =   incomingNumber;

        }
    }

}

}

 

处理方法

下面是我正在使用的代码,你参考下

Manifest:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

<!--在application 中插入下面部分-->
<receiver android:name=".CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>

我的检测代码:

package com.gabesechan.android.reusable.receivers;

import java.util.Date;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;

public abstract class PhonecallReceiver extends BroadcastReceiver {

//每当android感觉到他要接受信息(来电)的时候,就会创建这个 PhonecallReceiver,我们需要创建一个接受数据的静态变量

private static int lastState = TelephonyManager.CALL_STATE_IDLE;
private static Date callStartTime;
private static boolean isIncoming;
private static String savedNumber; //传递过来的只是有效的振铃


@Override
public void onReceive(Context context, Intent intent) {

// 我们监听两个 intents 新的呼叫告诉我们要呼叫,我们使用他来获得号码
if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
}
else{
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
int state = 0;
if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
state = TelephonyManager.CALL_STATE_IDLE;
}
else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
state = TelephonyManager.CALL_STATE_OFFHOOK;
}
else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
state = TelephonyManager.CALL_STATE_RINGING;
}


onCallStateChanged(context, state, number);
}
}

//派生类应覆盖这些感兴趣的特定事件作出回应
protected void onIncomingCallStarted(Context ctx, String number, Date start){}
protected void onOutgoingCallStarted(Context ctx, String number, Date start){}
protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end){}
protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end){}
protected void onMissedCall(Context ctx, String number, Date start){}

//Deals with actual events 处理真是的事件

//来电- 总计有三个状态 IDLE 空闲 状态 RINGING 振铃 状态 OFFHOOK 摘机状态
//去电- 这两个状态IDLE 空闲 OFFHOOK 摘机
public void onCallStateChanged(Context context, int state, String number) {
if(lastState == state){
//No change, debounce extras
return;
}
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
isIncoming = true;
callStartTime = new Date();
savedNumber = number;
onIncomingCallStarted(context, number, callStartTime);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//Transition of ringing->offhook are pickups of incoming calls. Nothing done on them
if(lastState != TelephonyManager.CALL_STATE_RINGING){
isIncoming = false;
callStartTime = new Date();
onOutgoingCallStarted(context, savedNumber, callStartTime);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
//当处于空闲状态,说明电话结束
if(lastState == TelephonyManager.CALL_STATE_RINGING){
//Ring but no pickup- a miss
onMissedCall(context, savedNumber, callStartTime);
}
else if(isIncoming){
onIncomingCallEnded(context, savedNumber, callStartTime, new Date());
}
else{
onOutgoingCallEnded(context, savedNumber, callStartTime, new Date());
}
break;
}
lastState = state;
}
}


然后使用下面的类,简单集成 PhonecallReceiver 实现一些需要的函数,值关注你想监听的类型

public class CallReceiver extends PhonecallReceiver {

@Override
protected void onIncomingCallStarted(String number, Date start) {
}

@Override
protected void onOutgoingCallStarted(String number, Date start) {
}

@Override
protected void onIncomingCallEnded(String number, Date start, Date end) {
}

@Override
protected void onOutgoingCallEnded(String number, Date start, Date end) {
}

@Override
protected void onMissedCall(String number, Date start) {
}

}


原文地址:http://www.itmmd.com/201412/372.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

andorid 如何连接Mysql数据库?   上一篇
下一篇  Android 截取 Bitmap
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!