You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PhoneStateListener无法给出拨打/被叫号码。

要监听电话的拨打和接听事件,可以使用PhoneStateListener类和TelephonyManager类。但是,PhoneStateListener无法直接获取到拨打或接听的电话号码。这是因为电话号码属于个人隐私信息,而且Android系统限制了获取电话号码的权限

然而,可以通过监听电话状态的改变来获取电话号码。当电话状态改变时,可以使用TelephonyManager类的getLine1Number()方法来获取本机电话号码。然后,通过CallLog.Calls类查询最近的通话记录,可以获取到拨打和接听电话的号码。

以下是一个示例代码,展示了如何使用PhoneStateListener和TelephonyManager来获取电话号码:

import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

    private static final int PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 检查是否有获取电话状态的权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            // 申请权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE},
                    PERMISSION_REQUEST_CODE);
        } else {
            // 有权限时,开始监听电话状态
            startPhoneStateListener();
        }
    }

    private void startPhoneStateListener() {
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        PhoneStateListener phoneStateListener = new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String phoneNumber) {
                super.onCallStateChanged(state, phoneNumber);
                switch (state) {
                    case TelephonyManager.CALL_STATE_IDLE:
                        // 电话闲置状态,无电话
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        // 接听电话
                        String incomingNumber = getPhoneNumberFromCallLog();
                        break;
                    case TelephonyManager.CALL_STATE_RINGING:
                        // 有电话呼入
                        String callingNumber = getPhoneNumberFromCallLog();
                        break;
                }
            }
        };
        telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    private String getPhoneNumberFromCallLog() {
        Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI,
                null, null, null, CallLog.Calls.DATE + " DESC");
        if (cursor != null && cursor.moveToFirst()) {
            String phoneNumber = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
            cursor.close();
            return phoneNumber;
        }
        return null;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户授予了权限
                startPhoneStateListener();
            } else {
                // 用户拒绝了权限,处理相应逻辑
            }
        }
    }
}

在上面的代码中,首先检查是否有获取电话状态的权限。如果没有权限,就向用户请求该权限。如果有权限,就使用TelephonyManager和PhoneStateListener来监听电话状态的改变。

在PhoneStateListener的onCallStateChanged()方法中,根据电话状态的不同,可以获取到拨打和接听电话的号码。调用getPhoneNumberFromCallLog()方法,通过查询最近的通话记录来获取电话号码。

请注意,在AndroidManifest.xml文件中,需要添加以下权限

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

同时,在AndroidManifest.xml文件中,还需要添加以下代码,以确保在拨打电话时能够触发PhoneStateListener的onCallStateChanged()方法:

<receiver android:name=".PhoneCallReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

这样

本文内容通过AI工具匹配关键字智能整合而成,仅供参考,火山引擎不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系service@volcengine.com进行反馈,火山引擎收到您的反馈后将及时答复和处理。
展开更多
面向开发者的云福利中心,ECS 60元/年,域名1元起,助力开发者快速在云上构建可靠应用

社区干货

深度解读 Android 14 重要的 8 个新特性|社区征文

override fun onCreate(savedInstanceState: Bundle?) { ... with(binding.textview2) { searchResultHighlightColor = Color.CYAN focusedSearchResultHighlightColor = Color.GRAY } ​ // 模拟搜索按钮 binding.startSearch.setOnClickListener { binding.textview2.run { Log.d("HighLights", "star...

借助 MAD 助力你的 Android 应用开发|社区征文

{ fun getStateOrNull(data: DATA): SelectedState? fun selectAndGetState(data: DATA): SelectedState fun cancelAndGetState(data: DATA): SelectedState fun clearSelectState()}// 使用 ... savedInstanceState: Bundle?) { nextButton.setOnClickListener { findNavController().navigate(nav_graph.action.effect_detail_to_loading)) } // Back to pre...

替换 Spring Cloud,使用基于 Cloud Native 的服务治理

这些是 Spring Cloud 不能管辖到的。在当时,一些新兴客户会面临一个问题:对于基于 Java 的业务应用,开发的时候选择哪种模式更好?对于这个问题,现在我们更推荐使用 Kubernetes,因为 Kubernetes 是一个语言无关的... 社区给出了一个全新的答卷:Service Mesh。Service Mesh 所做的事情是在节点之间通过一个 Proxy 代理层截获所有流量,节点之间通过特定的网关进行转发。因为所有流量都被劫持了,可以做很多工作,包括 load balance、...

MAD,现代安卓开发技术:Android 领域开发方式的重大变革|社区征文

stockManager.requestPriceUpdates(listener) } // 非活动状态下移除请求 override fun onInactive() { stockManager.removeUpdates(listener) }}class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // 注册观察 StockLiveData("Tesla").run { observe(this@MainActivity, Observer { ... })} }}```支持异步传...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

PhoneStateListener无法给出拨打/被叫号码。-优选内容

客户端 SDK
更新部分方法:'on-full-screen-state-changed'、'on-screen-attrs-notified'、'on-audio-injection-state-changed'、'on-video-stream-profile-from-index'、'on-sync-pod-room-state' StartErrorCode 中 10009 错误码删除。详细信息,请参考 StartErrorCode。 ErrorCode 中 40002、40003、40005、40011 错误码删除。详细信息,请参考 ErrorCode。 2024 年 1 月云手机客户端 SDK V1.34.0 的发布说明如下: AndroidAndroid 端 SDK...
Android 客户端升级指南
参数类型等的替换。 升级过程中,你可能需要参考历史版本文档归档。 3.58类型变更变更详情 功能模块 改动的数据类型 说明 新增枚举值 音效 PlayerState 3.57重要说明自 3.57 版本起,RTC SDK 支持动态加载除主库外的... updateListenerPosition updateListenerOrientation updateRemotePosition 新接口支持本地用户设置远端用户的发声位置和发声朝向。 废弃 CDN 推流 public abstract int startLiveTranscoding(String taskId, ...
深度解读 Android 14 重要的 8 个新特性|社区征文
override fun onCreate(savedInstanceState: Bundle?) { ... with(binding.textview2) { searchResultHighlightColor = Color.CYAN focusedSearchResultHighlightColor = Color.GRAY } ​ // 模拟搜索按钮 binding.startSearch.setOnClickListener { binding.textview2.run { Log.d("HighLights", "star...
客户端 SDK
(setTouchListener)等接口,将触控事件转换为鼠标事件,支持在移动端操控 PC 游戏。详细信息,参考 发送鼠标事件。 新增错误码 40051。详细信息,参考 onPodExit 相关信息。 iOSiOS 端 SDK 包含以下新增功能和变更: (云... 则不能开始游戏,并返回错误码 10026。详细信息,参考 错误码。 修复了部分已知问题。 iOSiOS 端 SDK 包含以下新增功能和变更: 注意 重要变更: 更新了 “消息发送(支持多用户)” 接口的 “消息通道ID” 参数名称,由 ...

PhoneStateListener无法给出拨打/被叫号码。-相关内容

Android SDK集成开发指南

请注意不能为空 final InitConfig config = new InitConfig("{{APPID}}", "{{CHANNEL}}"); // 设置数据上送地址 config.setUriConfig(UriConstants.DEFAULT); config.setAbEnable(tru... 权限说明增长营销套件Android端SDK权限列表: 权限 说明 使用场景和目的 android.permission.READ_PHONE_STATE 读取IMEI等设备信息作为设备标识 设备注册:初始化读取,生成设备唯一标识,计算设备数 android.p...

借助 MAD 助力你的 Android 应用开发|社区征文

{ fun getStateOrNull(data: DATA): SelectedState? fun selectAndGetState(data: DATA): SelectedState fun cancelAndGetState(data: DATA): SelectedState fun clearSelectState()}// 使用 ... savedInstanceState: Bundle?) { nextButton.setOnClickListener { findNavController().navigate(nav_graph.action.effect_detail_to_loading)) } // Back to pre...

替换 Spring Cloud,使用基于 Cloud Native 的服务治理

这些是 Spring Cloud 不能管辖到的。在当时,一些新兴客户会面临一个问题:对于基于 Java 的业务应用,开发的时候选择哪种模式更好?对于这个问题,现在我们更推荐使用 Kubernetes,因为 Kubernetes 是一个语言无关的... 社区给出了一个全新的答卷:Service Mesh。Service Mesh 所做的事情是在节点之间通过一个 Proxy 代理层截获所有流量,节点之间通过特定的网关进行转发。因为所有流量都被劫持了,可以做很多工作,包括 load balance、...

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

支持的云服务

state 实例状态管理volcengine_ecs_invocation 批量作业管理volcengine_ecs_launch_template 启动模版 弹性伸缩 弹性伸缩,是根据用户的业务需求和策略,提供灵活经济的云资源管理模式,具备多种扩展策略来应对业务... volcengine_acl 访问控制volcengine_acl_entry 访问控制规则volcengine_certificate 负载均衡证书volcengine_clb 负载均衡volcengine_clb_rule 负载均衡规则volcengine_listener 监听器volcengine_server_group ...

MAD,现代安卓开发技术:Android 领域开发方式的重大变革|社区征文

stockManager.requestPriceUpdates(listener) } // 非活动状态下移除请求 override fun onInactive() { stockManager.removeUpdates(listener) }}class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // 注册观察 StockLiveData("Tesla").run { observe(this@MainActivity, Observer { ... })} }}```支持异步传...

Android

步骤 4:配置混淆 在 proguar-rulers.pro 中配置混淆,如下 -keep class com.bytedance.im.*{ *; }步骤 5:初始化 在使用 IMSDK 接口功能前需要先进行初始化操作,在 application 的 onCreate() 回调函数中添加如下代码。其中 BIMSDKConfig 可配置 IMSDK 的日志监听。 java BIMSDKConfig config = new BIMSDKConfig();config.setLogListener(new BIMLogListener() { @Override public void onLog(BIMLogLevel bimLogLevel, Str...

替换 Spring Cloud,使用基于 Cloud Native 的服务治理

这些是 Spring Cloud 不能管辖到的。在当时,一些新兴客户会面临一个问题:对于基于 Java 的业务应用,开发的时候选择哪种模式更好?对于这个问题,现在我们更推荐使用 Kubernetes,因为 Kubernetes 是一个语言无关... 社区给出了一个全新的答卷:Service Mesh。**Service Mesh 所做的事情是在节点之间通过一个 Proxy 代理层截获所有流量,节点之间通过特定的网关进行转发**。因为所有流量都被劫持了,可以做很多工作,包括 load ba...

Android

步骤 4:配置混淆 在 proguar-rulers.pro 中配置混淆,如下 -keep class com.bytedance.im.*{ *; }步骤 5:实现实时通讯功能 初始化在使用 IMSDK 接口功能前需要先进行初始化操作,在 application 的 onCreate() 回调函数中添加如下代码。其中 BIMSDKConfig 可配置 IMSDK 的日志监听。 java BIMSDKConfig config = new BIMSDKConfig();config.setLogListener(new BIMLogListener() { @Override public void onLog(BIMLogLevel ...

Actor模型 - 分布式应用框架Akka

**状态(State)** :Actor 组件本身的信息,相当于 OOP 对象中的属性。Actor 的状态会受 Actor 自身行为的影响,且只能被自己修改。**行为(Behavior** **)** :Actor 的计算处理操作,相当于 OOP 对象中的成员函数。Actor 之间不能直接调用其他 Actor 的计算逻辑。Actor 只有收到消息才会触发自身的计算行为。**消息(Mail)** :Actor 的消息以邮件形式在多个 Actor 之间通信传递,每个 Actor 会有一个自己的邮箱(MailBox...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

产品体验

体验中心

云服务器特惠

云服务器
云服务器ECS新人特惠
立即抢购

白皮书

一图详解大模型
浓缩大模型架构,厘清生产和应用链路关系
立即获取

最新活动

爆款1核2G共享型服务器

首年60元,每月仅需5元,限量秒杀
立即抢购

火山引擎增长体验专区

丰富能力激励企业快速增长
查看详情

数据智能VeDI

易用的高性能大数据产品家族
了解详情

一键开启云上增长新空间

立即咨询