# 接入问题及解答
这里汇总了一些 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 包:
- v3.2.1 的故事线版本 (opens new window) 无法使用运营模块,客服和 FAQ 不受影响
- v4.1.8 的 RPA 版本 (opens new window)
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'