安卓麦克风权限在应用到后台后,权限丢失,发不出声音

前因和场景

最近项目有个网络电话,也就是像微信通话这种类型的,语音通话场景,有个功能是开启悬浮窗,需要悬浮窗权限。当通话中,点悬浮窗按钮,跳转去申请悬浮窗权限,就会发现我们这边发不出声音到那边。(具体触发点是我们点击确认悬浮窗权限之后,就会发不出声音),实际上是麦克风权限丢失了。
谷歌文档
虽然不知道为何只有当点击了悬浮窗,这个麦克风权限才发生变化,但是毫无疑问问题点是在这里,解决方向往这边靠。

解决办法

目前能想到的解决办法也是依靠这个指引文档来做,将当前通话的音频拉到前台服务中,防止丢失权限。
范例有:微信电话,可以看到微信在做语音通话时,是一直有一个前台通知停留在通知栏里,这样就算是去了其他页面,通话依旧保持着。

细节问题探讨

根据文档提示的,前台服务,我去查找了解这个东西到底是什么场景使用的,以及使用限制。尤其是好奇在使用这个的时候,是否非要加一个通知。

文档: 前台服务 的后半部分,可以看到最原始的写法里是需要自写通知,而不是自带的。而启动通知的方式也是通过前台服务,也就是ServiceCompat.startForeground。

前台服务与通知的历史:前台服务必须绑定通知,在安卓8.0以前,startForeground(id,new Notifation()),也就是空通知就可以了,8.0以后才需要有内容的通知。另外前台服务的启动必须在内部startForeground启动绑定的通知,而不是单纯启动服务就够了。

但是我照着文档demo和网上的提供代码,最终效果发现没有这个通知栏在上面,启动失败,但是服务是正常运行的,生命周期的日志正常,就是不见通知踪影。直接泪目。

目前已经检查了通知的三要素,都没有问题,三个的内部相关设置也没问题。最终发现通知的启动仍需要manage.notify(),这样通知栏就有了,而且麦克风权限也没有丢失,那么文档里最后的startForeground为啥没起来通知。

NotificationManager 通知管理器,用来发起、更新、删除通知
NotificationChannel 通知渠道,8.0及以上配置渠道以及优先级
NotificationCompat.Builder 通知构造器,用来配置通知的布局显示以及操作相关

链接: mActivityManager.setServiceForeground
跟随这个看这块的执行源码,没看太懂,也没找到是哪里没执行到,导致的通知不出现,放弃了。

补充解决上面的情况:我后来多机型验证发现,我是安卓12的小米手机,正常抄写前台服务的代码没有出现通知栏,但是12以下的小米系统,使用前台服务代码是正常出现通知栏的。而且其他厂商手机不管是安卓多少,通知栏也是正常出现的。
所以,针对小米机型的安卓12及以上,想要出现通知栏,需要manager.notify一下,注意里面传的id不要和startForground里面的id一样。否则也会不出现。其他厂商无此问题。

补充一个点,startForgroundService发生后,10s内要service#onStartCommand内执行到 startForeground方法,否则就会崩溃,但是startForeground方法有过补充,在安卓10以下,只有startForeground(id,notification),没有type参数,所以需要区别使用,否则就会anr崩溃。

我在写notification时没有加其他文档里写的那个限制通知关闭的setOngoing,因为发现加不加在国产厂商这里都无效。hw和oppo厂商,即使无法关闭,他们那里也是允许关闭的。而其他厂商,即使你不加,前台服务的通知你也关不掉。微信的通知也是这种,所以就保持这样吧。

还有在安卓14开始,前台服务需要申请权限了,需要处理。我暂时留着没做,下期做。

前台服务的文档详情

链接: 前台服务
前台服务用于执行可被用户注意到的操作。但是我照文档的内容写了一份,发现启动了但是通知没有建立。
还得继续看

前台服务会显示状态栏通知,让用户知道您的应用正在前台执行任务并消耗系统资源。
仅当您的应用需要执行可被用户注意到的任务(即使他们没有与应用直接交互时)时,才使用前台服务。如果该操作的重要性较低,需要使用优先级最低的通知,请改为创建后台任务。
没理解错的话,前台服务它是倡导我们绑定一个通知栏通知。而不是强制。
从 Android 13(API 级别 33)开始,默认情况下,用户可以关闭与前台服务关联的通知。为此,用户可以在通知上执行滑动手势。一直以来,除非停止前台服务或将其从前台移除,否则通知不会被关闭。

但是在安卓14以上,允许用户手动关闭。

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值