Swift 技术 监听电话中断,音乐(用于恢复播放音乐)(源码)

news2024/9/24 13:24:27

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

前言

今天做音乐播放起的需求需要开发接打电话的需求,正在播放音乐的时候,当电话来的,我们需要停止播放音乐,然后当挂断电话之后就恢复音乐的播放,或者拨打电话出去之后就停止音乐的播放,然后当挂断电话之后就恢复音乐的播放.

1.app在前台听音乐时,电话打进来会停止播放音乐,电话挂断之后恢复播放
2.app在后台听音乐时,电话打进来会停止播放音乐,电话挂断之后恢复播放
3.app在后台听音乐时,主动拨打电话,会停止播放音乐,电话挂断之后恢复播放

正题

方法 - CallKit

1.本app播放音乐过程中,突然有电话进入停止播放音乐,拨打电话接听后停止播放音乐,挂断之后恢复播放.

代码写在Appdeledate

import CallKit

///属性记录电话 打来中断
private let callObserver = CXCallObserver()

/// 是否电话拦截垄断
private var callPhoneOutGoing = false

callObserver.setDelegate(self, queue: nil)

extension ViewController: CXCallObserverDelegate {
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        if !call.isOutgoing && !call.isOnHold && !call.hasConnected && !call.hasEnded {// 暂停播放
            //print("来电")
            if playerState == true {
                playerState = false
                callPhoneOutGoing = true
                player.pause()
            }
        } else if !call.isOutgoing && !call.isOnHold && !call.hasConnected && call.hasEnded {// 开始播放
            //print("来电-挂掉(未接通)")
            if playerState == false && callPhoneOutGoing == true {
                playerState = true
                callPhoneOutGoing = false
                player.play()
            }
        } else if !call.isOutgoing && !call.isOnHold && call.hasConnected && !call.hasEnded {// 暂停播放
            //print("来电-接通")
            if playerState == true {
                playerState = false
                callPhoneOutGoing = true
                player.pause()
            }
        } else if !call.isOutgoing && !call.isOnHold && call.hasConnected && call.hasEnded {// 开始播放
            //print("来电-接通-挂掉")
            if playerState == false && callPhoneOutGoing == true {
                playerState = true
                callPhoneOutGoing = false
                player.play()
            }
        } else if call.isOutgoing && !call.isOnHold && !call.hasConnected && !call.hasEnded {// 暂停播放
            //print("拨打")
            if playerState == true {
                playerState = false
                callPhoneOutGoing = true
                player.pause()
            }
        } else if call.isOutgoing && !call.isOnHold && !call.hasConnected && call.hasEnded {// 开始播放
            //print("拨打-挂掉(未接通)")
            if playerState == false && callPhoneOutGoing == true {
                playerState = true
                callPhoneOutGoing = false
                player.play()
            }
        } else if call.isOutgoing && !call.isOnHold && call.hasConnected && !call.hasEnded {// 暂停播放
            //print("拨打-接通")
            if playerState == true {
                playerState = false
                callPhoneOutGoing = true
                player.pause()
            }
        } else if call.isOutgoing && !call.isOnHold && call.hasConnected && call.hasEnded {// 开始播放
            //print("拨打-接通-挂掉")
            if playerState == false && callPhoneOutGoing == true {
                playerState = true
                callPhoneOutGoing = false
                player.play()
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法 - interruptionNotification

// 检测中断音乐通知
NotificationCenter.default.addObserver(self, selector: #selector(interruptionNotification(notifi:)), name: AVAudioSession.interruptionNotification, object: nil)

// 检测中断音乐通知
@objc func interruptionNotification(notifi:Notification) {
//false 中断结束    true 中断开始
//print("Key: \(notifi.userInfo?["AVAudioSessionInterruptionTypeKey"] as? Bool)")

let suspend = notifi.userInfo?["AVAudioSessionInterruptionTypeKey"] as? Bool ?? false
print("suspend: \(suspend)")
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高烧39°考研上岸】23上交819考研经验分享

笔者来自通信考研小马哥23上交819全程班学员 一,基本情况介绍和考研经历 大家好,首先介绍一下我的基本情况。我本科毕业于东南大学,报考的是上海交通大学电子系电子与通信工程专业(专业学位)。我二战上岸&#xff0c…

Selenium:HTML测试报告

自动化测试过程中,获得用例的执行结果后,需要有具象化、简洁明了的测试结果,比如:用例执行时间、失败用例数、失败的原因等,这时候,就需要用到测试报告。 HTML测试报告是python语言自带的单元测试框架&…

等保各项费用支出明细

等保收费主要依据文件: 等保工作的定级指南文件_luozhonghua2000的博客-CSDN博客 Q7:做等级保护要多少钱? 答:开展等级保护工作主要包含:规划费用、建设或整改费用、运维费用、测评费用等,具体费用因各单位现状、保护对象承载业务功能、重要程度、所在地区等差异较大。 …

Input事件在应用中的传递(一)

Input事件在应用中的传递(一) hongxi.zhu 2023-4-25 前面我们已经梳理了input事件在native层的传递,这一篇我们接着探索input事件在应用中的传递与处理,我们将按键事件和触摸事件分开梳理,这一篇就只涉及按键事件。 一、事件的接收 从前面的…

Kubernetes(k8s)概念介绍

文章目录 1. k8s概述和特性2. k8s架构组件3. k8s核心概念 1. k8s概述和特性 K8s是一个开源的用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署,规划,更新,维护…

R语言 | 程序的流程控制

目录 一、if语句 1.1 if语句的基本操作 1.2 if...else语句 1.3 if语句也可有返回值 1.4 if...else if...else if...else 1.5 嵌套式if语句 二、递归式函数的设计 三、向量化的逻辑表达式 3.1 处理向量数据if...else的错误 3.2 ifelse()函数 四、switch语句 五、for循…

塔望3W消费战略全案丨窄赛道,高增长 普麦尔知己精酿,掘金中国啤酒利基市场

普麦尔 知己精酿 客户:上海麦仕醇啤酒有限公司 品牌:普麦尔 purmalz beer 服务:3W消费战略 品牌全案 掘金中国啤酒利基市场 精酿啤酒(Craft Beer)的概念最早起源于美国。通常与传统的工业啤酒形成较大的反差,精酿最早的称呼 …

C learning_10 (函数的嵌套调用和链式访问、函数的声明和定义、函数递归)

目录 函数的嵌套调用和链式访问 嵌套调用 函数可以嵌套调用,可以嵌套定义吗? 链式访问 函数的声明和定义 声明 定义 函数递归 递归的两个必要条件 函数的嵌套调用和链式访问 嵌套调用 函数嵌套调用指的是在一个函数中调用另外一个函数&#xf…

OpenSSH升级版本

项目被扫出openssh有严重漏洞,因此要升级openssh到最新版本 1、为防止安装失败,无法用ssh做远程连接,因此先安装telnet防一手 yum -y install telnet*systemctl enable telnet.socketsystemctl start telnet.socket注:安全文件关…

【星戈瑞】脂溶性CY5.5马来酰亚胺Cyanine5.5 maleimide

脂溶性CY5.5马来酰亚胺是一种荧光染料,其分子中含有马来酰亚胺结构,结构中的共轭体系赋予其良好的光学性质。该染料在红外区域有较强的吸收峰,具有较高的荧光量子产率和较长的荧光寿命,因此被应用于细胞和生物分子的荧光标记和成像…

cleanmymac正式版mac电脑清理软件

电脑清理软件在我们的电脑使用过程中是非常实用便捷的清理软件.当电脑使用了一段时间内,电脑就会产生各种各样的垃圾文件,比如说残留的注册表或者无效的注册表,系统碎片以及毫无用处的文件等,这些的存在将会极大程度地拖慢电脑的运行速度,而你删除的话可能会删除本不能删除的文…

解锁新技能《Java绘制2D图形验证码方法》

一、常见的图形验证码有如下三种: 字母数字混合(干扰线);纯数字(干扰线);纯字母(干扰线); 二、示例图如下: 三、案例代码 问题一:绘…

LC-2106. 摘水果(滑动窗口)

2106. 摘水果 难度困难78 在一个无限的 x 坐标轴上,有许多水果分布在其中某些位置。给你一个二维整数数组 fruits ,其中 fruits[i] [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排列 &#xff0c…

C语言动态内存管理与文件操作:打造高效通讯录

本篇博客会讲解如何使用C语言实现一个通讯录。实现通讯录的过程中,会大量用到C语言的知识点,包括但不限于:函数、自定义类型、指针、动态内存管理、文件操作,这些知识点在我的其他博客中都有讲解过,欢迎大家阅读&#…

进程及进程管理

Linux基础 提示:个人学习总结,仅供参考。 一、Linux系统部署 二、服务器初始化 三、文件和用户管理 四、用户的权限 五、进程及进程管理 提示:文档陆续更新整理 进程及进程管理 Linux基础一、进程简介(一)进程三问…

面向万物智联的应用框架的思考和探索(上)

原文:面向万物智联的应用框架的思考和探索(上),点击链接查看更多技术内容。 应用框架,是操作系统连接开发者生态,实现用户体验的关键基础设施。其中,开发效率和运行体验是永恒的诉求&#xff0c…

代码命名规范是真优雅呀!代码如诗

日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢? Java项目的代码结构,能够体现它的设计理念。Java采用长命名的方式来规范类的命名,能够自己表达…

网络安全怎么学,才不会成为脚本小子?

一,怎么入门? 1、Web 安全相关概念(2 周) 了解网络安全相关法律法规 熟悉基本概念(SQL 注入、上传、XSS、CSRF、一句话木马等)。 通过关键字(SQL 注入、上传、XSS、CSRF、一句话木马等&#…

RK3588 lt16911uxc hdmi in

我们的单板需要四路HDMI IN,其中一路使用了rk3588自带的hdmi rx,另外三路通过LT6911UXC 转接芯片,实现了三路hdmi in 使用了rk3588的DPHY0,DPHY1以及DCPHY0 设备树修改如下: /* DCPHY0 */ &csi2_dcphy0 { status = "okay"; ports { #addres…

【Errors】【计算机图形学】A-SDF复现的一点纠正记录

ICCV 2021的工作A-SDF,在跑的过程中可能是一些版我Run了这篇工作代码的Reconstruction,然后出现了一点小小的错误,记录如下。 问题一:对数据做直接修改导致出错(可能是不同的pytorch版本导致的?) 错误描述…