Git Product home page Git Product logo

sdkdemoapp3.0_android's Introduction

sdkdemoapp3.0_android


注意

本项目已经迁移到新的github地址:https://github.com/easemob/chat-android 。新的项目(环信/EaseIM)采用新的项目架构(Jetpack),采用新的UI设计,一定会带给您耳目一新之感,赶快去fork或者clone吧!

新项目(环信/EaseIM)开源地址

https://github.com/easemob/chat-android

新项目(环信/EaseIM)介绍

一、新项目采用谷歌官方建议的应用架构:
此架构有如下优点:

(1)UI和业务逻辑解耦。
(2)有效避免生命周期组件内存泄漏。
(3)提高模块可测试性。
(4)提高应用稳定性,有效降低以下异常发生概率。

二、新项目对工具的要求:

(1)Android Studio 3.2或更高版本。
(2)SDK targetVersion至少为26。

简介

本Demo展示了怎么使用环信SDK创建一个完整的类微信的聊天APP。展示的功能包括:注册新用户,用户登录,添加好友,单聊,群聊,发送文字,表情,语音,图片,地理位置等消息,以及实时音视频通话等。

关于分支

master分支(也就是默认分支)是环信sdk 2.x版本的稳定代码,3.x版本的代码在sdk3.0分支上,看自己需求切换分支。另外sdk3.0这是一个开发中的分支,release版本分别有相应分支或tag。

项目依赖

此demo依赖于easeui库,clone代码时需要把easeui也下载下来,easeui的分支情况同上分支说明,easeui的github地址为https://github.com/easemob/easeui

相关文档

请参考集成文档: http://docs-im.easemob.com/im/android/sdk/import

sdkdemoapp3.0_android's People

Contributors

githubzhaoliang avatar greenmemo avatar jinanzhuan avatar lijian1122 avatar liyuzhao avatar lzan13 avatar stliu avatar sulexicon avatar sunyujia avatar wangxinjeff avatar youniworld avatar zhangsong890 avatar zhanw 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  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

sdkdemoapp3.0_android's Issues

视频录制出错

在htc手机上点击视频录制一直报start failed: -2147483648这个错,还望修复

注册时出现错误:code : 208 ,description : Registration failed.

注册时出现错误:code : 208 ,description : Registration failed.

注册模式:选择的是 开放注册
图片

注册代码写在IO线程中
GlobalScope.launch(Dispatchers.Main) {
try {
withContext(Dispatchers.IO) {
LogUtils.d("当前线程: ${Thread.currentThread().name} ")
EMUtils.getInstance().createAccount(userName, passWord)
}
......
} catch (e: HyphenateException) {
LogUtils.e("code : ${e.errorCode} ,description : ${e.description}")
val errorCode = e.errorCode
if (errorCode == EMError.NETWORK_ERROR) {//网络异常
showToastMessage(getString(R.string.network_isnot_available))
} else if (errorCode == EMError.USER_ALREADY_EXIST) {//用户已经存在
showToastMessage(getString(R.string.User_already_exists))
} else if (errorCode == EMError.USER_AUTHENTICATION_FAILED) {//无权限
showToastMessage(getString(R.string.registration_failed_without_permission))
} else if (errorCode == EMError.USER_ILLEGAL_ARGUMENT) {//用户名不合法
showToastMessage(getString(R.string.illegal_user_name))
} else if (errorCode == EMError.EXCEED_SERVICE_LIMIT) {//App用户注册数量已达上限
showToastMessage(getString(R.string.register_exceed_service_limit))
} else {//注册失败
showToastMessage(getString(R.string.Registration_failed))
}
}
}

Crash on Android 6.0

java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.xxx.xxx-1/lib/arm/libhyphenate_av.so: has text relocations
at java.lang.Runtime.loadLibrary(Runtime.java:372)
at java.lang.System.loadLibrary(System.java:1076)
at com.hyphenate.chat.EMClient.loadLibrary(Unknown Source)
at com.hyphenate.chat.EMClient.getInstance(Unknown Source)

主页MainActivity多次加载ConversationListFragment,ContactListFragment,SettingsFragment的问题

测试步骤:

  • 在某个/三个fragment里的onResume()方法里打印Log =>Log.d("xxx", "resume is called");
  • 打开开发者选项的不保留活动选项,来模拟应用长期压入后台,MainActivity被系统回收的环境
  • 启动应用,进入主页
  • 按Home键,把应用压入后台
  • 重新打开应用
  • 再次按Home键,把应用压入后台
  • 再次打开应用
    会发现每个Fragment的onResume()回调了三次,按Home键=>重新打开应用 这个步骤重复多少次,每次每个Fragment的onResume()就会回调多少次。

问题原因
主页被系统回收,系统每次尝试恢复主页时,MainActivity的onCreate()就会被回调,代码

getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, conversationListFragment)
                .add(R.id.fragment_container, contactListFragment).hide(contactListFragment).show(conversationListFragment)
                .commit();

就会add新的ConversationListFragment,ContactListFragment对象,而以前add的三个fragment并没有被remove掉,所以MainActivity就会加载多个ConversationListFragment,ContactListFragment,SettingsFragment。

解决方法
当系统尝试恢复页面时,让MainActivity通过三个Fragment实例的tag来重新find到已经实例化的fragment,oncreate()修正的代码如下:

···
 //umeng api
        MobclickAgent.updateOnlineConfig(this);
        UmengUpdateAgent.setUpdateOnlyWifi(false);
        UmengUpdateAgent.update(this);

        if (getIntent().getBooleanExtra(Constant.ACCOUNT_CONFLICT, false) && !isConflictDialogShow) {
            showConflictDialog();
        } else if (getIntent().getBooleanExtra(Constant.ACCOUNT_REMOVED, false) && !isAccountRemovedDialogShow) {
            showAccountRemovedDialog();
        }

        inviteMessgeDao = new InviteMessgeDao(this);
        userDao = new UserDao(this);
        fragments = new Fragment[3];
        if (savedInstanceState == null) {
            conversationListFragment = new ConversationListFragment();
            contactListFragment = new ContactListFragment();
            settingFragment = new SettingsFragment();
            getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, conversationListFragment, "switcher:" + 0)
                    .add(R.id.fragment_container, contactListFragment, "switcher:" + 1).hide(contactListFragment).show(conversationListFragment)
                    .commit();
        } else {
            conversationListFragment = (ConversationListFragment) getSupportFragmentManager().findFragmentByTag("switcher:" + 0);
            contactListFragment = (ContactListFragment) getSupportFragmentManager().findFragmentByTag("switcher:" + 1);
            settingFragment = (SettingsFragment) getSupportFragmentManager().findFragmentByTag("switcher:" + 2);
            if (conversationListFragment == null) {
                conversationListFragment = new ConversationListFragment();
                getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, conversationListFragment, "switcher:" + 0);
            }

            if (contactListFragment == null) {
                contactListFragment = new ContactListFragment();
                getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, contactListFragment, "switcher:" + 1);
            }

            if (settingFragment == null) {
                settingFragment = new SettingsFragment();
                getSupportFragmentManager().beginTransaction().hide(contactListFragment).show(conversationListFragment)
                        .commit();
            } else {
                getSupportFragmentManager().beginTransaction().hide(contactListFragment).hide(settingFragment).show(conversationListFragment)
                        .commit();
            }
        }
        fragments[0] = conversationListFragment;
        fragments[1] = contactListFragment;
        fragments[2] = settingFragment;

        //注册local广播接收者,用于接收demohelper中发出的群组联系人的变动通知
        registerBroadcastReceiver();


        EMClient.getInstance().contactManager().setContactListener(new MyContactListener());
        //内部测试方法,请忽略
        registerInternalDebugReceiver();

        EMLog.d(TAG, "width:" + getScreenWidth(this) + "  height:" + getScreenHeight(this));
···

onTabClicked(View view)方法修正如下:

···
if (currentTabIndex != index) {
            FragmentTransaction trx = getSupportFragmentManager().beginTransaction();
            trx.hide(fragments[currentTabIndex]);
            if (!fragments[index].isAdded()) {
                trx.add(R.id.fragment_container, fragments[index], "switcher:" + index);
            }
            trx.show(fragments[index]).commit();
        }
···

over

退出登录成功之后,还能获取到当前的用户名?代码如下,222能打印出最后一次登录的账号!按照我的理解,这个打印出来应该是空的

EMClient.getInstance().logout(true, new EMCallBack() {

        @Override
        public void onSuccess() {
            Log.e("111","退出成功");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    String currentUser = EMClient.getInstance().getCurrentUser();
                    Log.e("222","currentUser:"+ currentUser);
                }
            });
        }

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

        }

        @Override
        public void onError(int code, String message) {
            LogUtils.e("退出失败");
        }
    });

redpacket

redpacket红包的支付方式多些选择, 银行卡,微信,支付宝都一起一个sdk啥时候弄好..

视频通话不显示昵称

视频通话怎么才能显示昵称而不是id
设置用户信息需要打开聊天页面才能回调,但是项目只有视频通话功能,需要怎么设置昵称?

Demo在StartServiceReceiver中启动了一个服务EMChatService,导致总是崩溃,需要使用前台服务去启动吗?

java.lang.RuntimeException:Unable to start receiver .ease.receiver.StartServiceReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.hyphenate.chat.EMChatService (has extras) }: app is in background uid UidRecord{604ec63 u0a185 SVC idle procs:2 proclist:16170,16244, seq(0,0,0)}

可以直接把这个StartServiceReceiver 给去掉吗?

求studio版本

希望能通过studio一步引用功能和布局的库,类似这样的引用compile 'com.ogaclejapan.smarttablayout:library:1.4.2@aar'
谢谢。

依赖缺失

app/build.gradle 里包含 implementation project(':easeui')
但是项目里却没有easeui, 总不能还要单独去另一个仓库下载?

application初始化部分机型报null指针

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:383)
at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:378)
# at com.hyphenate.chat.EMSessionManager.getLastLoginUser(Unknown Source)
at com.hyphenate.chat.EMClient.init(Unknown Source)
at com.hyphenate.chat.ChatClient.init(ChatClient.java:147)

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.