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:android="http://schemas.android.com/apk/res/android" 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') }
編譯運行
點擊運行。完美無錯誤,無告警的運行起來了。