Android Studio最新版环信SDK集成实例
Android Studio最新版环信SDK完美集成实例(重要)
Android Studio最新版环信SDK完美集成实例
tags:环信集成
1 前言
最近看到有人在找android集成环信SDK的问题,我将最新版的环信SDK和最新的android进行了集成,最多的总是因为尽管最新的easeui还是采用的V4包。而现在新版的Androi Studio新版已经不在使用V4,V7这些包,统一采用了一个叫作 'androidx.appcompat:appcompat:1.1.0’的包。需要在集成过程中修改easeui的各种依赖关系。
现详细记录如下:
2 开发环境
2.1 Android Studio
Android Studio版本:3.5.2 查看地方:build.gradle(prouect:你的工程名称)如果你的Android Studio是新新版本的,新建的工程在build.gradle(prouect:你的工程名称)中的以下代码都是正常的。和你的Android Studio一样。
本人在中文社区下载的,版本是:
android-studio-ide-191.5977832-windows.exe这个版本
dependencies { classpath 'com.android.tools.build:gradle:3.5.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
2.2 环信SDK版本:
版本 V3.7.1 直接从官网下载的最新版本。
3 集成过程
3.1 新一个工程
工程名称ImDemo,按一般新建一个空Activity的工程进行新建。
3.2 修Activity继承
主要修改继承,由这个代码public class MainActivity extends AppCompatActivity改为public class MainActivity extends Activity,修改后的代码为:
package cn.plczl.imdoem; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
3.3 导入easeUI SDK
采用Android Studio的File–>Import Module…方式导入easeUI。如下图:
注意不要导入simpledemo !
在Impor Module from Source界面根据你选择导入的文件,可能会出现以下两个结果;如果出现第二个图,将simpledemo后的Import钩去掉。
3.4 修改build.gradle(Module:easeui)文件
修改build.gradle(Module:easeui)文件中的版本与build.gradle(Module:app)一致,比如最新下载的build.gradle(Module:easeui)中版本号是28,28.0.3等。修改为我我的最新版的Android的版本号是29,29.0.3等。反正就是这两个文件的各compileSdkVersion、buildToolsVersion版本修改为一样的。
android { compileSdkVersion 28 buildToolsVersion '28.0.3' defaultConfig { minSdkVersion 16 targetSdkVersion 28 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
改为与app的build.gradle(Module:app)
android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "cn.plczl.im" minSdkVersion 19 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }
修改好后进行同步。
3.5 修改工程清单文件修改
- 一是在工程清单文件中加入必要的权限,该权限在环信管网上有详细说明,
- 二是在工程清单文件中加入环信的应用的AppKey和SDK所需的service SDK核心功能所需配置,这个也在环信官网的Android SDK 介绍及导入中有详细介绍,地址为:http://docs-im.easemob.com/im/android/sdk/import
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:andro package="cn.plczl.imdoem"> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 设置环信应用的AppKey --> <meta-data android:name="EASEMOB_APPKEY" android:value="XXXXXXXXXX" /> <!-- 声明SDK所需的service SDK核心功能--> <service android:name="com.hyphenate.chat.EMChatService" android:exported="true"/> <service android:name="com.hyphenate.chat.EMJobService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" /> <!-- 声明SDK所需的receiver --> <receiver android:name="com.hyphenate.chat.EMMonitorReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package"/> </intent-filter> <!-- 可选filter --> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.USER_PRESENT" /> </intent-filter> </receiver> </application> </manifest>
3.6 新建一个IMApplication类,用于初始化
package cn.plczl.imdoem; import android.app.Application; import com.hyphenate.chat.EMOptions; import com.hyphenate.easeui.EaseUI; public class IMApplication extends Application { @Override public void onCreate() { super.onCreate(); //初始化EaseUI EMOptions options=new EMOptions(); options.setAcceptInvitationAlways(false); options.setAutoAcceptGroupInvitation(false); EaseUI.getInstance().init(this,options); } }
3.7 将IMApplication配置到清单文件中
将3.6步中新建的IMApplication类,写入清单文件AndroidManifest中:android:name=".IMApplication"
<application android:name=".IMApplication" android:allowBackup="true"
4 重点(处理错误信息)
目前可以点编译,看错误信息进行处理,第一次编译出现如下错误。
处理步骤如下,大概有11个文件需要修改。
4.1esceui升级V4包。
上点右键–>Refactor–>Migate to AndroidX
去掉钩不用备份,后点Migate
点击Do Refactor,这样处理就将原来使用的V4包升级到最新的AndroidX。在build.gradle(Module:app)可以看到。原来的V4包变为了最新的api 'androidx.appcompat:appcompat:1.0.0’包。
4.2 代码修改。
这次主要处理升级V4后需要改一些代码。每修改一处点击一下编译按纽,会自动跳到下一个需要修改处,你的顺序和我可能不一致,但应将所有的错误进行修改,主要是升级V4包后所有的import文件作相应的修改,所有继承也要改到AndroidX下来。
4.2.1 EaseBaseActivity
定位到这个文件EaseBaseActivity:
在public class EaseBaseActivity extends FragmentActivity这点command+enter(mac系统,windows系统是Ctrl+enter)选择报错的import v4下的class,把它删掉,再import androidx.core.app.FragmentActivity;(注意是先删除报错的v4包,在导入androidx包下的)
继续点编译
4.2.2 EaseBaseFragment
EaseBaseFragment文件,
public abstract class EaseBaseFragment extends Fragment点command+enter(mac系统,windows系统是Ctrl+enter)选择报错的import v4下的class,删除这行代码,再import androidx.core.app.Fragment;
继续点编译
4.2.3 EaseChatFragment
EaseChatFragment
第112行代码protected SwipeRefreshLayout swipeRefreshLayout;红色上点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
删除以下两行代码
mport androidx.core.widget.SwipeRefreshLayout;
import androidx.core.widget.SwipeRefreshLayout.OnRefreshListener;
第228行代码:swipeRefreshLayout = messageList.getSwipeRefreshLayout();
如上图有红波浪线,光标在上点点command+enter(mac系统,windows系统是Ctrl+enter)选择选择第3行加车
第484行swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()红色上点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
4.2.4 EaseChatMessageList
EaseChatMessageList
删掉第5行代码:import androidx.core.widget.SwipeRefreshLayout;
4.2.5 EaseDingMessageHelper
删掉5,6行代码:
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.Nullable;
4.2.6 EaseImageView
第78行代码的public class EaseImageView extends android.support.v7.widget.AppCompatImageView
改为public class EaseImageView extends AppCompatImageView
系统会自动导入import androidx.appcompat.widget.AppCompatImageView;这个包含文件。
4.2.7 EaseEmojiconPagerView
public class EaseEmojiconPagerView extends ViewPager点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
删除7,8行代码:
import androidx.core.view.PagerAdapter;
import androidx.core.view.ViewPager;
第29行代码private PagerAdapter pagerAdapter;点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
第76行代码:pagerAdapter = new EmojiconPagerAdapter(viewpages);光标放在pagerAdapter上红波浪线的代码上点command+enter(mac系统,windows系统是Ctrl+enter)选择第二行回车,
4.2.8 EmojiconPagerAdapter
public class EmojiconPagerAdapter extends PagerAdapter 点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
第30行代码((ViewPager) arg0).addView(views.get(arg1));点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
4.2.9 EaseExpressionPagerAdapter
public class EaseExpressionPagerAdapter extends PagerAdapter 点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
删除上面报红的包含文件。
4.2.10 EaseImageCache
cache = new LruCache<string, bitmap="">((int) (Runtime.ge点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
删除上面报红的包含文件。
4.2.11 EaseDingMessageHelper
第82行 public void setUserUpdateListener(EMMessage msg, @Nullable IAckUserUpdateListener listener)红字上点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
4.2.12 EaseImageView
第56行红字上点点command+enter(mac系统,windows系统是Ctrl+enter)选择import class,
5 编译通过
经过以上的代码修改,所有文件均无告警和错误后编译应该通过。然后点击支行按纽看效果,发现点击运行后报如果错误。
5.1 --min-api 24错误
文件修改完毕后再次编译,报Default interface methods are only supported starting with Android N (–min-api 24): void com.hyphenate.EMConferenceListener.onAttributesUpdated(com.hyphenate.chat.EMConferenceAttribute[])错误。
5.2 处理办法
处理方法是在build.gradle(Module:app)文件的android分支中下插出以下三行代码并同步。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
5.3 完整的build.gradle(Module:app)文件
插入后完整的build.gradle(Module:app)文件如下
apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "cn.plczl.imdoem" minSdkVersion 19 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation project(path: ':easeui') }
编译运行
点击运行。完美无错误,无告警的运行起来了。