腾讯云音视频通话SDKAndroid_音视频解决方案_同尘科技

音视频通话SDK 1年前 (2023-10-17) 浏览 87

离线唤醒功能,能够让您的应用在后台运行或者离线状态下依然能够收到音视频通话的响铃呼叫,TUICallKit 集成了 TUIOfflinePush 组件实现离线唤醒功能,本文将介绍如何在音视频通话项目中集成TUIOfflinePush组件。

前期准备

1. 注册应用到厂商推送平台
离线推送功能依赖厂商原始通道,您需要将自己的应用注册到各个厂商的推送平台,得到 APPID 和 APPKEY 等参数,具体请参见 离线推送(Android) 中的步骤一。下述两个文件在后续步骤会用到:注册华为平台的时候,下载agconnect-services.json文件,并保存。注册 Google 平台的时候,下载google-services.json文件,并保存。

华为 Google FCM
 


2. 在 IM 控制台进行配置
注册厂商通道需要传入自己的包名,各厂商填入的包名需保持一致,用于消息互通。具体请参见 离线推送(Android) 中的步骤二,记录生成的 ID,APPID 以及 APPKEY,他们会在后续步骤中用到。
推送证书 ID 如下:

步骤一:下载并导入组件

1. 在 Github 中克隆/下载代码,然后拷贝 Android 目录下的 tuiofflinepush 子目录到您当前工程中的 app 同级目录中,如下图:2. 在工程根目录下找到settings.gradle文件,并在其中增加如下代码:

include ':tuiofflinepush'

3. 在 app 目录下找到build.gradle文件,并在其中增加如下代码,它的作用是声明当前 app 对新加入的 tuiofflinepush 组件的依赖:

api project(':tuiofflinepush')

步骤二:完成工程配置

1. 在 app 目录下,找到build.gradle文件,修改应用包名为自己的包名。

applicationId 'com.****.trtc'

2. 在 app 目录下,找到build.gradle文件,设置ViVo接入参数VIVO_APPKEYVIVO_APPID以及HONOR_APPID,避免编译或运行报错。

manifestPlaceholders = [    "VIVO_APPKEY": "PLACEHOLDER",     "VIVO_APPID" : "PLACEHOLDER",    "HONOR_APPID": "PLACEHOLDER"]

3. 配置 华为谷歌 文件:
在 app 目录下,替换google-services.json文件,该文件为您在 前期准备 注册 Google 平台的时候保存的文件。
在 app 目录下,增加agconnect-services.json文件,该文件为您在 前期准备 注册华为平台的时候下保存的文件。4. 将 前期准备 记录的 ID、APPID 和 APPKEY 填入PrivateConstants文件中,并检查参数是否配置正确。填充的参数如下:

public class PrivateConstants {    /****** 小米离线推送参数start ******/    // 在腾讯云控制台上传第三方推送证书后分配的证书 ID    public static final long XM_PUSH_BUZID = 您应用分配的证书 ID;    // 小米开放平台分配的应用APPID及APPKEY    public static final String XM_PUSH_APPID = "您应用分配的 APPID";    public static final String XM_PUSH_APPKEY = "您应用分配的 APPKEY";    /****** 小米离线推送参数end ******/}

注意这一步非常重要,请认真检查参数是否配置正确。 完成以上步骤,您的工程就具备了TUICallKit的离线唤起功能。

步骤三:自定义离线通知内容

KotlinJavaTUICallKit 提供了默认的通知样式,但是如果您需要自定义通知内容,请修改 OfflinePushInfoConfig.kt 文件 。

object OfflinePushInfoConfig {        pushInfo.desc = "You have receive a new call"           // OPPO must set a ChannelID to receive push messages. This channelID needs to be the same as the console.            pushInfo.androidOPPOChannelID = "tuikit"        pushInfo.isIgnoreIOSBadge = false        pushInfo.iosSound = "phone_ringing.mp3"        pushInfo.androidSound = "phone_ringing" //Note:don't add suffix        //VIVO message type: 0-push message, 1-System message(have a higher delivery rate)        pushInfo.androidVIVOClassification = 1        //FCM channel ID, you need change PrivateConstants.java and set "fcmPushChannelId"        pushInfo.androidFCMChannelID = "fcm_push_channel"        //Huawei message type        pushInfo.androidHuaWeiCategory = "IM"        //IOS push type: if you want to use VoIP, please modify type to TUICallDefine.IOSOfflinePushType.VoIP        pushInfo.iosPushType = TUICallDefine.IOSOfflinePushType.APNs        return pushInfo    }}

TUICallKit 提供了默认的通知样式,但是如果您需要自定义通知内容,请修改 OfflinePushInfoConfig.java 文件 。

public static TUICallDefine.OfflinePushInfo createOfflinePushInfo(Context context) {        TUICallDefine.OfflinePushInfo pushInfo = new TUICallDefine.OfflinePushInfo();        pushInfo.setTitle("mike");        pushInfo.setDesc("You have receive a new call");         // OPPO must set a ChannelID to receive push messages. This channelID needs to be the same as the console.        pushInfo.setAndroidOPPOChannelID("tuikit");        pushInfo.setIgnoreIOSBadge(false);        pushInfo.setIOSSound("phone_ringing.mp3");      pushInfo.setAndroidSound("phone_ringing"); //Note:don't add suffix    //VIVO message type: 0-push message, 1-System message(have a higher delivery rate)    pushInfo.setAndroidVIVOClassification(1);    //FCM channel ID, you need change PrivateConstants.java and set "fcmPushChannelId"    pushInfo.setAndroidFCMChannelID("fcm_push_channel");    //Huawei message type    pushInfo.setAndroidHuaWeiCategory("IM");    //IOS push type: if you want to use VoIP, please modify type to TUICallDefine.IOSOfflinePushType.VoIP    pushInfo.setIOSPushType(TUICallDefine.IOSOfflinePushType.APNs);    return pushInfo;}



步骤四:自定义离线通知铃音

离线通知铃声仅支持以下厂商自定义:华为、小米、FCM 和 APNs,其他厂商 OPPO、VIVO、荣耀等暂不支持。TUICallKit 引入了 TUIOfflinePushPush 组件,需在应用启动,调用以下方法开启离线通知自定义铃音能力。KotlinJava

class DemoApplication : Application() {    override fun onCreate() {        TUIOfflinePushConfig.getInstance().isAndroidPrivateRing = true    }}
public class DemoApplication extends Application {    @Override    public void onCreate() {        TUIOfflinePushConfig.getInstance().setAndroidPrivateRing(true);    }}

1、华为 & APNs

调用接口 setAndroidSound() 和 setIOSSound()。定制铃音资源文件,将铃音文件添加到本地 Android Studio 工程 res/raw 目录下。参考 [步骤三] 设置铃声。KotlinJava

val pushInfo = OfflinePushInfo()pushInfo.iosSound = "铃声名称.mp3"pushInfo.androidSound = "铃声名称"
TUICallDefine.OfflinePushInfo pushInfo = new TUICallDefine.OfflinePushInfo();pushInfo.setIOSSound("铃声名称.mp3");pushInfo.setAndroidSound("铃声名称");

注意:IMSDK 6.1.2155 及以上版本支持。华为推送消息的铃声为首次创建通知渠道时的铃声,之后再次设置其他铃声无效,若想更新自定义通知铃音需卸载重装,详见:华为自定义铃声。

2、小米

(1)Android 8.0 之前,调用 setAndroidSound() 和 setIOSSound()。定制铃音资源文件,将铃音文件添加到工程 res/raw 目录下(参考上述华为调用)。(2)Android 8.0 之后,还需要登录小米厂商控制台并创建channel并做好配置,其中铃音文件需要添加到本地 Android Studio 工程的 res/raw 目录下。KotlinJava

val pushInfo = OfflinePushInfo()pushInfo.iosSound = "铃声名称.mp3"pushInfo.androidSound = "铃声名称"pushInfo.androidXiaoMiChannelID = "厂商申请的channelID"
TUICallDefine.OfflinePushInfo pushInfo = new TUICallDefine.OfflinePushInfo();pushInfo.setIOSSound("铃声名称.mp3");pushInfo.setAndroidSound("铃声名称");pushInfo.setAndroidXiaoMiChannelID("厂商申请的channelID"); 


注意Android 8.0之前的方式,IMSDK 6.1.2155 及以上版本支持。Android 8.0之后的方式,IMSDK 7.0.3754 及以上版本支持。

3、FCM

(1)Android 8.0 之前,调用 setAndroidSound() 和 setIOSSound()。定制铃音资源文件,将铃音文件添加到工程 res/raw 目录下(参考上述华为调用)。(2)Android 8.0之后,FCM 需要配置 channelID 以及铃音资源,TUICallKit 引入的 tuiofflinepush 组件已经处理了自定义铃声的播放。铃音文件需要添加到您本地 Android Studio 工程的 res/raw 目录下,并指定铃音名称和 channel ID 的名称,详见 PrivateConstants。

public class PrivateConstants {    // FCM 通道指定 channel ID    public static String fcmPushChannelId = "FCM ChannelID";    // FCM 需指定通道的推送铃音名称,与AndroidStudio 工程里 res/raw 目录中的铃音文件名一致,不需要后缀名    public static String fcmPushChannelSoundName = "铃声名称";}

KotlinJava

val pushInfo = OfflinePushInfo()pushInfo.iosSound = "铃声名称.mp3"pushInfo.androidSound = "铃声名称"pushInfo.androidFCMChannelID = "厂商申请的channelID"
TUICallDefine.OfflinePushInfo pushInfo = new TUICallDefine.OfflinePushInfo();pushInfo.setIOSSound("铃声名称.mp3");pushInfo.setAndroidSound("铃声名称");pushInfo.setAndroidFCMChannelID("厂商申请的channelID");

注意Android 8.0之前的方式,IMSDK 6.1.2155 及以上版本支持。Android 8.0之后的方式,IMSDK 7.0.3754 及以上版本支持。FCM 自定义铃声或者设置 channel id 仅支持证书模式。

集成效果

下图是 TUICallKit 含 UI 方案集成离线推送的效果(不同厂商展示效果可能会有差异):

常见问题

收不到离线推送通知,请参见 TUIOfflinePush-常见问题 进行排查。

1、收不到通知

1. 用厂商控制台进行推送测试,能成功说明厂商通道没有问题。再检查 TUIOfflinePush 控制台厂商参数配置是否正确,按要求进行填写。(经测试:vivo x9必须在控制台配置消息类别)。2. 部分手机收到通知会放到不重要的通知中,请下拉状态栏,检查是否归纳到不重要的通知中。3. 检查 TUIOfflinePush 注册是否成功,过滤以下日志:

TUIOfflinePush

2、锁屏时无法点亮屏幕

Android 手机由于厂商和平台的限制,在锁屏情况下需要不同的权限。请按以下情况进行排查。确认打开厂商锁屏下通知权限
部分厂商统一做了约束,例如小米锁屏下离线通知到达时未亮屏:在设置 > 锁屏里,单击开关锁屏来通知时亮屏,打开开关。确认打开应用锁屏通知权限
例如:小米需要锁屏显示权限。说明如遇到该问题,需要做兼容处理,您可以加入我们的 QQ 群(605115878)进行咨询与反馈。

3、单击离线推送通知,拉不起通话界面

需要检查下是否收到了通话请求,可以过滤以下日志:

onReceiveNewInvitation

4、应用在后台时,不能自动将通话界面拉取到前台

将应用从后台自动拉取到前台,需要检查 App 是否开启了“后台自启动”或“悬浮窗”权限。值得注意的是,不同厂商、甚至同一厂商不同 Android 版本,其对于应用开放的权限以及权限名称也会存在不一致。例如,小米6只需要开启后台弹出界面权限,而红米需要同时打开后台弹出界面显示悬浮窗权限。说明在 TUICallKit 含UI方案中,开启悬浮窗的时候,会跳转手机的设置界面,引导用户开启悬浮窗和后台拉起应用权限;您可以根据自己的业务需求,提前引导用户开启该权限。如果您在测试过程中发现手动开启了所有权限,依然无法自动拉起通话界面到前台,需要做兼容处理。可以加 QQ 群: 605115878 联系我们协助处理。

OPPO 手机的权限设置位置 小米手机的权限设置位置
 

5、角标问题

目前仅华为支持收到离线消息时生成角标,其他厂商暂不支持。华为设置角标方法详见其官方文档:华为桌面角标开发指导。在引入的 TUIOfflinePush 组件中,也调用了该方法进行设置:KotlinJava

fun updateBadge(context: Context, number: Int) {    if (BrandUtil.getInstanceType() != TUIOfflinePushConfig.BRAND_HUAWEI) {        return    }    try {        val extra = Bundle()        extra.putString("package", context.getPackageName())        extra.putString("class", PrivateConstants.huaweiBadgeClassName) //huaweiBadgeClassName is your app main activity               extra.putInt("badgenumber", number)        context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra)    } catch (e: Exception) {    }}
public void updateBadge(final Context context, final int number) {        if (BrandUtil.getInstanceType() != TUIOfflinePushConfig.BRAND_HUAWEI) {        return;        }        try {        Bundle extra = new Bundle();        extra.putString("package", context.getPackageName());                extra.putString("class", PrivateConstants.huaweiBadgeClassName); //huaweiBadgeClassName is your app main activity               extra.putInt("badgenumber", number);                context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra);        } catch (Exception e) {        }}

如果想要清除角标,可以在适当的时机调用该方法,将角标设置为0。

技术咨询

如有其他问题,欢迎您加入我们的 TUIKit 组件交流群 QQ 群:605115878,进行技术交流和产品沟通。

对音视频的解决方案有疑惑?想了解解决方案收费? 联系解决方案专家

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心,购买腾讯云享受折上折,更有现金返利:同意关联,立享优惠

阿里云解决方案也看看?: 点击对比阿里云的解决方案

- 0人点赞 -

发表点评 (0条)

not found

暂无评论,你要说点什么吗?