# 接入问题及解答

这里汇总了一些 Android 接入过程中有可能遇到的常见问题,方便接入过程中排查问题。

# 启用代码混淆后应用崩溃如何处理?

在项目的混淆配置文件 proguard-rules.pro 中添加以下规则即可:

-keep class net.aihelp.** {*;}

# 为什么 SDK 显示的语言和我指定的语言不一致?

正常情况下,接入方可以通过 init 的最后一个参数指定 SDK 的显示语言;如果没有设置,SDK 则会使用设备语言来进行初始化。

同时,为了保证玩家侧的体验,AIHelp 有一套针对初始化语言的矫正逻辑:

1、我们这边会针对不同的标准做矫正,比如 zh / zh-cn / zh-CN / zh_CN / zh-hans 等等,都会被转换为 zh-CN 来进行逻辑处理; 2、如果矫正后的语言没有在后台开启的话,我们会再次矫正为 AIHelp 后台设置的默认语言;

AIHelp 后台设置的默认语言一般为英语,在这种情况下,保底语言就是英语;这个默认语言可以根据咱们这边的具体需求进行调整。

另外需要注意的是,目前 AIHelp API 接收的是 ISO 639-1 语言码,初始化的时候不能传递国家码,因为有可能某个国家码是另外一个语言码:比如 KR 在国家码表示韩国,但是在语言码指代的是卡努里语。

如果当下项目中确实是这么用的,那建议将 ISO-3166 国家码按照 ISO 639-1 做一份映射,然后再将语言码传递给 AIHelp 使用。


# 如何适配选择图片或视频时的权限申请?

AIHelp 内部已经实现了所有的权限申请逻辑,你只需要在清单文件配置相关权限声明即可。

对于 targetSdkVersion <= 32,直接配置读取外部存储的权限即可:

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    tools:node="replace" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:node="replace" />

注意上面的 tools:node="replace" 是必须的,它能帮你强制覆盖其它 SDK 的声明,保证主工程的声明优先级最高。

对于 targetSdkVersion >= 33,需要将读写外部存储的权限限制到 API 32,并单独申请 Android 13 之后的媒体权限:

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32"
    tools:node="replace" />

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

注意上面的 android:maxSdkVersion="32" 以及 tools:node="replace" 都是必须的。

Android 13 废弃了读写外部存储的权限,需要在声明读写权限的时候将 API 限制到 API 32,上述配置能帮你强制覆盖其它 SDK 的声明,保证主工程的声明优先级最高。


# 为什么在某些机型上提示没有权限,但是跳转到设置页面后也没有地方开启?

Android 13 中废弃了原有的读写外部存储的权限,如果应用编译版本升级到 API 33 及以上,AIHelp v4.3.6 以下的版本运行在 Android 13 的设备上,可能就会遇到此问题。

这种情况下,可以选择:

1、将 SDK 升级到 v4.3.6 及之后的版本,或者,

2、在声明读写权限的时候将 API 限制到 API 32:

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32"
    tools:node="replace" />

如果配置了上述代码后仍不生效,可以检查是否声明了读取外部存储的权限,同样需要进行同样的 API 版本限制:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="32"
    tools:node="replace" />

需要注意的是,读取外部存储的权限对 AIHelp 也不是必须的,如果你的应用本身并不需要相关权限,可以将上述代码中的 replace 更换为 remove 来强制移除相关权限的声明。


# 为什么在客服后台看到的玩家信息为 anonymous 和一串乱码?

默认情况下,在调用 updateUserInfo API 更新用户信息之前,AIHelp 会使用 anonymous 作为用户名,deviceId 作为用户 ID。

同时,在打开 AIHelp 页面之前,UID 的信息都不会同步给后端。UID 是保存在内存中的,所以只要保证打开页面之前能拿到 UID,用户会话就不会出错。

如果客服后台没有设置上,那只能是这个 API 没有被有效调用。

有可能是 updateUserInfo API 的调用时机问题,这个 API 需要在初始化之后调用

AIHelpSupport.init(/* your code here */);
AIHelpSupport.updateUserInfo(/* your code here */);

只需要保证 updateUserInfo 调用在 init 之后就可以,并不依赖初始化成功。

如果更新用户信息早于初始化,就有可能被 return 掉,导致没有设置成功;可以考虑在打开页面之前更新一下用户信息,应该也可以解决问题。


# AIHelp 有非 AndroidX 的版本吗?

AIHelp Android SDK 是基于 AndroidX 开发的,但是目前有两个适配 Support 版本的 AAR 包:

Support 版本的 SDK 没有发布到 Gradle,只能用 AAR 手动接入,需要配合这些依赖一起使用:

implementation 'com.android.support:support-v4:28.0.0' 
implementation 'com.android.support:appcompat-v7:28.0.0' 
implementation 'com.android.support:design:28.0.0' 
implementation 'com.android.support:recyclerview-v7:28.0.0' 
implementation 'com.android.support:viewpager:28.0.0' 
implementation 'com.android.support:swiperefreshlayout:28.0.0' 
implementation 'com.squareup.okhttp3:okhttp:3.12.13'

# 安卓可以离线接入 AIHelp 吗?

AIHelp 所有版本的 AAR 包都可以在 maven 仓库 (opens new window)中找到,可以自行按需下载。

但是由于 AIHelp 内部也有部分依赖 (opens new window),所以如果要离线接入的话,还需要将这些库都下载下来,然后导入自己的工程进行手动依赖:

implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
上次更新: 11/30/2024, 11:18:33 AM