Code Monkey home page Code Monkey logo

open-im-sdk-android's Introduction

Android Client SDK for OpenIM 👨‍💻💬

Use this SDK to add instant messaging capabilities to your Android app. By connecting to a self-hosted OpenIM server, you can quickly integrate instant messaging capabilities into your app with just a few lines of code.

The underlying SDK core is implemented in OpenIM SDK Core. Using gomobile, it can be compiled into an AAR file for Android integration. Android interacts with the OpenIM SDK Core through JSON, and the SDK exposes a re-encapsulated API for easy usage. In terms of data storage, Android utilizes the SQLite layer provided internally by the OpenIM SDK Core.

Documentation 📚

Visit https://doc.rentsoft.cn/ for detailed documentation and guides.

For the SDK reference, see https://doc.rentsoft.cn/sdks/quickstart/android.

Installation 💻

Adding repositories

   maven { url 'https://open-im-online.rentsoft.cn:51000/repository/maven2/' }

Adding Dependencies

   implementation 'io.openim:android-sdk:3.4.1@aar'
   implementation 'io.openim:core-sdk:3.4.1-alpha.4@aar'
   implementation 'com.google.code.gson:gson:2.9.0'

Usage 🚀

The following examples demonstrate how to use the SDK.

Importing the SDK and initialize

package io.openim.android.sdk;

Initialize

  InitConfig initConfig = new InitConfig("Your IM server address",
            "Your IM server socket address", getStorageDir()); //Storage path
        initConfig.isLogStandardOutput = true;

        ///IM 初始化
        OpenIMClient.getInstance().initSDK('Your Application',
            initConfig, IMEvent.getInstance().connListener);

Logging In and Listening for Connection Status

Note1: You need to set up the listeners first and then log in.

// Set listener
 //User Profile Change Listener
 OpenIMClient.getInstance().userInfoManager.setOnUserListener(new OnUserListener() { });
 //Message-related Listener
 OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {});
 //Friendship Status Change Listener
 OpenIMClient.getInstance().friendshipManager.setOnFriendshipListener(new OnFriendshipListener() {});
 //Conversation-related Listener
 OpenIMClient.getInstance().conversationManager.setOnConversationListener(new OnConversationListener() {});
 //Group-related Listener
 OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { });

// Retrieve the profile of the currently logged-in user
 OpenIMClient.getInstance().login(new OnBase<String>() {
                            @Override
                            public void onError(int code, String error) {
                                IView.err(error);
                            }

                            @Override
                            public void onSuccess(String data) {
                                //Cache login information and start a delightful chat
                   
                            }
                        }, userID, token);

To log into the IM server, you need to create an account and obtain a user ID and token. Refer to the access token documentation for details.

Receiving and Sending Messages 💬

OpenIM makes it easy to send and receive messages. By default, there is no restriction on having a friend relationship to send messages (although you can configure other policies on the server). If you know the user ID of the recipient, you can conveniently send a message to them.

//Send
Message  msg = OpenIMClient.getInstance().messageManager.createTextMessage("hello openim");
OpenIMClient.getInstance().messageManager.sendMessage(new OnMsgSendCallback() {
            @Override
            public void onError(int code, String error) {
             // Failed to send message ❌
            }

            @Override
            public void onProgress(long progress) {
             //Sending...
            }

            @Override
            public void onSuccess(Message message) {
             // Message sent successfully ✉️	

            }
        }, msg, userID, groupID, null);


//Receive
OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener(){
  @Override
            public void onRecvNewMessage(Message msg) {
                // Received new message 📨
            }
})

Examples 🌟

You can find a demo Android app that uses the SDK in the open-im-android-demo repository.

Community 👥

Community Meetings 📆

We want anyone to get involved in our community and contributing code, we offer gifts and rewards, and we welcome you to join us every Thursday night.

Our conference is in the OpenIM Slack 🎯, then you can search the Open-IM-Server pipeline to join

We take notes of each biweekly meeting in GitHub discussions, Our historical meeting notes, as well as replays of the meetings are available at Google Docs 📑.

Who are using OpenIM 👀

Check out our user case studies page for a list of the project users. Don't hesitate to leave a 📝comment and share your use case.

License 📄

OpenIM is licensed under the Apache 2.0 license. See LICENSE for the full license text.

open-im-sdk-android's People

Contributors

alvince avatar hrxiang avatar oliver-wj avatar rockyoung avatar skiffer-git avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

open-im-sdk-android's Issues

Can OpenIMClient.getInstance().messageManager.setAdvancedMsgListener and related callbacks only be set once?

在classA里initSDK--设置回调监听---login登录(正常)-----logout登出---在新的实列类classB里initSDK--设置回调监听---login登录:此时回调里的类是第一次设置的classA导致部分监听回调异常,通过给ClassA和ClassB的tag对比发现,在退出登录后在新的实例里重新执行相关initSDK--设置回调监听---login登录流程时,回调里的数据是异常,登录及初始化等其它正常。如果说和Open_im_sdk或只能初始化一次的问题然后sdk里并没有uninit_sdk

The login returns a 702 error.

image

1646293867(1)

获取的uid和token 16603404600_________________eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVSUQiOiIxNjYwMzQwNDYwMCIsIlBsYXRmb3JtIjoiTGludXgiLCJleHAiOjE2NDY4MTk5NzIsIm5iZiI6MTY0NjIxNTE3MiwiaWF0IjoxNjQ2MjE1MTcyfQ.eXYBKXN8cOZ2z3UuWboRLGlsSdTdpoJkUCfQrOVpviE

登录返回的错误信息
702_________________operationID[1646293913360], info[==> open_im_sdk/internal/login.CheckToken()@256: GetSelfUserInfoFromSvr failed 1646293913360: ==> open_im_sdk/internal/user.(*User).GetSelfUserInfoFromSvr()@141: 1646293913360: ==> open_im_sdk/pkg/common.CheckErrAndResp()@79: api resp failed: ==> open_im_sdk/pkg/network.Post2Api()@42: post: ==> open_im_sdk/pkg/network.postLogic()@70: status code failed http://122.9.124.193:10000/user/get_self_user_info: 404 Not Found]

After clicking to send a message, the server responds, but the response cannot be parsed. I hope you can check to see where the issue lies.

package io.openim.example;

import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import java.util.List;

import io.openim.android.sdk.OpenIMClient;
import io.openim.android.sdk.listener.InitSDKListener;
import io.openim.android.sdk.listener.OnAdvanceMsgListener;
import io.openim.android.sdk.listener.OnBase;
import io.openim.android.sdk.listener.OnConversationListener;
import io.openim.android.sdk.listener.OnFriendshipListener;
import io.openim.android.sdk.listener.OnGroupListener;
import io.openim.android.sdk.listener.OnMsgSendCallback;
import io.openim.android.sdk.manager.MessageManager;
import io.openim.android.sdk.models.ConversationInfo;
import io.openim.android.sdk.models.GroupInfo;
import io.openim.android.sdk.models.GroupMembersInfo;
import io.openim.android.sdk.models.HaveReadInfo;
import io.openim.android.sdk.models.Message;
import io.openim.android.sdk.models.UserInfo;
import io.openim.android.sdk.utils.JsonUtil;

public class MainActivity extends AppCompatActivity implements InitSDKListener, OnAdvanceMsgListener, OnConversationListener, OnFriendshipListener,
OnGroupListener {

/// api地址
final static String IP_API = "http://192.168.2.129:10800";
/// websocket地址
final static String IP_WS = "ws://192.168.2.129:10800";
Message msg ;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    String path = getExternalCacheDir().getAbsolutePath();
    OpenIMClient client = OpenIMClient.getInstance();
    client.initSDK(IP_API, IP_WS, path, this);
    msg =  client.messageManager.createTextMessage("hello world");
    msg.setSendID("3569842");
    msg.setPlatformID(2);
    msg.setRecvID("36429543");
    msg.setClientMsgID("sadd");
    msg.setSessionType(1);
    msg.setSenderNickName("asdads");
    System.out.println("=======send=================" + JsonUtil.toString(msg));

    client.messageManager.sendMessage(new OnMsgSendCallback() {
        @Override
        public void onError(long code, String error) {

        }

        @Override
        public void onProgress(long progress) {

        }

        @Override
        public void onSuccess(String s) {

        }
    }, msg, "36429530", "", false);
    client.messageManager.addAdvancedMsgListener(this);
    client.groupManager.setOnGroupListener(this);
    client.conversationManager.setOnConversationListener(this);
    client.friendshipManager.setOnFriendshipListener(this);
    // uid: 13918588195, token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
}


@Override
public void onConnectFailed(long code, String error) {
    System.out.println("=======onConnectFailed=================");
}

@Override
public void onConnectSuccess() {
    System.out.println("===========onConnectSuccess=============");
}

@Override
public void onConnecting() {
    System.out.println("==========onConnecting==============");
}

@Override
public void onKickedOffline() {
    System.out.println("==========onKickedOffline==============");
}

@Override
public void onSelfInfoUpdated(UserInfo info) {
    System.out.println("==========onSelfInfoUpdated==============");
}

@Override
public void onUserTokenExpired() {
    System.out.println("=========onUserTokenExpired===============");
}

@Override
public void onRecvNewMessage(Message msg) {

    System.out.println("=========onRecvNewMessage===============");
}

@Override
public void onRecvC2CReadReceipt(List<HaveReadInfo> list) {
    System.out.println("========onRecvC2CReadReceipt================");
}

@Override
public void onRecvMessageRevoked(String msgId) {
    System.out.println("=======onRecvMessageRevoked=================");
}

@Override
public void onConversationChanged(List<ConversationInfo> list) {
    System.out.println("========onConversationChanged================");
}

@Override
public void onNewConversation(List<ConversationInfo> list) {
    System.out.println("==========onNewConversation==============");
}

@Override
public void onSyncServerFailed() {
    System.out.println("========onSyncServerFailed================");
}

@Override
public void onSyncServerFinish() {
    System.out.println("=========onSyncServerFinish===============");
}

@Override
public void onSyncServerStart() {
    System.out.println("=========onSyncServerStart===============");
}

@Override
public void onTotalUnreadMessageCountChanged(int i) {
    System.out.println("==========onTotalUnreadMessageCountChanged==============");
}

@Override
public void onBlackListAdd(UserInfo u) {
    System.out.println("==========onBlackListAdd==============");
}

@Override
public void onBlackListDeleted(UserInfo u) {
    System.out.println("=======onBlackListDeleted=================");
}

@Override
public void onFriendApplicationListAccept(UserInfo u) {
    System.out.println("=========onFriendApplicationListAccept===============");
}

@Override
public void onFriendApplicationListAdded(UserInfo u) {
    System.out.println("==========onFriendApplicationListAdded==============");
}

@Override
public void onFriendApplicationListDeleted(UserInfo u) {
    System.out.println("======onFriendApplicationListDeleted==================");
}

@Override
public void onFriendApplicationListReject(UserInfo u) {
    System.out.println("=======onFriendApplicationListReject=================");
}

@Override
public void onFriendInfoChanged(UserInfo u) {
    System.out.println("=====onFriendInfoChanged===================");
}

@Override
public void onFriendListAdded(UserInfo u) {
    System.out.println("========onFriendListAdded================");
}

@Override
public void onFriendListDeleted(UserInfo u) {
    System.out.println("========onFriendListDeleted================");
}

@Override
public void onMemberEnter(String groupId, List<GroupMembersInfo> list) {
    System.out.println("========onMemberEnter================");
}

@Override
public void onMemberLeave(String groupId, GroupMembersInfo info) {
    System.out.println("=========onMemberLeave===============");
}

@Override
public void onMemberInvited(String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list) {
    System.out.println("=========onMemberInvited===============");
}

@Override
public void onMemberKicked(String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list) {
    System.out.println("=========onMemberKicked===============");
}

@Override
public void onGroupCreated(String groupId) {
    System.out.println("==========onGroupCreated==============");
}

@Override
public void onGroupInfoChanged(String groupId, GroupInfo info) {
    System.out.println("===========onGroupInfoChanged=============");
}

@Override
public void onReceiveJoinApplication(String groupId, GroupMembersInfo info, String opReason) {
    System.out.println("===========onReceiveJoinApplication=============");
}

@Override
public void onApplicationProcessed(String groupId, GroupMembersInfo opUser, int agreeOrReject, String opReason) {
    System.out.println("============onApplicationProcessed============");
}

public void onGetConversation(View view) {
    OpenIMClient.getInstance().conversationManager.getAllConversationList(new OnBase<List<ConversationInfo>>() {
        @Override
        public void onError(long code, String error) {
        }

        @Override
        public void onSuccess(List<ConversationInfo> data) {
            System.out.println("onGetConversation:" + JsonUtil.toString(data));
        }
    });
}

public void onLogin(View view) {
    OpenIMClient.getInstance().login(new OnBase<String>() {
        @Override
        public void onError(long code, String error) {

        }
        @Override
        public void onSuccess(String data) {
            System.out.println("登录成功!");

        }
    }, "36429530", "12");
}

public void onGetMessageHistory(View view) {
    OpenIMClient.getInstance().messageManager.getHistoryMessageList(new OnBase<List<Message>>() {
        @Override
        public void onError(long code, String error) {

        }

        @Override
        public void onSuccess(List<Message> data) {
            System.out.println("消息数:" + data.size());
        }
    }, "0b55c23c7fac2b34", "", null, 20);
}

public void onSend(View view) {
    OpenIMClient.getInstance().messageManager.sendMessage(new OnMsgSendCallback() {
        @Override
        public void onError(long code, String error) {
            System.out.println("发送失败!"+code+error);
        }

        @Override
        public void onProgress(long progress) {

        }

        @Override
        public void onSuccess(String s) {
            System.out.println("发送成功!");
        }
    }, msg, "36429544", "", false);
}

}

服务端看到的
image

如果报错 invalid memory address or nil pointer dereference

E/GoLog: panic: runtime error: invalid memory address or nil pointer dereference

E/GoLog: [signal SIGSEGV: segmentation violation code=0x1 addr=0x58 pc=0x77fecc67ac]
请检查 ,
1.升级sdk 里面aar到1.1.9
2.保证所以方法在login回调成功之后操作
3.会话 ,好友关系,消息,群组,每个管理器 都需要设置监听

使用部分方法如果报错闪退

image

E/GoLog: panic: runtime error: invalid memory address or nil pointer dereference

E/GoLog: [signal SIGSEGV: segmentation violation code=0x1 addr=0x58 pc=0x77fecc67ac]

1.升级sdk 里面aar到1.1.9
2.保证所以方法在login回调成功之后操作

The app crashes when fetching the conversation list.

第一次获取会话列表,app崩溃,第二次进入就好了

OpenIMClient.getInstance().conversationManager.getAllConversationList(object : OnBase<List<ConversationInfo?>?> {
override fun onError(code: Long, error: String) {}

            override fun onSuccess(data: List<ConversationInfo?>?) {
            }
        })

crash 信息:
E/Go: panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x792ca1eb50]
goroutine 41 [running]:
database/sql.(*Rows).Next(0x0, 0x792cf84ca9)
E/GoLog: panic: runtime error: invalid memory address or nil pointer dereference
E/Go: D:/Go/src/database/sql/sql.go:2835 +0x20
open_im_sdk.(*UserRelated).getAllConversationListModel(0x792d580520, 0x792d194dc0, 0x4000098320, 0x0, 0x0, 0x0)
C:/Users/Admin/go/src/open_im_sdk/data_model.go:441 +0xd4
open_im_sdk.(*UserRelated).GetAllConversationList.func1(0x792d580520, 0x792d19b2a0, 0x40001b9548)
C:/Users/Admin/go/src/open_im_sdk/open_im_sdk_conversation_msg.go:18 +0x20
created by open_im_sdk.(*UserRelated).GetAllConversationList
E/GoLog: [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x792ca1eb50]
E/Go: C:/Users/Admin/go/src/open_im_sdk/open_im_sdk_conversation_msg.go:17 +0x44
A/libc: Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 21009 (Thread-5), pid 18478
I

The issues we are currently facing are...

注册、登录、获取Token都正常,登录账号A和账号B后,已互为好友,然后分别设置addAdvancedMsgListener和setOnConversationListener,两个账号互发消息,sendMessage回调都成功,但addAdvancedMsgListener和setOnConversationListener有时候无响应,有时候收到消息后JNI层会崩溃而且频率比较高,还有获取好友getFriendList接口在app第一次打开时获取成功但是为空,重启后正常,测试环境为木木模拟器和夜神模拟器

Bug: io.openim.android.sdk.models.Message missing field localEx

What happened?

io.openim.android.sdk.models.Message missing field localEx.I can see the json in logcat exist localEx,but the Message non-existent field localEx.

What did you expect to happen?

Accessing Android SDK

How can we reproduce it (as minimally and precisely as possible)?

Accessing Android SDK

Anything else we need to know?

No response

version

``` io.openim:core-sdk:3.5.0-rc1 ```

Cloud provider

OS version

Android

Install tools

Using remote dependencies causes a crash. The crash log indicates that 'fastjson' cannot be found

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/alibaba/fastjson/JSONObject;
at io.openim.android.sdk.utils.JsonUtil.toString(JsonUtil.java:9)
at io.openim.android.sdk.OpenIMClient.initSDK(OpenIMClient.java:75)
at io.openim.example.MainActivity.onCreate(MainActivity.java:44)
at android.app.Activity.performCreate(Activity.java:7383)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411)
at android.app.ActivityThread.-wrap12(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1994)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7529)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.alibaba.fastjson.JSONObject" on path: DexPathList[[zip file "/data/app/io.openim.example-xUajOWjem03eSt1hrp6d6A==/base.apk"],nativeLibraryDirectories=[/data/app/io.openim.example-xUajOWjem03eSt1hrp6d6A==/lib/arm64, /data/app/io.openim.example-xUajOWjem03eSt1hrp6d6A==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64, /product/lib64, /preas/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at io.openim.android.sdk.utils.JsonUtil.toString(JsonUtil.java:9) 
at io.openim.android.sdk.OpenIMClient.initSDK(OpenIMClient.java:75) 
at io.openim.example.MainActivity.onCreate(MainActivity.java:44) 
at android.app.Activity.performCreate(Activity.java:7383) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411) 
at android.app.ActivityThread.-wrap12(Unknown Source:0) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1994) 
at android.os.Handler.dispatchMessage(Handler.java:108) 
at android.os.Looper.loop(Looper.java:166) 
at android.app.ActivityThread.main(ActivityThread.java:7529) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) 
微信截图_20220520153010

After receiving messages in the SDK-Android, the logout callback fails.

返回错误信息: code: 905, error: resource loading is not complete
会导致切换账号再登录时闪退:
/Users/xianghairui/AndroidStudioProjects/Open-IM-SDK-Core/internal/login/init_login.go:289 +0x1a8
created by open_im_sdk/internal/login.(*LoginMgr).logout
/Users/xianghairui/AndroidStudioProjects/Open-IM-SDK-Core/internal/login/init_login.go:282 +0x86c

正常登出切换登录账号时也会闪退:
/Users/xianghairui/AndroidStudioProjects/Open-IM-SDK-Core/pkg/common/trigger_channel.go:127 +0xa4
/Users/xianghairui/AndroidStudioProjects/Open-IM-SDK-Core/pkg/common/trigger_channel.go:75 +0x8c
/Users/xianghairui/AndroidStudioProjects/Open-IM-SDK-Core/internal/interaction/heartbeat.go:144 +0xb24
/Users/xianghairui/AndroidStudioProjects/Open-IM-SDK-Core/internal/interaction/heartbeat.go:37 +0x12c

Must read before opening an issue

"SDK Usage Steps:

  1. Initialize the SDK.
  2. Set various listeners.
  3. Log in.
  4. Perform other operations.

All actions must ensure that steps 1, 2, and 3 have been completed first.

You can determine whether the initialization was successful based on the boolean value returned by the initialization or by checking the console logs when calling the login method."

io.openim:client-sdk:1.4.4@aar CAN NOT FOUND

GOT ERROR WHEN I TRY TO RUN DEMO

  • What went wrong:
    Could not determine the dependencies of task ':app:processDebugResources'.

Could not resolve all task dependencies for configuration ':app:debugRuntimeClasspath'.
Could not resolve io.openim:client-sdk:1.4.4.
Required by:
project :app > project :flutter_openim_sdk
> Could not resolve io.openim:client-sdk:1.4.4.
> Could not get resource 'https://dl.bintray.com/aweme-open-sdk-team/public/io/openim/client-sdk/1.4.4/client-sdk-1.4.4.pom'.
> Could not GET 'https://dl.bintray.com/aweme-open-sdk-team/public/io/openim/client-sdk/1.4.4/client-sdk-1.4.4.pom'. Received status code 502 from server: Bad Gateway

使用部分方法如果报错闪退

image

E/GoLog: panic: runtime error: invalid memory address or nil pointer dereference

E/GoLog: [signal SIGSEGV: segmentation violation code=0x1 addr=0x58 pc=0x77fecc67ac]

1.升级sdk 里面aar到1.1.9
2.保证所以方法在login回调成功之后操作

Feature: new feature

Checklist

  • I've searched for similar issues and couldn't find anything matching
  • I've discussed this feature request in the OpenIMSDK Slack and got positive feedback

Is this feature request related to a problem?

None

Problem Description

Hello, our app has a requirement: users outside of China need to initialize with a foreign URL, while users inside China need a domestic URL. The current SDK can only initialize once and can't switch URLs. Could you consider adding an uninit interface, similar to what's available in the 3.2 iOS SDK version?

Solution Description

新增一个uninit的接口。

Benefits

可以动态切换url

Potential Drawbacks

No response

Additional Information

No response

初始化成功了 ,之前的注册的账号登录可以成功,但是 新账号 IM登录失败

2021-11-16 10:57:17.743 22813-22985/cn.d_college.app I/GoLog: [ utils.go : 482 ] [call post2Api: http://1xx.1xx5.16xx.204:10000/user/get_user_info]
2021-11-16 10:57:26.838 22813-22991/cn.d_college.app I/GoLog: [ utils.go : 482 ] [call post2Api: http://11xx.11xx.1xx9.2xx:10000/friend/add_friend]
2021-11-16 10:57:57.132 24392-24392/cn.d_college.app I/GoLog: [ open_im_sdk_interface.go : 35 ] [InitSDK, config {"ipWs":"ws://1xx.1xx.1xx.2xx:1xx78","dbDir":"/storage/emulated/0/Android/data/cn.d_college.app/cache","ipApi":"http://1xx.1xx.1xx.2xx.204:10000","platform":2}]
2021-11-16 10:57:57.133 24392-24392/cn.d_college.app I/GoLog: [ open_im_sdk_init_login.go : 16 ] [InitOnce success, {2 http://114.1xx.xx.2xx:10000 ws://1xx.11xx.1xx9.2xx4:1xx78 /storage/emulated/0/Android/data/cn.d_college.app/cache}]
2021-11-16 10:57:57.133 24392-24392/cn.d_college.app I/GoLog: [ init_login.go : 29 ] [init success, {"ipWs":"ws://xx.1xx5.1xxxx4:17778","dbDir":"/storage/emulated/0/Android/data/cn.d_college.app/cache","ipApi":"http://1xx.1xx.1xx.204:10xx","platform":2}]
2021-11-16 10:57:57.133 24392-24535/cn.d_college.app I/GoLog: [ cmd_interface.go : 87 ] [doListener start. 0x40001901e0]
2021-11-16 10:57:57.133 24392-24535/cn.d_college.app I/GoLog: [ cmd_interface.go : 89 ] [doListener for.]
2021-11-16 10:57:57.134 24392-24535/cn.d_college.app I/GoLog: [ init_login.go : 73 ] [login start, 13353519279 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVSUQiOiIxMzM1MzUxOTI3OSIsIlBsYXRmb3JtIjoiQW5kcm9pZCIsImV4cCI6LTE0NDg0ODI4NDYsIm5iZiI6MTYzNzAyOTM3NSwiaWF0IjoxNjM3MDI5Mzc1fQ.DVzXonkg7QrPO1V2WrcoacPv97dofM01HwxURlvcgt0]
2021-11-16 10:57:57.135 24392-24535/cn.d_college.app I/GoLog: [ data_model.go : 60 ] [open db: /storage/emulated/0/Android/data/cn.d_college.app/cacheOpenIM_13353519279.db]
2021-11-16 10:57:57.138 24392-24535/cn.d_college.app I/GoLog: [ init_login.go : 85 ] [initDBX ok 13353519279]
2021-11-16 10:57:57.138 24392-24535/cn.d_college.app I/GoLog: [ init_login.go : 383 ] reConn call func begin, args: []
2021-11-16 10:57:57.238 24392-24540/cn.d_college.app I/GoLog: [ init_login.go : 396 ] reConn failed return args(info): [ websocket: bad handshake ws://114.1xx.1xx204:17778?sendID=13353519279&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVSUQiOiIxMzM1MzUxOTI3OSIsIlBsYXRmb3JtIjoiQW5kcm9pZCIsImV4cCI6LTE0NDg0ODI4NDYsIm5iZiI6MTYzNzAyOTM3NSwiaWF0IjoxNjM3MDI5Mzc1fQ.DVzXonkg7QrPO1V2WrcoacPv97dofM01HwxURlvcgt0&platformID=2]
2021-11-16 10:57:57.239 24392-24540/cn.d_college.app I/GoLog: [ init_login.go : 92 ] [reConn failed websocket: bad handshake]
2021-11-16 10:57:57.721 24392-24535/cn.d_college.app I/GoLog: [ utils.go : 482 ] [call post2Api: http://11xx.xx.xx.xx4:10000/user/update_user_info]

After sending a message on Android, the listening interface doesn't detect any incoming messages

package io.openim.example.test;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import java.util.List;

import io.openim.android.sdk.OpenIMClient;
import io.openim.android.sdk.listener.InitSDKListener;
import io.openim.android.sdk.listener.OnAdvanceMsgListener;
import io.openim.android.sdk.listener.OnBase;
import io.openim.android.sdk.listener.OnConversationListener;
import io.openim.android.sdk.listener.OnFriendshipListener;
import io.openim.android.sdk.listener.OnGroupListener;
import io.openim.android.sdk.listener.OnMsgSendCallback;
import io.openim.android.sdk.models.ConversationInfo;
import io.openim.android.sdk.models.GroupInfo;
import io.openim.android.sdk.models.GroupMembersInfo;
import io.openim.android.sdk.models.HaveReadInfo;
import io.openim.android.sdk.models.Message;
import io.openim.android.sdk.models.UserInfo;
import io.openim.android.sdk.utils.JsonUtil;
import io.openim.example.R;
import io.openim.example.httplibrary.utils.ChineseUtils;

public class MainTestActivity extends AppCompatActivity implements InitSDKListener, OnAdvanceMsgListener, OnConversationListener, OnFriendshipListener,
OnGroupListener {

/// api地址
final static String IP_API = "http://" + BaseConent.IP_URL + ":10000";
/// websocket地址
final static String IP_WS = "ws://" + BaseConent.IP_URL + ":30000";

OpenIMClient client;

// private String uuid = "18092397182";
// private String uuidRecss = "15229015072";
// private String Token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVSUQiOiIxODA5MjM5NzE4MiIsIlBsYXRmb3JtIjoiQW5kcm9pZCIsImV4cCI6MTYzNzc0MjU0MywibmJmIjoxNjM3MTM3NzQzLCJpYXQiOjE2MzcxMzc3NDN9.TWUc8l1HdPdq4ZPeVF_lFBjI_J5MY5NQKSWbMqFeiMU";

private String TAG = "--------------";
private String uuid = "15229015072";
private String uuidRecss = "18092397182";
private String Token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVSUQiOiIxNTIyOTAxNTA3MiIsIlBsYXRmb3JtIjoiQW5kcm9pZCIsImV4cCI6MTYzNzc0MjYzNSwibmJmIjoxNjM3MTM3ODM1LCJpYXQiOjE2MzcxMzc4MzV9.pCQvzlZR6y06XxCPItcJ1WvPywK6QZ-BTMY-wWIF3cA";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_main);
    String path = getExternalCacheDir().getAbsolutePath();
    client = OpenIMClient.getInstance();
    client.initSDK(IP_API, IP_WS, path, this);


    client.groupManager.setOnGroupListener(this);
    client.conversationManager.setOnConversationListener(this);
    client.friendshipManager.setOnFriendshipListener(this);
    client.messageManager.addAdvancedMsgListener(this);

}

@Override
public void onConnectFailed(long code, String error) {
    Log.e("----------", "onConnectFailed" + "--code--" + code + "--error--" + error);

}

@Override
public void onConnectSuccess() {
    Log.e("----------", "onConnectSuccess");
}

@Override
public void onConnecting() {
    Log.e("----------", "onConnecting");

}

@Override
public void onKickedOffline() {
    Log.e("----------", "onKickedOffline");

}

@Override
public void onSelfInfoUpdated(UserInfo info) {
    Log.e("----------", "onSelfInfoUpdated--" + JsonUtil.toString(info));


}

@Override
public void onUserTokenExpired() {
    Log.e("----------", "onUserTokenExpired");
}

@Override
public void onRecvNewMessage(Message msg) {
    Log.e("----------", "onRecvNewMessage--" + JsonUtil.toString(msg));

}

@Override
public void onRecvC2CReadReceipt(List<HaveReadInfo> list) {
    Log.e("----------", "onRecvC2CReadReceipt--" + list.size() + "-----" + JsonUtil.toString(list));

}

@Override
public void onRecvMessageRevoked(String msgId) {
    Log.e("----------", "onRecvMessageRevoked" + "--msgId--" + msgId);
}

@Override
public void onConversationChanged(List<ConversationInfo> list) {
    Log.e("----------", "onConversationChanged--" + list.size() + "-----" + JsonUtil.toString(list));

}

@Override
public void onNewConversation(List<ConversationInfo> list) {
    Log.e("----------", "onNewConversation--" + list.size() + "-----" + JsonUtil.toString(list));
}

@Override
public void onSyncServerFailed() {
    Log.e("----------", "onSyncServerFailed--");
}

@Override
public void onSyncServerFinish() {
    Log.e("----------", "onSyncServerFinish--");
}

@Override
public void onSyncServerStart() {
    Log.e("----------", "onSyncServerStart--");
}

@Override
public void onTotalUnreadMessageCountChanged(int i) {
    Log.e("----------", "onTotalUnreadMessageCountChanged--i" + i);
}

@Override
public void onBlackListAdd(UserInfo u) {
    Log.e("----------", "onBlackListAdd--" + JsonUtil.toString(u));
}

@Override
public void onBlackListDeleted(UserInfo u) {
    Log.e("----------", "onBlackListDeleted--" + JsonUtil.toString(u));
}

@Override
public void onFriendApplicationListAccept(UserInfo u) {
    Log.e("----------", "onFriendApplicationListAccept--" + JsonUtil.toString(u));
}

@Override
public void onFriendApplicationListAdded(UserInfo u) {
    Log.e("----------", "onFriendApplicationListAdded--" + JsonUtil.toString(u));
}

@Override
public void onFriendApplicationListDeleted(UserInfo u) {
    Log.e("----------", "onFriendApplicationListDeleted--" + JsonUtil.toString(u));
}

@Override
public void onFriendApplicationListReject(UserInfo u) {
    Log.e("----------", "onFriendApplicationListReject--" + JsonUtil.toString(u));
}

@Override
public void onFriendInfoChanged(UserInfo u) {
    Log.e("----------", "onFriendInfoChanged--" + JsonUtil.toString(u));
}

@Override
public void onFriendListAdded(UserInfo u) {
    Log.e("----------", "onFriendListAdded--" + JsonUtil.toString(u));
}

@Override
public void onFriendListDeleted(UserInfo u) {
    Log.e("----------", "onFriendListDeleted--" + JsonUtil.toString(u));
}

@Override
public void onMemberEnter(String groupId, List<GroupMembersInfo> list) {
    Log.e("----------", "onFriendListDeleted--" + "groupId--" + groupId + "---" + list.size() + "-----" + JsonUtil.toString(list));
}

@Override
public void onMemberLeave(String groupId, GroupMembersInfo info) {
    Log.e("----------", "onMemberLeave--" + "groupId--" + groupId + "---" + JsonUtil.toString(info));
}

@Override
public void onMemberInvited(String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list) {
    Log.e("----------", "onMemberInvited--" + "groupId--" + groupId + "---" + JsonUtil.toString(opUser) + "---" + list.size() + "-----" + JsonUtil.toString(list));
}

@Override
public void onMemberKicked(String groupId, GroupMembersInfo opUser, List<GroupMembersInfo> list) {
    Log.e("----------", "onMemberKicked--" + "groupId--" + groupId + "---" + JsonUtil.toString(opUser) + "---" + list.size() + "-----" + JsonUtil.toString(list));
}

@Override
public void onGroupCreated(String groupId) {
    Log.e("----------", "onGroupCreated--" + "groupId--" + groupId);


}

@Override
public void onGroupInfoChanged(String groupId, GroupInfo info) {
    Log.e("----------", "onGroupInfoChanged--" + "groupId--" + groupId + "---" + JsonUtil.toString(info));

}

@Override
public void onReceiveJoinApplication(String groupId, GroupMembersInfo info, String opReason) {

    Log.e("----------", "onReceiveJoinApplication" + "--groupId--" + groupId + "--opReason--" + opReason);
}

@Override
public void onApplicationProcessed(String groupId, GroupMembersInfo opUser, int agreeOrReject, String opReason) {
    Log.e("----------", "onApplicationProcessed" + "--groupId--" + groupId + "--agreeOrReject--" + agreeOrReject + "--opReason--" + opReason);
}

public void onGetConversation(View view) {
    String chinese = ChineseUtils.randomWord(3);
    Log.e("----------", "chinese--" + chinese);

    Message msg = client.messageManager.createTextMessage(chinese);
    client.messageManager.sendMessage(new OnMsgSendCallback() {
        @Override
        public void onError(long code, String error) {
            Log.e("----------", "sendMessage--" + code + "--" + error);
        }

        @Override
        public void onProgress(long progress) {
            Log.e("----------", "sendMessage--progress" + progress);
        }

        @Override
        public void onSuccess(String s) {
            Log.e("----------", "sendMessage--" + s);
        }
    }, msg, uuid, null, false);
}

public void onLogin(View view) {
    client.login(new OnBase<String>() {
        @Override
        public void onError(long code, String error) {
            Log.e("----------", "--" + code + "--" + error);

        }

        @Override
        public void onSuccess(String data) {
            Log.e("----------", "--" + data);

        }
    }, uuid, Token);
}

public void addFriend(View view) {

    Message message = client.messageManager.createTextMessage("看见哈萨克");

    client.messageManager.sendMessage(new OnMsgSendCallback() {
        @Override
        public void onError(long l, String s) {
            Log.e(TAG, "onError--" + l + "--" + s);
        }

        @Override
        public void onProgress(long l) {
            Log.e(TAG, "onProgress--" + l);
        }

        @Override
        public void onSuccess(String s) {

            Log.e(TAG, "onSuccess--" + s);
        }
    }, message, uuid, null, false);
}

public void acceptFriendApplication(View view) {
    client.friendshipManager.acceptFriendApplication(new OnBase<String>() {
        @Override
        public void onError(long code, String error) {
            Log.e("----------", "--" + code + "--" + error);

        }

        @Override
        public void onSuccess(String data) {
            Log.e("----------", "--" + data);

        }
    }, uuidRecss);
}

public void onGetMessageHistory(View view) {
    client.messageManager.getHistoryMessageList(new OnBase<List<Message>>() {
        @Override
        public void onError(long code, String error) {
            Log.e("----------", "--" + code + "--" + error);
        }

        @Override
        public void onSuccess(List<Message> data) {
            Log.e("----------", "--消息数:" + "--" + data.size() + "--" + JsonUtil.toString(data));

        }
    }, uuidRecss, "", null, 200);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    client.logout(new OnBase<String>() {
        @Override
        public void onError(long code, String error) {
            Log.e("----------", "logout--" + code + "--" + error);
        }

        @Override
        public void onSuccess(String data) {
            Log.e("----------", "logout--" + data);
        }
    });

}

}

After setting a conversation to 'Do Not Disturb', it can't be switched back to normal reception status. The log indicates a database update error.

FilePath:internal/conversation_msg/conversation.go:171] [OperationID:1646704107345] �[0m[SyncConversations UpdateConversation failed ==> open_im_sdk/pkg/db.(*DataBase).UpdateConversation()@75: no update: RowsAffected == 0 {group_57538c11a95cacf0687142d8eb18109b 0 0 0 0 0 0 false }]
2022-03-08 09:48:27.541 26072-26174/io.openim.example E/GoLog: 2022-03-08 01:48:27.540�[31m [ERRO] [PID:26072] [FilePath:internal/conversation_msg/conversation.go:171] [OperationID:1646704111647632903] �[0m[SyncConversations UpdateConversation failed ==> open_im_sdk/pkg/db.(*DataBase).UpdateConversation()@75: no update: RowsAffected == 0 {group_57538c11a95cacf0687142d8eb18109b 0 0 0 0 0 0 false }]

Setting a private chat conversation as read causes the app to crash.

2022-04-12 15:38:04.637 2637-0/com. E/Go: panic: runtime error: invalid memory address or nil pointer dereference
2022-04-12 15:38:04.637 2637-0/com. E/Go: [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xcd3afd0c]
2022-04-12 15:38:04.637 2637-0/com. E/Go:
2022-04-12 15:38:04.637 2637-0/com. E/Go: goroutine 38 [running]:
2022-04-12 15:38:04.637 2637-0/com. E/Go: sync.(*RWMutex).Lock(0x0)
2022-04-12 15:38:04.637 2637-2766/com. E/GoLog: panic: runtime error: invalid memory address or nil pointer dereference
2022-04-12 15:38:04.637 2637-0/com. E/Go: sync/rwmutex.go:111 +0x14
2022-04-12 15:38:04.637 2637-0/com. E/Go: open_im_sdk/open_im_sdk.(*UserRelated).setSingleMessageHasRead(0xcde55f18, {0x8a926274, 0x6})
2022-04-12 15:38:04.637 2637-0/com. E/Go: [email protected]/open_im_sdk/data_model.go:1468 +0x44
2022-04-12 15:38:04.637 2637-0/com. E/Go: open_im_sdk/open_im_sdk.(*UserRelated).MarkSingleMessageHasRead.func1({0x8a926274, 0x6}, 0xcde55f18, {0xcdb3a4e4, 0x8a926270})
2022-04-12 15:38:04.637 2637-0/com. E/Go: [email protected]/open_im_sdk/open_im_sdk_conversation_msg.go:1272 +0x6c
2022-04-12 15:38:04.637 2637-0/com. E/Go: created by open_im_sdk/open_im_sdk.(*UserRelated).MarkSingleMessageHasRead
2022-04-12 15:38:04.637 2637-0/com. E/Go: [email protected]/open_im_sdk/open_im_sdk_conversation_msg.go:1270 +0x50

The system application crashes upon initialization.

普通应用安装初始化没问题,系统级别的应用初始化错误导致奔溃。

A/libc: Fatal signal 31 (SIGSYS), code 1 (SYS_SECCOMP) in tid 4193 (.xx.xxx), pid 4158 (com.xx.xxx)
2023-01-14 09:13:09.710 4201-4201/? E/DEBUG: failed to read /proc/uptime: Permission denied
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: Build fingerprint: 'alps/vnd_k62v1_64_bsp/k62v1_64_bsp:12/SP1A.210812.016/1rck61v164bspP22:userdebug/dev-keys'
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: Revision: '0'
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: ABI: 'arm'
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: Timestamp: 2023-01-14 09:13:09.709409695+0800
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: Process uptime: 0s
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: Cmdline: com.xx.xxx
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: pid: 4158, tid: 4193, name: .xx.xxx>>> com.xx.xxx<<<
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: uid: 1000
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: signal 31 (SIGSYS), code 1 (SYS_SECCOMP), fault addr --------
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: Cause: seccomp prevented call to disallowed arm system call 55
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: r0 0000004f r1 00000003 r2 00000000 r3 00000000
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: r4 00000000 r5 00000000 r6 93000138 r7 00000037
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: r8 00000007 r9 00000040 r10 930000f0 r11 c4291d50
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: ip 9306013f sp 9304bb7c lr c35531e8 pc c3591de4
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: backtrace:
2023-01-14 09:13:10.218 4201-4201/? A/DEBUG: #00 pc 00304de4 /data/app/~~41fnEM9hAd4vc7gOvaJgvw==/com.xx.xxx-xOWwXuFHW-GsPAQp4LJ1vA==/lib/arm/libgojni.so

The message sending callback listener is not working

android 发消息能正常发出去,但是监听没有回调,只会触发会话监听OnConversationListener 的 onConversationChanged 会话更新

client.messageManager.sendMessage(object : OnMsgSendCallback {
override fun onSuccess(s: String?) {
Log.e("发送消息", "发送成功$s")
}
override fun onProgress(progress: Long) {
Log.e("发送消息", "正在发送$progress")
}
override fun onError(code: Long, error: String?) {
Log.e("发送消息", "发送失败错误码$code")
Log.e("发送消息", "发送失败$error")
}
}, client.messageManager.createTextMessage(chat_content.text.toString()), uid, "", false)

Real-time audio and video

当前版本的SDK似乎并没有提供网络电话和网络视频的功能,看官网文档实时音视频属于敬请期待,请问后续客户端sdk会提供相关支持吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.