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

 編譯運行

點擊運行。完美無錯誤,無告警的運行起來了。

 

 本人倉庫地址供參考:https://gitee.com/xieh-gitee/TuTuIM

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM