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。
public class ConversationActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.conversation);
}
}
在 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。
public class ConversationListActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.conversationlist);
}
}
融云 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里注册输入状态的监听,您可以在 activity
的 onCreate()
里添加如下代码。
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, Collection5、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); } } } });
在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(); } } } } }); }