Android 手机来电 获取来电信息,接听/挂断电话

这篇具有很好参考价值的文章主要介绍了Android 手机来电 获取来电信息,接听/挂断电话。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.需求描述

2.实现原理

第一个:手机来电状态

第二个:获取手机来电号码

第三个:接听和挂断电话


1.需求描述

监听用户手机来电,弹起App内自定义的来电展示,并且展示来电电话,用户可以接通和挂断。

2.实现原理

这儿我就总结下手机来电、获取手机号码和接听/挂断电话,弹起App的来电展示界面使用的windowmanager。

第一个:手机来电状态

权限

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />//接/挂电话需要这个权限

private lateinit var telephonyManager: TelephonyManager
private lateinit var mPhoneListener: PhoneStateListener


//在你的onCreate里
......
telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        //在注册监听的时候就会走一次回调,后面通话状态改变时也会走
        //如下面的代码,在启动服务时如果手机没有通话相关动作,就会直接走一次TelephonyManager.CALL_STATE_IDLE
        mPhoneListener = object : PhoneStateListener() {
            override fun onCallStateChanged(state: Int, phoneNumber: String?) {
                super.onCallStateChanged(state, phoneNumber)
                when (state) {
                    //挂断
                    TelephonyManager.CALL_STATE_IDLE -> {
                        //toast("挂断${phoneNumber}")
                        Log.i("TAG", "onCallStateChanged: 挂断${phoneNumber}")
                    }
                    //接听
                    TelephonyManager.CALL_STATE_OFFHOOK -> {
                        Log.i("TAG", "onCallStateChanged: 接听${phoneNumber}")
                    }
                    //响铃
                    TelephonyManager.CALL_STATE_RINGING -> {
                        Log.i("TAG", "onCallStateChanged: 响铃${phoneNumber}")
                      LogUtils.e("来电${getLatestIncomingCallNumber(contentResolver)}")
                      }
                }
            }
        }
        telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE)
......

这样就可以实时监听手机来电

第二个:获取手机来电号码

权限:

     <uses-permission android:name="android.permission.READ_CALL_LOG" />
     <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    @SuppressLint("Range")
    private fun getLatestIncomingCallNumber(contentResolver: ContentResolver?): String? {
        var phoneNumber: String? = null
        var cursor: Cursor? = null
        try {
            if (contentResolver != null) {
                cursor = contentResolver.query(
                    CallLog.Calls.CONTENT_URI, arrayOf(CallLog.Calls.NUMBER),
                    CallLog.Calls.TYPE + " = " + CallLog.Calls.INCOMING_TYPE,
                    null,
                    CallLog.Calls.DATE + " DESC"
                )
                if (cursor != null && cursor.moveToFirst()) {
                    phoneNumber = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER))
                }
            }
        } finally {
            cursor?.close()
        }
        return phoneNumber
    }

说实话,现在手机系统的来电展示不错了,所以这种App需要足够做的花哨好用才行,但是这又涉及用户的敏感权限和应用市场的卡脖子。emmm,不知道他的前景是什么?

第三个:接听和挂断电话

之前看了许多博客,结果发现,很多都是1几年的文章,很多方法都已经被废弃了,或者不适配高版本的android系统,于是去查了查开发者和stack overflow,emmmm,目前这个方法可行

首先是接电话,使用telecomManager,之前是telephonyManager?已经没有acceptRingingCall这个方法了。

 private fun answerCall() {
        val telecomManager =
            this.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ANSWER_PHONE_CALLS
            ) == PackageManager.PERMISSION_GRANTED
        ) {
            telecomManager.acceptRingingCall()
            LogUtils.e("telecomManager.接电话() finish")
        }
    }

其次是挂掉电话:

挂掉电话要根据android版本来做个适配:

fun userClickToEndCall(context: Context): Boolean {
        var callSuccess = false
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                val telecomManager =
                    context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
             

                if (ActivityCompat.checkSelfPermission(
                        context, Manifest.permission.ANSWER_PHONE_CALLS
                    ) == PackageManager.PERMISSION_GRANTED
                ) {
                    telecomManager.endCall()
                    callSuccess = true
                    Log.d(TAG, "telecomManager.endCall() finish")
                } else {
                    ToastUtils.showShort("No Permission!")
                }
            } else {
               
                val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                val c = Class.forName(tm.javaClass.name)
                val m: Method = c.getDeclaredMethod("getITelephony")
                m.isAccessible = true
                val telephonyService: ITelephony = m.invoke(tm) as ITelephony
                callSuccess = telephonyService.endCall()
                Log.d(TAG, " telephonyService.endCall finish")
            }
        } catch (e: Exception) {
            Log.d(TAG, "Exception   error: " + e.message)
            callSuccess = disconnectCall()
            e.printStackTrace()
        }
        return callSuccess
    }

    private fun disconnectCall(): Boolean {
        try {
            Log.d(TAG, "input keyevent " + KeyEvent.KEYCODE_ENDCALL)
            Runtime.getRuntime().exec(
                "input keyevent " + KeyEvent.KEYCODE_ENDCALL.toString()
            ) //KEYCODE_HEADSETHOOK
        } catch (exc: Exception) {
            Log.d(TAG, "exc.printStackTrace")
            exc.printStackTrace()
            return false
        }
        return true
    }

上面当Android版本大于9时,使用telecomManager.endCall()

小于Android9时,利用反射的原理来调用方法,因为Api接口不公开了,调用不了。

1.获取TelephonyManager
   2.获取TelephonyManager.class
     3.反射调用TelephonyManager的 getITelephony方法获取ITelephony
         4.挂断电话ITelephony.endCall文章来源地址https://www.toymoban.com/news/detail-529462.html

到了这里,关于Android 手机来电 获取来电信息,接听/挂断电话的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 使用BroadcastReceiver来监听手机来电

    客户在使用我公司的Flutter插件时,硬是要我们搞一个来电通知的功能,就很无语,我找了Flutter的一些插件,发现没有一个能实现这个功能的,最后只能通过Android来实现,我这个前端承受了不该承受的。 1. 添加权限 2. 创建一个类来继承BroadcastReceiver 3. 动态注册和注销广播

    2024年02月03日
    浏览(47)
  • Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)

    运行有问题或需要源码请点赞关注收藏后评论区留言 在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。 首先要给

    2024年02月09日
    浏览(64)
  • Android获取手机设备信息

    Android获取手机设备信息 在Android应用开发中,我们经常需要获取手机设备的信息来做一些个性化的逻辑处理。本文将介绍如何使用Android提供的API获取手机设备信息,并给出相应的源代码示例。 获取设备型号 设备型号可以帮助我们了解用户所使用的具体设备类型,从而做出一

    2024年01月25日
    浏览(43)
  • Android 获取手机通讯录联系人信息

    近日在项目开发过程中发现,华为手机HarmonyOS 3.0系统,设置隐私 里面可以查看各个应用访问隐私权限的次数,发现应用程序访问手机通讯录的次数异常的高,针对访问通讯录频次高的问题做了研究和优化 问题分析: 分析代码发现只要通过ContentProvider 访问通讯录一次,统计

    2024年02月12日
    浏览(46)
  • Android中获取手机SIM卡的各种信息

     通过以下工具类方法可以获取到手机SIM的各种信息数据!!!

    2024年02月10日
    浏览(38)
  • 鸿蒙应用开发学习:获取手机位置信息

    一、前言 移动应用中经常需要获取设备的位置信息,因此在鸿蒙应用开发学习中,如何获取手机的位置信息是必修课。之前我想偷懒从别人那里复制黏贴代码,于是在百度上搜了一下,可能是我输入的不对,结果没有找到想要的资料。于是我只能到官网上学习相关的开

    2024年01月24日
    浏览(49)
  • 使用adb命令获取Android SurfaceView 的 帧率(fps)jank,手机的基本信息

            adb shell dumpsys SurfaceFlinger | grep + 包名启动页 (不然他获取的数据是只有一行数据),这个命令只需要执行一次         使用的是adb shell dumpsys SurfaceFlinger --latency \\\"SurfaceView +包名/启动页\\\"获取的,目前只支持安卓6.0以上。         使用adb 命令时,可以根据他的

    2023年04月19日
    浏览(47)
  • uniapp开发小程序之获取用户基本信息与手机号方式

    介绍 首先讲讲小程序的登录注册,一般登录首先需要获取code code的有效期是十五分钟左右,前端通过接口获取到code之后传给后端,然后后端会根据code来判断是否有该用户,并且后台可以携带code发送请求,获取到用户 openid,ession_key等,没有该用户就进行注册 手机号  获取

    2024年02月16日
    浏览(44)
  • uniapp H5页面、小程序页面获取手机号拨打电话

    效果图: 1、H5页面----手机号写死: 2、H5页面----动态获取手机号拨打: APP: 小程序: methods:

    2024年02月07日
    浏览(53)
  • 【Android开发基础】蓝牙信息的获取(Bluetooth)

    描述:蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。蓝牙使当前的一些便携移动设备和计算机设备能够不需要电缆就能连接到互联网,并且可以无线接入互联网。

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包