本篇分享在线客服系统海豚客服如何进行安卓SDK的接入,首先请点击下载SDK包:“dolphin_lib-release.aar”

一.将最小编译版本修改为17或者以上,通常在主module(通常名字为“app”)下gradle文件内添加或者修改,如

android {compileSdkVersion 30buildToolsVersion "30.0.3"defaultConfig {applicationId "com.example.dolphin_sdk_demo"minSdkVersion 17targetSdkVersion 30versionCode 1versionName "1.0"}
}

二.项目根节点下的gradle文件内添加如下代码

flatDir {dirs 'libs'
}

并在allprojects内repositories内添加

maven { url "https://jitpack.io" }

本文档附上具体添加位置如下

allprojects {repositories {flatDir {dirs 'libs'}maven { url "https://jitpack.io" }maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }}
}

三.将下载好的本SDK的aar包放到主module下libs目录下,目录索引如图

四.主module下gradle文件内添加依赖以导入aar包,如下

implementation(name: 'dolphin_lib-release', ext: 'aar')

五.除了添加aar包的依赖外,还要添加SDK所需依赖,成功运行SDK需要以下所有依赖,如果本身的项目里已经有其中部分依赖,则保留最新版本而去掉其他低版本

dependencies {implementation(name: 'dolphin_lib-release', ext: 'aar')implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.2.1'implementation 'androidx.constraintlayout:constraintlayout:2.0.2'//Glideimplementation 'com.github.bumptech.glide:glide:4.11.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'implementation 'com.github.bumptech.glide:okhttp3-integration:4.11.0'//EventBusimplementation 'org.greenrobot:eventbus:3.0.0'//dagger-rxjava2-retrofit2-okhttp3implementation 'com.google.dagger:dagger:2.23.2'annotationProcessor 'com.google.dagger:dagger-compiler:2.23.2'implementation 'io.reactivex.rxjava2:rxjava:2.2.5'implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'implementation 'com.squareup.retrofit2:retrofit:2.6.0'implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'implementation 'com.squareup.retrofit2:converter-gson:2.6.0'implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'implementation 'com.squareup.okhttp3:okhttp:3.12.1'//单Activity+多Fragmentimplementation 'me.yokeyword:fragmentationx:1.0.2'implementation 'me.yokeyword:fragmentationx-swipeback:1.0.2'implementation 'me.yokeyword:eventbus-activity-scope:1.1.0'//WebSocket收发消息implementation 'org.java-websocket:Java-WebSocket:1.3.6'api 'com.github.NaikSoftware:StompProtocolAndroid:1.6.4'
}

六.清单配置文件AndroidManifest.xml中添加权限、相关Activity和Service注册以及其他设置,如下:

1.权限(manifest节点下添加,不需要代码动态申请,因为SDK内已经有此类逻辑了)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- SDCard读写数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 系统照相机拍照 -->
<uses-permission android:name="android.permission.CAMERA" />

2.AndroidManifest.xml中application节点设置属性

android:allowBackup="true"
android:requestLegacyExternalStorage="true"
android:supportsRtl="true"

具体位置如下图
3.AndroidManifest.xml中application节点下添加以下代码(SDK所需Activity与Service注册以及其他数据)

<serviceandroid:name="com.yiju.dolphin_lib.service.MsgService"android:enabled="true"android:exported="true" />
<activityandroid:name="com.yiju.dolphin_lib.pages.activity.SessionActivity"android:exported="true"android:launchMode="singleTask"android:screenOrientation="portrait"android:theme="@style/Lib_MainActivityTheme"android:windowSoftInputMode="adjustResize|stateHidden" />
<activityandroid:name="com.yiju.dolphin_lib.pages.activity.MediaActivity"android:launchMode="singleTop"android:theme="@style/Lib_MediaActivityTheme" />
<activityandroid:name="com.yiju.common.crop.CropImageActivity"android:theme="@style/Theme.MaterialComponents.Light.NoActionBar" />
<!-- 添加使用Apache HTTP client库,兼容安卓P -->
<uses-libraryandroid:name="org.apache.http.legacy"android:required="false" />
<providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.android7.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

4.兼容安卓7.0以上uri权限的配置

主module下res目录下添加xml目录,再在xml目录里新增file_paths.xml文件,里面代码如下

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><root-path name="root" path="." /><!--配置root-path。这样子可以读取到sd卡和一些应用分身的目录,在小米6的手机上微信分身有这个crash--><root-path name="root-path" path="" /><files-path name="files" path="." /><files-path name="files-path" path="." /><cache-path name="cache" path="." /><cache-path name="cache-path" path="." /><external-path name="external" path="." /><!--/storage/emulated/0/--><external-path name="external_storage_root" path="." /><!--/storage/emulated/0/Android/data/...--><external-files-path name="external_file_path" path="." /><!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的目录--><external-cache-path name="external_cache_path" path="." />
</paths>

清单文件application节点下添加

<provider>
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.android7.fileprovider"
android:exported="false"
android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

5.为加载图片的第三方框架Glide添加加载超时的相关设置,首先在主module的包路径下(随便哪个地方都行,只需要能被清单文件引用到就行)创建一个继承com.bumptech.glide.module.AppGlideModule的类FlickrGlideModule,代码如下,创建之后复制粘贴即可,复制粘贴后爆红需要重新alt+enter重新导包

**
* 重点:这样的类在一个项目里只能有一个,多余的要删掉,不然会运行时报错
* 此类需要在主module的gradle中导入相关依赖包如
* annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
* 否则会扫描不到注解
*/@GlideModule
public class FlickrGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {super.applyOptions(context, builder);}@Overridepublic void registerComponents(Context context, Glide glide, Registry registry) {OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build();registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));}// 关闭扫描清单文件@Overridepublic boolean isManifestParsingEnabled() {return false;}
}

然后在AndroidManifest.xml中application节点下添加数据如下

<!-- 处理Glide加载链接超时 -->
<meta-data android:name="com.example.dolphin_sdk_demo.FlickrGlideModule" android:value="GlideModule" />

七.如果项目采用了混淆,则还需要在混淆文件(主module下proguard-rules.pro文件)中添加以下混淆代码(因为引用了许多其他第三方库,所以混淆有点多;如果出现警告提示,不用管,因为是警告混淆可能不存在的类路径)

#设置混淆的压缩比率 0 ~ 7
-optimizationpasses 5
#包名不混合大小写
-dontusemixedcaseclassnames
#混淆时是否记录日志
-verbose
#优化  不优化输入的类文件
-dontoptimize
#混淆采用的算法.
-optimizations !code/simplification/arithmetic,!field/,!class/merging/
#忽略警告
-ignorewarnings-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
#避免混淆泛型 如果混淆报错建议关掉
-keepattributes Signature
#保护注解
-keepattributes *Annotation*
-keepattributes EnclosingMethod
# Gson specific classes
-dontwarn com.google.gson.**
-dontwarn sun.misc.**
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.** { *;}
# Application classes that will be serialized/deserialized over Gson
#保留一个完整的包
-keep class com.yiju.dolphin_lib.http.model.** { *; }
-keep class com.yiju.dolphin_lib.http.model.base.** { *; }
-keep class com.yiju.common.retrofit_rx.** { *; }
-keep class com.yiju.common.fragment.** { *; }
##---------------End: proguard configuration for Gson  ----------
-keepattributes *JavascriptInterface*
#所有activity的子类不要去混淆
-keep public class * extends android.app.Fragment
-keep public class * extends android.support.v7.app.FragmentActivity
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
#如果引用了v4或者v7包
-keep public class * extends android.support.v4.**
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.v4.**{*;}
-keep class android.support.v7.**{*;}
-dontwarn android.support.**
-dontwarn android.annotation
-keep class org.apache.http.**{*;}
##混淆前后的映射
-printmapping mapping.txt-keep class android.support.** {*;}
-keep class org.apache.commons.** {*;}
-keep class org.apache.http.** {*;}
-keep class pub.devrel.easypermissions.** {*;}
-keep class retrofit_rx.** {*;}
#所有native的方法不能去混淆.
-keepclasseswithmembernames class * {native <methods>
}
#保持自定义控件类不被混淆
-keepclasseswithmembers class * {public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {public void *(android.view.View);
}
#保持Parcelable不被混淆
-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}
#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;!static !transient <fields>;!private <fields>;!private <methods>;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve();
}
#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}
-keepattributes *Annotation*
-keepclassmembers class ** {@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keep class org.greenrobot.eventbus.** { *; }
#不混淆资源类
-keepclassmembers class **.R$* {public static <fields>;
}-keep class me.yokeyword.fragmentation.** { *; }-dontusemixedcaseclassnames
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-keep public class javax.**
-dontwarn android.support.v4.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}
-keepnames class * implements android.os.Parcelable {public static final ** CREATOR;
}
# Retrofit, OkHttp, Gson
-keepattributes *Annotation*
-keepattributes Signature
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
-dontwarn rx.**
# Retrofit 2.X
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {@retrofit2.http.* <methods>;
}
# OkHttp3
-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {long producerIndex;long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
-dontwarn io.reactivex.**
-keep class io.reactivex.** { *; }
-dontnote rx.internal.util.PlatformDependent
-dontwarn rx.Single
-dontwarn rx.Observable
-keepnames class rx.Single
-keepnames class rx.Observable-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {@butterknife.* <methods>;
}-keep class androidx.** {*;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn androidx.**#处理Glide加载链接超时start
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {**[] $VALUES;public *;
}
-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl
#处理Glide加载链接超时end

八.如果启用了资源压缩,则需要在主module下的res/raw目录下的keep.xml文件(如果没有则创建)内keep属性的值字符串里添加@drawable/lib_emoji_*,与已有的其他需要保留的资源名以英文逗号(千万别是中文逗号)分隔,具体如下

<?xml version="1.0" encoding="utf-8"?>
<resourcesxmlns:tools="http://schemas.android.com/tools"tools:keep="@layout/getui_notification,@drawable/push,@drawable/push_small,@drawable/lib_emoji_*"/>

九.如何使用此SDK如果前面的几点都已完成,那么可以使用下面的代码进行初始化和跳转操作了

//初始化SDK,多次初始化无效,始终以第一次为准
//参数一是上下文context,参数二是你在海豚客服申请的appId
AppSession.init(getApplicationContext(), "你在海豚客服申请的appId");
//跳转到对话窗口页面,参数为当前Activity
AppSession.getInstance().startSessionActivity(MainActivity.this);

十.常见问题

1.如果发现SDK的UI错误或者异常,可能是因为工程主module下的资源文件(布局文件、图片、文字、大小)命名与SDK中重名了,重名即意味着SDK资源被覆盖掉了。

2.如果发现项目从谷歌上导包缓慢,可以在根目录下的grade文件中buildscript内repositories内添加以下代码改为从阿里云镜像获取

maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }

allprojects内repositories内添加

maven { url "https://jitpack.io" }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }

更多在线客服软件设置问题关注公众号海豚应答或点击官方网站www.17j.club了解或联系技术人员解答。

在线客服软件海豚客服安卓SDK如何接入相关推荐

  1. 在线客服软件海豚客服APP接入方法二:IOS篇

    在线客服软件海豚客服支持安卓和IOS应用接入,本篇分享IOS系统APP应用接入方法分享: 选择[系统接入]-[APP]-[新增渠道] 设置[新增渠道–渠道名称–确定],部署配置,复制链接,并由APP开 ...

  2. 在线客服软件海豚客服APP接入方法一:安卓篇

    海豚客服支持安卓和IOS应用接入,本篇主要讲下安卓如何进行接入设置. 首先选择[系统接入]-[APP]-[新增渠道] 设置[新增渠道–渠道名称–确定],部署配置,复制链接,并由APP开发工作人员在AP ...

  3. 商用在线客服软件测试报告

    中国互联网业大多靠借鉴或者直接抄袭国外的模式与亮点,无论是什么东西,肯定是先国外火起来,然后进入国内,亦如ICQ与QQ,google与baidu等.商用在线客服软件也经历了这个过程,经过前期混战,中期 ...

  4. 在线客服软件作为网页版的即时通讯软件的优势

    在线客服软件作为网页版的即时通讯软件的优势 对于企业网络营销而言,在线客服软件相较于其他即时通讯工具有着得天独厚的优势,在线客服软件作为网页版的即时通讯软件,实现了与企业网站的无缝连接,为客户提供便捷 ...

  5. 免费客服软件教你如何做好文章标题

    产品标题是吸引顾客点击最为重要的一点,tt免费客服软件为您指点如何通过文章标题来做好的营销.高昂的推广费用对于中小网站来说遥不可及,做好不花钱的自然搜索就显得尤为重要,标题的设置也将直接影响客户是否可 ...

  6. IT软件行业网欣物业收费客服软件单页宣传资料源文件PSD格式

    IT软件行业网欣物业收费客服软件单页宣传资料源文件PSD格式 链接: https://pan.baidu.com/s/1XQ2luVTRRUkBAT2IzbTVDw 提取码: 7w6k

  7. 客服软件强攻略——改善客户自助服务

    客户自助服务相对容易采用并集成到您现有的客户服务产品中.也就是说,任何自助服务计划都应该经过充分研究,跟踪明确的目标和成功指标,以确保其成功. 有效的自助服务通常可以通过软件工具形成,比如SaleSm ...

  8. 海豚客服系统接入技巧分享:微信端和网页端

    1微信端 1.如何使用微信端原生对话框? 在微信公众平台里设置自定义菜单,设置文字消息,引导客户用原生页面进行问答. 2.公众号接入海豚客服和微信原生客服有什么不同 开通海豚客服账号之后,在第三方客服 ...

  9. 怎么选择在线客服系统sdk供应商?

    在线客服系统sdk有哪些?有什么比较好的第三方在线客服系统sdk是很多企业所关心的问题,这里简单进行解答. 在线客服系统sdk是什么? SDK是指软件开发工具包,在线客服系统SDK顾名思义就是在线客服 ...

最新文章

  1. Webcast.NET Remoting学习笔记(5)使用配置文件
  2. 惊呆了!被公司辞退拿了22万补偿金,原东家称每月涨薪7000,只要退还22万
  3. python调用库函数用ecb模式加密图片_python 实现AES加密解密(ECB模式,配合base64)...
  4. MySQL 聚合函数以及 优先级
  5. 西门子CPU扩展以太网接口的一种解决方案
  6. Flash 声音频谱图一
  7. 应用wps对证件照进行更改颜色,更换只需三步。
  8. 计算机x线成像检查,计算机X线成像(X光机成像)简述
  9. 嵌入式linux保存参数数据
  10. XCode 3 中我的常用快捷键
  11. (初阶版本)扫雷游戏(C语言)娱乐教程
  12. 独立开发者:新手做2D手游该用哪些工具
  13. 通过echarts绘制双十一销量实时统计图表
  14. 下载SAPUI5 SDK
  15. 释放已删除的InnoDB磁盘空间
  16. 西北农林科技大学接口技术设计性实验一——8255并行接口实验
  17. JAD 文件的中文问题
  18. 天佑药品销售管理系统
  19. Java项目:springboot+vue大学生健康档案管理系统
  20. AWS - ElasticSearch服务入门

热门文章

  1. Qt QVector常见使用方法
  2. 谷歌无人车开创者敲钟上市!平台型自动驾驶第一股市值130亿美元
  3. 读书笔记-精准努力-关于爱情的一些建议
  4. electron ant-design-vue 不能用_iPhone 12系列能像iPhone 6S那样用5年吗?|iphone|手机|安卓手机|ios|内存...
  5. JS正则密码校验之:JS正则匹配半角英文符号
  6. 如何让牙齿快速变白?
  7. linux cp命令忽略覆盖,linux cp:Linux怎么取消cp命令覆盖文件提示
  8. linux脚本格式for循环,Linux Shell脚本之for循环
  9. 【LeetCode】636. 函数的独占时间
  10. 【Latex排版】使用Latex 排版过程中的那些一二三问题汇总