首先需要去网易云信注册账号:
https://app.yunxin.163.com/index?clueFrom=nim&from=nim#/create
账号注册成功后去新建项目拿到集成需要的APPKEY,因为公司项目暂未支持AndroidX,所以直接从网易云信的github官网直接下载未集成AndroidX的UiKit项目。
首先需要在Android的AndroidManifest内添加集成所需的配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.netease.nim.demo">

    <!-- 权限声明 -->
    <!-- 访问网络状态-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <!-- 外置存储存取权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!-- 多媒体相关 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <!-- 控制呼吸灯,振动器等,用于新消息提醒 -->
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <!-- 8.0+系统需要-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />


    <!-- 下面的 uses-permission 一起加入到你的 AndroidManifest 文件中。 -->
    <permission
        android:name="com.netease.nim.demo.permission.RECEIVE_MSG"
        android:protectionLevel="signature"/>

     <uses-permission android:name="com.netease.nim.demo.permission.RECEIVE_MSG"/>

    <application
        ...>
        <!-- APP key, 可以在这里设置,也可以在 SDKOptions 中提供。
            如果 SDKOptions 中提供了,则取 SDKOptions 中的值。 -->
        <meta-data
            android:name="com.netease.nim.appKey"
            android:value="key_of_your_app" />

        <!-- 云信后台服务,请使用独立进程。 -->
        <service
            android:name="com.netease.nimlib.service.NimService"
            android:process=":core"/>

       <!-- 云信后台辅助服务 -->
        <service
            android:name="com.netease.nimlib.service.NimService$Aux"
            android:process=":core"/>

        <!-- 云信后台辅助服务 -->
        <service
            android:name="com.netease.nimlib.job.NIMJobService"
            android:exported="true"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":core"/>

        <!-- 云信监视系统启动和网络变化的广播接收器,保持和 NimService 同一进程 -->
        <receiver android:name="com.netease.nimlib.service.NimReceiver"
            android:process=":core"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

        <!-- 云信进程间通信 Receiver -->
        <receiver android:name="com.netease.nimlib.service.ResponseReceiver"/>

        <!-- 云信进程间通信service -->
        <service android:name="com.netease.nimlib.service.ResponseService"/>

        <!-- 云信进程间通信provider -->
        <provider
            android:name="com.netease.nimlib.ipc.NIMContentProvider"
            android:authorities="com.netease.nim.demo.ipc.provider"
            android:exported="false"
            android:process=":core" />

          <!-- 云信内部使用的进程间通信provider -->
          <!-- SDK启动时会强制检测该组件的声明是否配置正确,如果检测到该声明不正确,SDK会主动抛出异常引发崩溃 -->
        <provider
            android:name="com.netease.nimlib.ipc.cp.provider.PreferenceContentProvider"
            android:authorities="com.netease.nim.demo.ipc.provider.preference"
            android:exported="false" />
    </application>
</manifest>

网易云信官方的UiKit内已经包含了6.7.0的SDK,所以我这边直接将官方的UiKit以module的形式导入到我的项目就可以正常使用。
引入方式参考:

https://blog.csdn.net/u013023845/article/details/85160792

将UiKit导入至项目后就可以在自己项目的Application配置网易云信相关的内容:

  /**初始化 网易云信SDK
         * SDK 的初始化方法必须在 Application onCreate 中,并且不能对初始化语句添加进程判断逻辑。
         */
        NIMClient.init(this, loginInfo(), options());
        if (NIMUtil.isMainProcess(this)) { //判断主线程与否
            initUIKit(); //初始化UI
        }
        /**
         * 聊天界面长按聊天信息报错解决
         */
        //消息转发过滤器
        NimUIKit.setMsgForwardFilter(new MsgForwardFilter() {
            @Override
            public boolean shouldIgnore(IMMessage message) {
                return false;
            }
        });
        //消息撤回过滤器
        NimUIKit.setMsgRevokeFilter(new MsgRevokeFilter() {
            @Override
            public boolean shouldIgnore(IMMessage message) {
                return false;
            }
        });
    /**
     * 网易云信自动登录,登录信息从本地存储的SP内取出
     * @return
     */
    public static LoginInfo loginInfo() {
        String userId = SPUtils.getString(Constants.ACCID,"");
        String token = SPUtils.getString(Constants.ACCTOKEN,"");
        // 从本地读取上次登录成功时保存的用户登录信息
        if (TextUtils.isEmpty(userId) || TextUtils.isEmpty(token)) {
            Log.i("TAG", "IM登录UserId:"+userId+"IM登录token:"+token);
            return null;
        }

        return new LoginInfo(userId, token);
    }
private void initUIKit() {
        //UI组件初始化
        NimUIKit.init(this, buildUIKitOptions());

        //初始化通知消息
        NIMClient.toggleNotification(true);
    }
    private UIKitOptions buildUIKitOptions() {
        UIKitOptions options = new UIKitOptions();
        // 设置app图片/音频/日志等缓存目录
        options.appCacheDir = getAppCacheDir(this) + "/app";
        options.initAsync = true; //是否使用异步方式初始化UIKit
        return options;
    }
    /**
     * 配置 APP 保存图片/语音/文件/log等数据的目录
     * 这里示例用SD卡的应用扩展存储目录
     */
    public static String getAppCacheDir(Context context) {
        String storageRootPath = null;
        try {
            // SD卡应用扩展存储区(APP卸载后,该目录下被清除,用户也可以在设置界面中手动清除),请根据APP对数据缓存的重要性及生命周期来决定是否采用此缓存目录.
            // 该存储区在API 19以上不需要写权限,即可配置 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
            if (context.getExternalCacheDir() != null) {
                storageRootPath = context.getExternalCacheDir().getCanonicalPath();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (TextUtils.isEmpty(storageRootPath)) {
            // SD卡应用公共存储区(APP卸载后,该目录不会被清除,下载安装APP后,缓存数据依然可以被加载。SDK默认使用此目录),该存储区域需要写权限!
            storageRootPath = Environment.getExternalStorageDirectory() + "/" + App.context.getPackageName(); //DemoCache.getContext()
        }

        return storageRootPath;
    }
    private SDKOptions options() {
        SDKOptions options = new SDKOptions();
        // 配置保存图片,文件,log 等数据的目录
        // 如果 options 中没有设置这个值,SDK 会使用采用默认路径作为 SDK 的数据目录。
        // 该目录目前包含 log, file, image, audio, video, thumb 这6个目录。
//        String sdkPath = getAppCacheDir(context) + "/nim"; // 可以不设置,那么将采用默认路径
        // 如果第三方 APP 需要缓存清理功能, 清理这个目录下面个子目录的内容即可。
//        options.sdkStorageRootPath = sdkPath;

        // 配置是否需要预下载附件缩略图,默认为 true
        options.preloadAttach = true;

        // 配置附件缩略图的尺寸大小。表示向服务器请求缩略图文件的大小
        // 该值一般应根据屏幕尺寸来确定, 默认值为 Screen.width / 2
//        options.thumbnailSize = {Screen.width} / 2;

        // 用户资料提供者, 目前主要用于提供用户资料,用于新消息通知栏中显示消息来源的头像和昵称
        options.userInfoProvider = new UserInfoProvider() {
            @Override
            public UserInfo getUserInfo(String s) {
                return null;
            }

            @Override
            public String getDisplayNameForMessageNotifier(String s, String s1, SessionTypeEnum sessionTypeEnum) {
                return null;
            }

            @Override
            public Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionTypeEnum, String s) {
                return null;
            }
        };
        return options;
    }

至此,配置完成。

我们的项目只需要接入简单的单聊及群聊,所以直接从UiKit内直接调用,没有做任何修改,有需要的朋友可以查看源码自行修改。我这边为了方便调用,抽了一个公共类用来登陆登出,大家可以参考一下。

@SuppressWarnings("unchecked")
public class NeteaseLoginManager {
    static String TAG = "LoginManger-----";
    static boolean loginFlag = false;
    public static LoginInfo loginInfo() {
        String userId = SPUtils.getString(Constants.ACCID,"");
        String token = SPUtils.getString(Constants.ACCTOKEN,"");
        // 从本地读取上次登录成功时保存的用户登录信息
        if (TextUtils.isEmpty(userId) || TextUtils.isEmpty(token)) {
            Log.i(TAG, "IM登录UserId:"+userId+"IM登录token:"+token);
            return null;
        }

        return new LoginInfo(userId, token);
    }
    public static boolean initIMConfig(Context context) {
        final boolean[] isLogin = {false};
        NimUIKit.login(loginInfo(), new RequestCallback<LoginInfo>() {
            @Override
            public void onSuccess(LoginInfo param) {
                //登录成功后在此处调用 IM 的成功回调,传入account,之后 NimUIKit.getAccount() 才会有值,与初始化传入无关
                NimUIKit.loginSuccess(param.getAccount());
                NimUIKitImpl.setAccount(param.getAccount()); //初始化 账户...
                isLogin[0] = true;
            }

            @Override
            public void onFailed(int code) {
                if (code == 302 || code == 404) {
                    Toast.makeText(context, "无效的账户or密码", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "列表初始化失败:"+code, Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onException(Throwable exception) {
                Log.e(TAG, "无效token,请退出稍后重试!!!" );
            }
        });
        return isLogin[0];
    }

    /*登出*/
    public static void loginOut() {
        NIMClient.getService(AuthService.class).logout();
        Log.i(TAG, "loginOut: "+"登出成功");
    }
}

因为我这边登陆调起是直接读取本地SP存储信息进行登陆,所以如果使用此公共类,请在本地信息存储完之后进行调用。

登入登出:

							//网易云信登录
                            NeteaseLoginManager.initIMConfig(LoginActivity.this);
                            //退出网易云信
                			NeteaseLoginManager.loginOut();

调起单聊:

  					//判断登陆状态
                if (TextUtils.isEmpty(NimUIKit.getAccount())) {
                    if (NeteaseLoginManager.initIMConfig(getContext())) {
                        NimUIKit.startP2PSession(getActivity(), accid,null);
                    }
                }else {
                    // 打开单聊界面
                    NimUIKit.startP2PSession(getActivity(), accid,null);
                }
            }

创建群聊并进入:

				//判断用户是否选择
				if (accidList != null && accidList.size() != 0) {
					//判断登陆状态
                    if (TextUtils.isEmpty(NimUIKit.getAccount())) {
                        if (NimLoginManager.initIMConfig(NewGroupChatActivity.this)) {
                            // 打开群聊界面
                            TeamCreateHelper.createNormalTeam(NewGroupChatActivity.this, accidList, false, null);
                            finish();
                        }
                    }else {
                        // 打开群聊界面
                        TeamCreateHelper.createNormalTeam(NewGroupChatActivity.this, accidList, false, null);
                        finish();
                    }
                } else {
                    ToastHelper.showToast(NewGroupChatActivity.this, "请选择至少一个联系人!");
                }
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐