Android(9) 环信sdk手动集成(非添加easeui依赖快速集成)

 

@先看看效果是不是自己想要的吧@

准备:参考官方文档,先注册并创建应用

 

(这里再分享一下利用easeui快速集成的方法吧   --->   https://blog.csdn.net/qq_38225558/article/details/80501209

 

第一步:去环信官网下载sdk   -->   http://www.easemob.com/download/im

考虑到开发者需求不一样,在下载的 SDK 中,提供了两个不同的 jar 包:

  • 一个是 libs.av 下带实时语音功能和实时视频功能的 jar 包和 so 文件。
  • 如果你不需要实时语音、实时视频功能,那就直接用 libs.lite 文件夹下的 jar 包及 so 文件。

 

  • doc 文件夹:SDK 相关 API 文档
  • examples 文件夹:ChatDemoUI3.0(Demo,依赖 EaseUI 库)、EaseUI
  • libs.av 文件夹:包含IM和实时音视频功能所需要的 jar 和 so 文件
  • libs.lite 文件夹:无实时语音、实时视频功能的 SDK 包,如果项目中只用到聊天功能,可以把项目里的 jar 和 so 文件替换成此文件夹里的文件

第二步:导入sdk

 

在自行开发的应用中,集成环信聊天需要把 libs 文件夹下的 jar 及 so 文件复制到你的项目的 libs 文件夹相应位置,如果不需要语音和视频通话功能,导入libs.lite下的文件即可

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

这里附加一下:第一步和第二步可以通过gradle远程链接导入

在项目build.gradle文件的allprojects→repositories属性下加入远程库地址

maven { url "https://raw.githubusercontent.com/HyphenateInc/Hyphenate-SDK-Android/master/repository" }

在module的build.gradle文件中添加:

android {
    //use legacy for android 6.0
    useLibrary 'org.apache.http.legacy'
}
dependencies {
    compile 'com.android.support:appcompat-v7:23.4.0'
    //Optional compile for GCM (Google Cloud Messaging).
    compile 'com.google.android.gms:play-services-gcm:9.4.0'
    compile 'com.hyphenate:hyphenate-sdk:3.3.0'
}

如果想使用不包含音视频通话的sdk,用compile 'com.hyphenate:hyphenate-sdk-lite:3.3.0'; 

SDK版本号参考Release Note(http://docs.easemob.com/im/200androidclientintegration/160androidreleasenote)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

第三步:配置工程

在清单文件 AndroidManifest.xml 里加入以下权限,以及写上你注册的 AppKey。

权限配置(实际开发中可能需要更多的权限,可参考环信官方 Demo):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ied.hxchat"
    android:versionCode="100"
    android:versionName="1.0.0">

    <!--=================================环信sdk==================================-->
    <!-- Required -->
    <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" />
    <!--=================================环信sdk==================================-->

    <application
        android:name=".application.HXApplication"      //这里写你自己的 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=".ui.LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ui.MainActivity"></activity>
        <activity android:name=".ui.RegisterActivity"></activity>

        <!--=================================环信sdk==================================-->
        <!-- 设置环信应用的AppKey -->
        <meta-data android:name="EASEMOB_APPKEY"  android:value="Your AppKey" />
        <!-- 声明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>
        <!--=================================环信sdk==================================-->

    </application>

</manifest> 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=".ui.LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ui.MainActivity"></activity>
        <activity android:name=".ui.RegisterActivity"></activity>

        <!--=================================环信sdk==================================-->
        <!-- 设置环信应用的AppKey -->
        <meta-data android:name="EASEMOB_APPKEY"  android:value="Your AppKey" />
        <!-- 声明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>
        <!--=================================环信sdk==================================-->

    </application>

</manifest>

第四步:初始化sdk

要求在 application 的oncreate方法中做初始化,初始化的时候需要传入设置好的 options

package com.ied.hxjicheng.application;

import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageManager;
import android.util.Log;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMOptions;
import java.util.Iterator;
import java.util.List;
import static com.hyphenate.chat.EMClient.TAG;

public class HXApplication extends Application{

    public Context applicationContext;

    @Override
    public void onCreate() {
        super.onCreate();

        applicationContext = this;

        EMOptions options = new EMOptions();
        // 默认添加好友时,是不需要验证的,改成需要验证,改成需要验证,true:自动验证,false,手动验证
        options.setAcceptInvitationAlways(false);
        // 是否自动将消息附件上传到环信服务器,默认为True是使用环信服务器上传下载,如果设为 false,需要开发者自己处理附件消息的上传和下载
        options.setAutoTransferMessageAttachments(true);
        // 是否自动下载附件类消息的缩略图等,默认为 true 这里和上边这个参数相关联
        options.setAutoDownloadThumbnail(true);

        // 获取当前进程 id 并取得进程名
        int pid = android.os.Process.myPid();
        String processAppName = getAppName(pid);
        // 如果APP启用了远程的service,此application:onCreate会被调用2次
        // 为了防止环信SDK被初始化2次,加此判断会保证SDK被初始化1次
        // 默认的APP会在以包名为默认的process name下运行,如果查到的process name不是APP的process name就立即返回

        if (processAppName == null ||!processAppName.equalsIgnoreCase(applicationContext.getPackageName())) {
            Log.e(TAG, "enter the service process!");

            // 则此application::onCreate 是被service 调用的,直接返回
            return;
        }

        //初始化
        EMClient.getInstance().init(applicationContext, options);
        //在做打包混淆时,关闭debug模式,避免消耗不必要的资源  true:开启
        EMClient.getInstance().setDebugMode(true);
    }

    private String getAppName(int pID) {
        String processName = null;
        ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
        List l = am.getRunningAppProcesses();
        Iterator i = l.iterator();
        PackageManager pm = this.getPackageManager();
        while (i.hasNext()) {
            ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next());
            try {
                if (info.pid == pID) {
                    // 根据进程的信息获取当前进程的名字
                    processName = info.processName;
                    // 返回当前进程名
                    return processName;
                }
            } catch (Exception e) {
                // Log.d("Process", "Error>> :"+ e.toString());
            }
        }
        return processName;
    }

}

第五步:登录注册代码

LoginActivity.java:

package com.ied.hxchat.ui;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.hyphenate.EMCallBack;
import com.hyphenate.chat.EMClient;
import com.ied.hxchat.R;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText edtUsername,edtPassword;
    private Button btnLogin;
    private TextView btnRegister;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
    }

    private void initView() {
        edtUsername = (EditText) findViewById(R.id.edt_username);
        edtPassword = (EditText) findViewById(R.id.edt_password);
        btnLogin = (Button) findViewById(R.id.btn_login);
        btnRegister = (TextView) findViewById(R.id.btn_register);

        btnLogin.setOnClickListener(this);
        btnRegister.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        String username = edtUsername.getText().toString().trim();
        String password = edtPassword.getText().toString().trim();

        switch (v.getId()) {
            case R.id.btn_login:
                if (TextUtils.isEmpty(username)) {
                    Toast.makeText(getApplicationContext(), "请输入用户名", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.isEmpty(password)) {
                    Toast.makeText(getApplicationContext(), "请输入密码", Toast.LENGTH_SHORT).show();
                } else {
                    EMClient.getInstance().login(username,password,new EMCallBack() {//回调
                        @Override
                        public void onSuccess() {
                            runOnUiThread(new Runnable() {
                                public void run() {
                                    //登录成功后需要调用EMClient.getInstance().chatManager().loadAllConversations(); 和EMClient.getInstance().groupManager().loadAllGroups();
                                    EMClient.getInstance().chatManager().loadAllConversations();
                                    EMClient.getInstance().groupManager().loadAllGroups();
                                    //以上两个方法是为了保证进入主页面后本地会话和群组都 load 完毕。
                                    Log.d("main", "登录聊天服务器成功!");
                                    Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
                                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
                                }
                            });
                        }

                        @Override
                        public void onProgress(int progress, String status) {

                        }

                        @Override
                        public void onError(int code, String message) {
                            if (code == -1005) {
                                message = "用户名或密码错误";
                            }
                            final String msg = message;
                            runOnUiThread(new Runnable() {
                                public void run() {
                                    Log.d("main", "登陆聊天服务器失败!");
                                    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    });

                }
                break;
            case R.id.btn_register:
                startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
                break;
        }
    }
}

RegisterActivity.java:

package com.ied.hxchat.ui;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.easemob.EMError;
import com.easemob.chat.EMChatManager;
import com.easemob.exceptions.EaseMobException;
import com.ied.hxchat.R;

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {

    private ImageView ivBack;
    private EditText edtUsername,edtPassword;
    private Button btnRegister;

    private Handler mHandler;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case 1000:
                        Toast.makeText(getApplicationContext(), "注册成功",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case 1001:
                        Toast.makeText(getApplicationContext(), "网络异常,请检查网络!",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case 1002:
                        Toast.makeText(getApplicationContext(), "用户已存在!",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case 1003:
                        Toast.makeText(getApplicationContext(), "注册失败,无权限",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case 1004:
                        Toast.makeText(getApplicationContext(),
                                "注册失败: " + (String) msg.obj, Toast.LENGTH_SHORT)
                                .show();
                        break;

                    default:
                        break;
                }
            };
        };

        initView();
    }

    private void initView() {
        ivBack = (ImageView) findViewById(R.id.iv_back);
        edtUsername = (EditText) findViewById(R.id.edt_username);
        edtPassword = (EditText) findViewById(R.id.edt_password);
        btnRegister = (Button) findViewById(R.id.btn_register);

        btnRegister.setOnClickListener(this);
        ivBack.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        final String username = edtUsername.getText().toString().trim();
        final String password = edtPassword.getText().toString().trim();

        switch (v.getId()) {
            case R.id.btn_register:
                if (TextUtils.isEmpty(username)) {
                    Toast.makeText(getApplicationContext(), "请输入用户名",
                            Toast.LENGTH_SHORT).show();
                } else if (TextUtils.isEmpty(password)) {
                    Toast.makeText(getApplicationContext(), "请输入密码",
                            Toast.LENGTH_SHORT).show();
                } else {
                    new Thread(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            try {
                                // 调用sdk注册方法
                                EMChatManager.getInstance()
                                        .createAccountOnServer(username,
                                                password);
                                mHandler.sendEmptyMessage(1000);
                            } catch (final EaseMobException e) {
                                // 注册失败
                                Log.i("TAG", "getErrorCode:" + e.getErrorCode());
                                int errorCode = e.getErrorCode();
                                if (errorCode == EMError.NONETWORK_ERROR) {
                                    mHandler.sendEmptyMessage(1001);
                                } else if (errorCode == EMError.USER_ALREADY_EXISTS) {
                                    mHandler.sendEmptyMessage(1002);
                                } else if (errorCode == EMError.UNAUTHORIZED) {
                                    mHandler.sendEmptyMessage(1003);
                                } else {
                                    Message msg = Message.obtain();
                                    msg.what = 1004;
                                    msg.obj = e.getMessage();
                                    mHandler.sendMessage(msg);
                                }
                            }
                        }
                    }).start();
                }
                break;
            case R.id.iv_back:
                finish();
                break;
        }
    }
}

最后提示一下,这个只是很简单的集成,后面要参考环信官网调用安全退出登录的方法等,否则会出现用户已登陆的情况。

点击下载源码  密码:ywas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值