首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在没有PhoneStateIntentReceiver或PhoneStateListener的情况下,通过BroadcastReceiver监听来电

在没有PhoneStateIntentReceiver或PhoneStateListener的情况下,通过BroadcastReceiver监听来电
EN

Stack Overflow用户
提问于 2011-03-30 21:15:36
回答 2查看 12.3K关注 0票数 8

有没有办法在不使用PhoneStateIntentReceiver或PhoneStateListener的情况下,通过扩展BroadcastReceiver来监听操作系统的广播?另外,请告诉我什么将是行动和清单中的权限。

我尝试过如下方法,但它不适用于来电,但适用于外呼

app的唯一一个清单文件如下所示( app只有一个.java文件和一个.java文件)

代码语言:javascript
运行
复制
package com.crsardar.media.audio;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class IncommingCallReceiverCRS extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("Chitta : ", "Its working");          
    }
}

清单

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.crsardar.media.audio"
      android:versionCode="1"
      android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">

    <receiver android:name="IncommingCallReceiverCRS" android:enabled="true"> 
        <intent-filter>
            <!--action android:name="android.intent.action.NEW_OUTGOING_CALL"/-->
            <action  android:name="android.intent.action.ANSWER" >
            <category  android:name="android.intent.category.DEFAULT" /> 
        </intent-filter>
    </receiver>

  </application>

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-20 21:41:35

您在清单中定义的操作不正确。这是一个操作意图,可用于应答呼叫,而不是监听来电。

您可以使用两个收听ACTION_PHONE_STATE_CHANGEDNEW_OUTGOING_CALL广播意图的广播接收器。

当有新的来电、已应答呼叫或挂断时,将收到ACTION_PHONE_STATE_CHANGED (有关为此目的而接收的附加信息,请参阅文档)。

当您的设备上有新的去电时,将收到NEW_OUTGOING_CALL。

至于权限,我认为您在您的清单中大致了解了这一点(我假设RECORD_AUDIO权限用于应用程序中的其他用途)。

票数 8
EN

Stack Overflow用户

发布于 2016-03-03 17:59:43

这是我的android单元测试演示。你可以参考它。

代码语言:javascript
运行
复制
public interface ICallVerify {
    void onOutgoing(Context context, Intent intent);
    void onCallStateChange(Context context, Intent intent);
}

protected void setUpCallVerify(final ICallVerify callVerify) {  //listen ingoing and outgoing
    final CountDownLatch latch = new CountDownLatch(1);
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { //state change
                Log.i(TAG, "outgoing call...");
                callVerify.onOutgoing(context, intent);
            } else if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ // state changed
                String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                if (state.equals("RINGING")) {
                    state += " number:" + intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                }
                Log.i(TAG, "call state changed.... " + state);
                callVerify.onCallStateChange(context, intent);
            }
        }
    };

    IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
    filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
    ContextUtils.getTargetContext().registerReceiver(receiver, filter);

    try {
        latch.await(5, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

别忘了添加权限

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5486793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档