检测来电即将Android设备 [英] detecting an incoming call coming to an android device

查看:136
本文介绍了检测来电即将Android设备的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为新的android.i'm试图让一个应用程序中,当有电话打进来,以我要检测的号码的电话,让我尝试以下,但是当来电时它不检测。我想我的主要活动在后台运行plz帮助我如何使它运行在后台? 我给了清单中
许可  使用-权限的Andr​​oid:名称=android.permission.READ_PHONE_STATE还有什么事要我提供清单? plz帮助我吗?

 公共类MainActivity扩展活动
{

    保护无效的onCreate(包savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.test_layout);
   }

  公共类myPhoneStateChangeListener扩展PhoneStateListener
{
    @覆盖
    公共无效onCallStateChanged(INT状态,串incomingNumber)
    {
        super.onCallStateChanged(州,incomingNumber);
        如果(国家== TelephonyManager.CALL_STATE_RINGING)
        {
            字符串phoneNumber的= incomingNumber;

        }
    }

}

}
 

解决方案

下面是我用它来做到这一点:

清单:

 <使用-权限的Andr​​oid:名称=android.permission.READ_PHONE_STATE/>
<使用-权限的Andr​​oid:名称=android.permission.PROCESS_OUTGOING_CALLS/>

<! - 这部分是应用程序内部 - >
    <接收机器人:名称=。CallReceiver>
        <意向滤光器>
            <作用机器人:名称=android.intent.action.PHONE_STATE/>
        &所述; /意图滤光器>
        <意向滤光器>
            <作用机器人:名称=android.intent.action.NEW_OUTGOING_CALL/>
        &所述; /意图滤光器>
    < /接收器>
 

我的基地可重复使用的呼叫检测

 包com.gabesechan.android.reusable.receivers;

进口java.util.Date;

进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.Intent;
进口android.telephony.TelephonyManager;

公共抽象类PhonecallReceiver扩展的BroadcastReceiver {

    //每当机器人感觉就像它的接收器将被重新创建。我们需要一个静态变量要记住实例之间的数据

    私有静态诠释lastState = TelephonyManager.CALL_STATE_IDLE;
    私有静态日期callStartTime;
    私有静态布尔isIncoming;
    私有静态字符串savedNumber; //因为传递进来的是只在振铃有效


    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){

        //我们听两个目的。新的呼出只告诉拨出电话的我们。我们用它来获得的数目。
        如果(intent.getAction()。等于(android.intent.action.NEW_OUTGOING_CALL)){
            savedNumber = intent.getExtras()的getString(android.intent.extra.PHONE_NUMBER);
        }
        其他{
            字符串stateStr = intent.getExtras()的getString(TelephonyManager.EXTRA_STATE)。
            。弦数= intent.getExtras()的getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            INT状态= 0;
            如果(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
                状态= TelephonyManager.CALL_STATE_IDLE;
            }
            否则,如果(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
                状态= TelephonyManager.CALL_STATE_OFFHOOK;
            }
            否则,如果(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
                状态= TelephonyManager.CALL_STATE_RINGING;
            }


            onCallStateChanged(上下文,状态,数量);
        }
    }

    //派生类应覆盖这些向感兴趣的特定事件作出反应
    保护无效onIncomingCallStarted(上下文CTX,串号,日期开始){}
    保护无效onOutgoingCallStarted(上下文CTX,串号,日期开始){}
    保护无效onIncomingCallEnded(上下文CTX,串号,开始日期,结束日期){}
    保护无效onOutgoingCallEnded(上下文CTX,串号,开始日期,结束日期){}
    保护无效onMissedCall(上下文CTX,串号,日期开始){}

    //处理实际事件

    //传入call-去从空闲振铃铃响时,要摘机时,它的回答,在空闲时的挂了
    //传出call-去从怠速到摘机时,拨出,在空闲时挂了
    公共无效onCallStateChanged(上下文的背景下,INT状态,串号){
        如果(lastState ==州){
            //没有变化,去抖动演员
            返回;
        }
        开关(州){
            案例TelephonyManager.CALL_STATE_RINGING:
                isIncoming = TRUE;
                callStartTime =新的日期();
                savedNumber =号;
                onIncomingCallStarted(上下文,号码,callStartTime);
                打破;
            案例TelephonyManager.CALL_STATE_OFFHOOK:
                //过渡ringing->摘机有来电的皮卡。他们一事无成
                如果(lastState!= TelephonyManager.CALL_STATE_RINGING){
                    isIncoming = FALSE;
                    callStartTime =新的日期();
                    onOutgoingCallStarted(背景下,savedNumber,callStartTime);
                }
                打破;
            案例TelephonyManager.CALL_STATE_IDLE:
                //走到idle-这是一个呼叫的结束。什么类型依赖于previous状态(S)
                如果(lastState == TelephonyManager.CALL_STATE_RINGING){
                    //戒指,但没有接听 - 思念
                    onMissedCall(背景下,savedNumber,callStartTime);
                }
                否则,如果(isIncoming){
                    onIncomingCallEnded(背景下,savedNumber,callStartTime,新的日期());
                }
                其他{
                    onOutgoingCallEnded(背景下,savedNumber,callStartTime,新的日期());
                }
                打破;
        }
        lastState =状态;
    }
}
 

然后用它,只是源于它的类并实现一些简单的功能,无论呼叫类型,你关心的:

 公共类CallReceiver扩展PhonecallReceiver {

    @覆盖
    保护无效onIncomingCallStarted(上下文CTX,串号,日期开始){
    }

    @覆盖
    保护无效onOutgoingCallStarted(上下文CTX,串号,日期开始){
    }

    @覆盖
    保护无效onIncomingCallEnded(上下文CTX,串号,开始日期,结束日期){
    }

    @覆盖
    保护无效onOutgoingCallEnded(上下文CTX,串号,开始日期,结束日期){
    }

    @覆盖
    保护无效onMissedCall(上下文CTX,串号,日期开始){
    }

}
 

另外,你可以看到一个书面记录我做的,为什么code是喜欢它是我的博客。吉斯特链接:<一href="https://gist.github.com/ftvs/e61ccb039f511eb288ee">https://gist.github.com/ftvs/e61ccb039f511eb288ee

编辑:已更新为更简单的code,因为我已经修改了类为我所用

I m new in android.i'm trying to make an app in which when a call comes to the phone i want to detect the number, giving what i tried below, but its not detecting when call comes. i want to make my main activity runs in background plz help me how to make it runs in background? i had given the permission in manifest
uses-permission android:name="android.permission.READ_PHONE_STATE" is there anything else should i provide in manifest? plz help me?

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;

        }
    }

}

}

解决方案

Here's what I use to do this:

Manifest:

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

<!--This part is inside the 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>

My base reusable call detector

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 {

    //The receiver will be recreated whenever android feels like it.  We need a static variable to remember data between instantiations

    private static int lastState = TelephonyManager.CALL_STATE_IDLE;
    private static Date callStartTime;
    private static boolean isIncoming;
    private static String savedNumber;  //because the passed incoming is only valid in ringing


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

        //We listen to two intents.  The new outgoing call only tells us of an outgoing call.  We use it to get the number.
        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);
        }
    }

    //Derived classes should override these to respond to specific events of interest
    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

    //Incoming call-  goes from IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when its hung up
    //Outgoing call-  goes from IDLE to OFFHOOK when it dials out, to IDLE when hung up
    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:
                //Went to idle-  this is the end of a call.  What type depends on previous state(s)
                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;
    }
}

Then to use it, simply derive a class from it and implement a few easy functions, whichever call types you care about:

public class CallReceiver extends PhonecallReceiver {

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

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

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

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

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

}

In addition you can see a writeup I did on why the code is like it is on my blog. Gist link: https://gist.github.com/ftvs/e61ccb039f511eb288ee

EDIT: Updated to simpler code, as I've reworked the class for my own use

这篇关于检测来电即将Android设备的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆