当前位置: 首页 > 知识库问答 >
问题:

如何限制BroadcastRecector onReceve被调用仅用于传入呼叫

柯耀
2023-03-14

我有一个应用程序,可以监听来电,并根据号码向该号码发送短信。所有工作都在进行中,呼叫onReceive并发送SMS,但一旦被呼叫方或呼叫方拒绝呼叫,则再次呼叫onReceive,并再次发送SMS。我如何限制这一点,以便只有在接到呼叫时才会调用onReceive

以下是我的代码的简单版本:

我的广播接收机

导入android.content.BroadcastRecector;导入android.content.上下文;导入android.content.意图;导入android.util.日志;

public class Telephone extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub

        Log.d("onReceive", "Got Call Signal");

    }

}

在清单:

         <receiver android:name="com.example.testbroadcastreceiver.Telephone" >
            <intent-filter android:priority="1000" >
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>

使用的权限:

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

共有2个答案

蓬意致
2023-03-14

您可以这样逻辑地处理它:

public class ServiceReceiver extends BroadcastReceiver {

  @Override    
  public void onReceive(Context context, Intent intent) {
    MyPhoneStateListener phoneListener=new MyPhoneStateListener();
    TelephonyManager telephony = (TelephonyManager) 
    context.getSystemService(Context.TELEPHONY_SERVICE);
    telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
  }
}

public class MyPhoneStateListener extends PhoneStateListener {
  public void onCallStateChanged(int state,String incomingNumber){
  switch(state){
    case TelephonyManager.CALL_STATE_IDLE:
      Log.d("DEBUG", "IDLE");
    break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
      Log.d("DEBUG", "OFFHOOK");
    break;
    case TelephonyManager.CALL_STATE_RINGING:
      Log.d("DEBUG", "RINGING");
//place your sms code here
    break;
    }
  } 
}
杨海
2023-03-14

您需要注册一个PhoneStateListener。LISTEN_CALL_仅在BroadcastReceiver内接收传入呼叫的状态为:

public class Telephone extends BroadcastReceiver {

    private Context mContext;
    private Intent mIntent;

    @Override
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        mIntent = intent;
        TelephonyManager tm = (TelephonyManager)              
                 context.getSystemService(Context.TELEPHONY_SERVICE);
        int events = PhoneStateListener.LISTEN_CALL_STATE;
        tm.listen(phoneStateListener, events);
    }

    private final PhoneStateListener phoneStateListener = 
                                                new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            String callState = "UNKNOWN";
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:

                break;
            case TelephonyManager.CALL_STATE_RINGING:
                                // DO YOUR WORK HERE
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                          if(incomingNumber.length() >0){

                                  // incoming call
                                 // DO YOUR WORK HERE when call is received
                                 // SEND SMS HERE
                            }
                           else{
                                      // outgoing call
                              }
                break;
            }

            super.onCallStateChanged(state, incomingNumber);
        }
    };

}
 类似资料:
  • 但是上行和下行都不起作用 当我使用上行链路或下行链路时,我的应用程序行为不端,而当我使用其他来源时,我的应用程序工作正常

  • 问题内容: 我正在尝试进行多项选择调查,以允许用户从选项1-x中进行选择。如何做到这一点,以便用户输入除数字以外的任何字符,返回“那是无效答案”之类的内容 问题答案: 您的代码将变为: 它的工作方式是使循环无限循环,直到仅放入数字为止。因此,如果我输入“ 1”,它将破坏循环。但是如果我放“ Fooey!” 该语句将捕获“将引发的错误” ,并且该循环将循环,因为它没有被破坏。

  • 问题内容: 我对的能力了解得越多,我就越惊讶于它的作用。这是根据我对问题的回答(使用反射更改静态最终用于单元测试)改编而成的。 你可以做真正令人发指的事情: 大概是API设计者意识到了可滥用性,但是必须承认它具有合法的用途来提供它。所以我的问题是: 真正合法的用途是什么? Java是否可以被设计为一开始就没有这种需求? 这种设计的负面后果(如果有)是什么? 你只能限制合法使用吗? 只有通过吗? 它

  • 我有一个带有ListView的FutureBuilder来显示自定义项(小部件),其值是从。txt文件中读取的。 问题是,只有当我在调试模式或运行模式下启动应用程序时,这些项才会显示。当我试图用AppLauncher打开应用程序时(就像“普通”用户会这样做一样),listView是空的。我在一个AVD和一个“真正的”设备上试过这个。

  • 更新:任何人都知道如何强迫另一个流到麦克风音频源。这需要原生android代码。请在这方面帮助我,请参考这个问题,以获得更多关于路由音频的详细信息

  • 问题内容: 我在AngularJS中使用ngChange来触发自定义函数,该函数将删除用户添加到输入中的所有字母。 问题是我需要定位触发的输入,以便删除输入的字母。我已经在Google上寻找了很长时间,并且对此一无所获。 我能做什么? 问题答案: 简单的方法 ,如果适用于您的用例,请使用type =“ number” : 另一种简单的方法: ng- pattern 也可用于定义正则表达式,以限制字