融云即时通讯

1、单聊功能

下载最新sdk.导入IMKit、IMLib库

打开 IMLib Module 的 AndroidManifest.xml 文件,把 meta-data RONG_CLOUD_APP_KEY 的值修改为自己的 AppKey

初始化,

public class App extends Application {


    @Override
    public void onCreate() {
        super.onCreate();
        /**
         * OnCreate 会被多个进程重入,这段保护代码,确保只有您需要使用 RongIMClient 的进程和 Push 进程执行了 init。
         * io.rong.push 为融云 push 进程名称,不可修改。
         */
        if (getApplicationInfo().packageName.equals(getCurProcessName(getApplicationContext())) ||
                "io.rong.push".equals(getCurProcessName(getApplicationContext()))) {
            RongIM.init(this);
            DemoContext.init(this);

        }
    }

    public static String getCurProcessName(Context context) {

        int pid = android.os.Process.myPid();

        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);

        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager
                .getRunningAppProcesses()) {

            if (appProcess.pid == pid) {
                return appProcess.processName;
            }
        }
        return null;
    }

}
manifest中application中添加android:name=".App";

获取token建立与融云服务器的连接

private void connect(String token) {

    if (getApplicationInfo().packageName.equals(App.getCurProcessName(getApplicationContext()))) {
        /**
         * IMKit SDK调用第二步,建立与服务器的连接
         */
        RongIM.connect(token, new RongIMClient.ConnectCallback() {
            /**
             * Token 错误,在线上环境下主要是因为 Token 已经过期,您需要向 App Server 重新请求一个新的 Token
             */
            @Override
            public void onTokenIncorrect() {

                Log.d("LoginActivity", "--onTokenIncorrect");
            }
            /**
             * 连接融云成功
             * @param userid 当前 token
             */
            @Override
            public void onSuccess(String userid) {

                Log.d("LoginActivity", "--onSuccess" + userid);
                startActivity(new Intent(LoginActivity.this, MainActivity.class));
                finish();
            }
            /**
             * 连接融云失败
             * @param errorCode 错误码,可到官网 查看错误码对应的注释
             *                  http://www.rongcloud.cn/docs/android.html#常见错误码
             */
            @Override
            public void onError(RongIMClient.ErrorCode errorCode) {

                Log.d("LoginActivity", "--onError" + errorCode);
            }
        });
    }
}
2、配置会话界面

会话 Fragment 跟会话列表是完全一致的,您可以用同样的方式快速的配置好。

配置布局文件

这是您的会话 Activity 对应的布局文件 conversation.xml,注意 android:name 固定为融云的 ConversationFragment。




    

新建 Activity
public class ConversationActivity extends FragmentActivity {

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

}
配置 intent-filter

在 AndroidManifest.xml 中,会话 Activity 下面配置 intent-filter。 注意请修改 android:host 为您应用的包名,其他保持不变。


 

     
         

         

         
     
 

打开单聊窗口: 

if (RongIM.getInstance() != null)
    RongIM.getInstance().startPrivateChat(MainActivity.this, "1000390", "title");
3、配置会话列表

配置布局文件

这是您的会话列表 Activity 对应的布局文件:conversationlist.xml。注意 android:name 固定为融云的 ConversationListFragment。




    


新建 Activity
public class ConversationListActivity extends FragmentActivity {

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

 }
  }
配置 intent-filter:

融云 SDK 是通过隐式调用的方式来实现界面跳转的。因此您需要在 AndroidManifest.xml 中,您的会话列表 Activity 下面配置 intent-filter,其中,android:host 是您应用的包名,需要手动修改,其他请保持不变。




    
        

        

        
    

打开会话列表

if (RongIM.getInstance() != null)
    RongIM.getInstance().startConversationList(MainActivity.this);
4、正在输入状态提示

您可以通过 rc_configuration.xml 里的开关开启输入状态提醒的功能,目前仅支持单聊。默认 true 是开启,设置为 false 为关闭。


true
ConversationActivity里注册输入状态的监听,您可以在 activityonCreate() 里添加如下代码。 
 mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                switch (msg.what) {
                    case SET_TEXT_TYPING_TITLE:
                        Toast.makeText(ConversationActivity.this, TextTypingTitle, Toast.LENGTH_SHORT).show();
//                        setTitle(TextTypingTitle);
                        setActionBarTitle(TextTypingTitle);
                        break;
                    case SET_VOICE_TYPING_TITLE:
                        Toast.makeText(ConversationActivity.this,TextTypingTitle,Toast.LENGTH_SHORT).show();
                        setActionBarTitle(VoiceTypingTitle);
                        break;
                    case SET_TARGET_ID_TITLE:
                        setActionBarTitle(mTargetId);
                        break;
                    default:
                        break;
                }
                return true;
            }
        });

        RongIMClient.setTypingStatusListener(new RongIMClient.TypingStatusListener() {
            @Override
            public void onTypingStatusChanged(Conversation.ConversationType type, String targetId, Collection typingStatusSet) {
                //当输入状态的会话类型和targetID与当前会话一致时,才需要显示
                if (type.equals(mConversationType) && targetId.equals(mTargetId)) {
                    int count = typingStatusSet.size();
                    //count表示当前会话中正在输入的用户数量,目前只支持单聊,所以判断大于0就可以给予显示了
                    if (count > 0) {
                        Iterator iterator = typingStatusSet.iterator();
                        TypingStatus status = (TypingStatus) iterator.next();
                        String objectName = status.getTypingContentType();

                        MessageTag textTag = TextMessage.class.getAnnotation(MessageTag.class);
                        MessageTag voiceTag = VoiceMessage.class.getAnnotation(MessageTag.class);
                        //匹配对方正在输入的是文本消息还是语音消息
                        if (objectName.equals(textTag.value())) {
                            mHandler.sendEmptyMessage(SET_TEXT_TYPING_TITLE);
                        } else if (objectName.equals(voiceTag.value())) {
                            mHandler.sendEmptyMessage(SET_VOICE_TYPING_TITLE);
                        }
                    } else {//当前会话没有用户正在输入,标题栏仍显示原来标题
                        mHandler.sendEmptyMessage(SET_TARGET_ID_TITLE);
                    }
                }
            }
        });
5、
在Android 6.0以上系统, 点击录音时没有反应怎么办?怎么适配Android 6.0权限请求?
// android 6.0 以上版本,监听SDK权限请求,弹出对应请求框。
if(Build.VERSION.SDK_INT >= 23){
    RongIM.getInstance().setRequestPermissionListener(new RongIM.RequestPermissionsListener() {
        @Override
        public void onPermissionRequest(String[] strings, int i) {
            for (final String permission : strings) {
                if (shouldShowRequestPermissionRationale(permission)) {
                    requestPermissions(new String[]{permission}, i);
                } else {
                    int isPermissionGranted = checkSelfPermission(permission);
                    if (isPermissionGranted != PackageManager.PERMISSION_GRANTED) {
                        new AlertDialog.Builder(ConversationActivity.this)
                                .setMessage("你需要在设置里打开以下权限:"+permission)
                                .setPositiveButton("确认", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        requestPermissions(new String[]{permission},i);
                                    }
                                })
                                .setNegativeButton("取消",null)
                                .create().show();
                    }
                }
            }
        }
    });
}










你可能感兴趣的:(融云即时通讯)