在视频会议应用程序中,我最近在应用程序清单中添加了一个前台服务,因为应用程序在后台运行大约一分钟后,通话中的其他人将无法看到或听到视频和音频。
我声明使用@notifee/react-native
// for android foreground
if (Platform.OS === 'android') {
notifee.registerForegroundService(notification => {
return new Promise(() => {
// handle background event
notifee.onBackgroundEvent(async ({type, detail}) => {
const {pressAction} = detail;
if (type === EventType.ACTION_PRESS && pressAction?.id === 'mic') {
const result = togggleForegroundMic();
if (result) {
notifee.displayNotification({
id: notification.id,
body: notification.body,
android: {
...notification.android,
asForegroundService: true,
foregroundServiceTypes: [
AndroidForegroundServiceType.FOREGROUND_SERVICE_TYPE_CAMERA,
AndroidForegroundServiceType.FOREGROUND_SERVICE_TYPE_MICROPHONE,
],
actions: [
{
title: result,
pressAction: {id: 'mic'},
},
// {
// title: 'Loud Speaker',
// pressAction: {id: 'speaker'},
// },
],
},
});
}
}
});
notifee.onForegroundEvent(({type, detail}) => {
if (
type === EventType.ACTION_PRESS &&
detail?.pressAction?.id === 'mic'
) {
const result = togggleForegroundMic();
if (result) {
notifee.displayNotification({
id: notification.id,
body: notification.body,
android: {
...notification.android,
asForegroundService: true,
foregroundServiceTypes: [
AndroidForegroundServiceType.FOREGROUND_SERVICE_TYPE_CAMERA,
AndroidForegroundServiceType.FOREGROUND_SERVICE_TYPE_MICROPHONE,
],
actions: [
{
title: result,
pressAction: {id: 'mic'},
},
// {
// title: 'Loud Speaker',
// pressAction: {id: 'speaker'},
// },
],
},
});
}
}
if (
type === EventType.ACTION_PRESS &&
detail?.pressAction?.id === 'speakder'
) {
}
});
});
});
}
在“foregroundServiceTypes”中,我在数组中声明了 microphone 和 camera 服务
但这会导致我的应用程序崩溃并出现以下错误
致命异常:主进程:com.collabnowmobilecleint,PID:30221 java.lang.RuntimeException:无法使用 Intent { act=app.notifee.core.ForegroundService.START cmp=com 启动服务 app.notifee.core.ForegroundService@cd7fb43 .collabnowmobilecleint/app.notifee.core.ForegroundService(有额外内容)}:java.lang.IllegalArgumentException:foregroundServiceType 0x000000C0不是android.app.ActivityThread.handleServiceArgs(ActivityThread.java的清单文件的服务元素中的foregroundServiceType属性0x00000800的子集:4289)在android.app.ActivityThread.access$2000(ActivityThread.java:236)在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2001)在android.os.Handler.dispatchMessage(Handler.java:107) )在 android.os.Looper.loop(Looper.java:264) 在 android.app.ActivityThread.main(ActivityThread.java:7684) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android。 internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) 引起:java.lang.IllegalArgumentException:foregroundServiceType 0x000000C0不是子集清单文件的服务元素中的 foregroundServiceType 属性 0x00000800 在 android.os.Parcel.createException(Parcel.java:2075) 在 android.os.Parcel.readException(Parcel.java:2039) 在 android.os.Parcel.readException(Parcel) .java:1987) 在 android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:6720) 在 android.app.Service.startForeground(Service.java:742) 在 app.notifee.core.ForegroundService.onStartCommand( SourceFile:21) 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4271) 在 android.app.ActivityThread.access$2000(ActivityThread.java:236) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java: 2001)在android.os.Handler.dispatchMessage(Handler.java:107)在android.os.Looper.loop(Looper.java:264)在android.app.ActivityThread.main(ActivityThread.java:7684)在java。 lang.reflect.Method.invoke(本机方法)位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) )引起的原因:android.os.RemoteException:远程堆栈跟踪:在com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1396)在com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java: 1034) 在 com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:15727) 在 android.app.IActivityManager$Stub.onTransact(IActivityManager.java:3056) 在 com.android.server.am.ActivityManagerService.onTransact (ActivityManagerService.java:3153)
我尝试将以下权限添加到我的应用程序的清单文件中
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
我还将以下内容添加为应用程序标记的属性
<application android:name=".MainApplication" android:foregroundServiceType="camera|microphone">
我希望当应用程序在后台/最小化时麦克风和摄像头仍保持活动状态
找到解决方案
似乎我没有按照文档中的描述指定前台服务类型:https://notifee.app/react-native/docs/android/foreground-service#specifying-foreground-service-types
添加下面的代码片段解决了我的问题
<service
android:name="app.notifee.core.ForegroundService"
android:foregroundServiceType="camera|microphone"
tools:replace="android:foregroundServiceType" />