检测来电即将Android设备 [英] detecting an incoming call coming to an android device
问题描述
我为新的android.i'm试图让一个应用程序中,当有电话打进来,以我要检测的号码的电话,让我尝试以下,但是当来电时它不检测。我想我的主要活动在后台运行plz帮助我如何使它运行在后台?
我给了清单中
许可
使用-权限的Android:名称=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;
}
}
}
}
下面是我用它来做到这一点:
清单:
<使用-权限的Android:名称=android.permission.READ_PHONE_STATE/>
<使用-权限的Android:名称=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屋!