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的工程进行新建。
Android Studio最新版环信SDK集成实例

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。如下图:
Android Studio最新版环信SDK集成实例
 
注意不要导入simpledemo !
 
在Impor Module from Source界面根据你选择导入的文件,可能会出现以下两个结果;如果出现第二个图,将simpledemo后的Import钩去掉。
Android Studio最新版环信SDK集成实例
 
Android Studio最新版环信SDK集成实例
 

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 重点(处理错误信息)

目前可以点编译,看错误信息进行处理,第一次编译出现如下错误。
Android Studio最新版环信SDK集成实例

 处理步骤如下,大概有11个文件需要修改。

 

4.1esceui升级V4包。

上点右键–>Refactor–>Migate to AndroidX
Android Studio最新版环信SDK集成实例

去掉钩不用备份,后点Migate

Android Studio最新版环信SDK集成实例

 点击Do Refactor,这样处理就将原来使用的V4包升级到最新的AndroidX。在build.gradle(Module:app)可以看到。原来的V4包变为了最新的api 'androidx.appcompat:appcompat:1.0.0’包。

Android Studio最新版环信SDK集成实例

4.2 代码修改。

这次主要处理升级V4后需要改一些代码。每修改一处点击一下编译按纽,会自动跳到下一个需要修改处,你的顺序和我可能不一致,但应将所有的错误进行修改,主要是升级V4包后所有的import文件作相应的修改,所有继承也要改到AndroidX下来。
 
4.2.1 EaseBaseActivity
Android Studio最新版环信SDK集成实例

 定位到这个文件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

Android Studio最新版环信SDK集成实例

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

Android Studio最新版环信SDK集成实例

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();
Android Studio最新版环信SDK集成实例
如上图有红波浪线,光标在上点点command+enter(mac系统,windows系统是Ctrl+enter)选择选择第3行加车
 Android Studio最新版环信SDK集成实例
第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[])错误。
Android Studio最新版环信SDK集成实例
 

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')
}

 编译运行

点击运行。完美无错误,无告警的运行起来了。
Android Studio最新版环信SDK集成实例

 本人仓库地址供参考:https://gitee.com/xieh-gitee/TuTuIM