<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.chatdemo">
<!--環信須要權限-->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:name=".common.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.A1_RegisterActivity" />
<activity android:name=".activity.A2_LoginActivity" />
<activity
android:name=".activity.A3_SendTextActivity"
android:launchMode="singleInstance" />
<!--環信:START-->
<meta-data
android:name="EASEMOB_APPKEY"
android:value="fishgas#chatdemo" />
<service android:name="com.easemob.chat.EMChatService" />
<!--環信:END-->
</application>
</manifest>
public class MyApplication extends Application {
public static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
initEaseMob();
initImageLoader();
}
/**
* 配置ImageLoader
*/
private void initImageLoader() {
DisplayImageOptions defaultOptions = new DisplayImageOptions
.Builder()
.showImageForEmptyUri(R.drawable.empty_photo)
.showImageOnFail(R.drawable.empty_photo)
.cacheInMemory(true)
.cacheOnDisc(true)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(getApplicationContext())
.defaultDisplayImageOptions(defaultOptions)
.discCacheSize(50 * 1024 * 1024)//
.discCacheFileCount(100)//緩存一百張圖片
.writeDebugLogs()
.build();
ImageLoader.getInstance().init(config);
}
/**
* 配置環信IM
*/
private void initEaseMob() {
EMChat.getInstance().init(getApplicationContext());
}
}
/*環信工具類*/
public class EMUtil {
/**
* EM註冊帳號
*/
public static void register(final Activity context, final String username, final String password) {
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... params) {
// 調用sdk註冊方法
try {
EMChatManager.getInstance().createAccountOnServer(username, password);
//註冊成功
AbSharedUtil.putString(context, "username", username);
AbSharedUtil.putString(context, "password", password);
context.finish();
showToastOnUI(context, "環信註冊成功");
} catch (EaseMobException e) {
switch (e.getErrorCode()) {
case EMError.NONETWORK_ERROR:
showToastOnUI(context, "網絡異常,請檢查網絡!");
break;
case EMError.USER_ALREADY_EXISTS:
showToastOnUI(context, "用戶已存在!");
break;
case EMError.UNAUTHORIZED:
showToastOnUI(context, "註冊失敗,無權限!");
break;
default:
showToastOnUI(context, "註冊失敗: " + e.getMessage());
break;
}
}
return null;
}
}.execute();
}
/**
* EM登陸帳號
*/
public static void login(final Activity context, final String username, final String password) {
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... params) {
EMChatManager.getInstance().login(username, password, new EMCallBack() {//回調
@Override
public void onSuccess() {
context.runOnUiThread(new Runnable() {
public void run() {
EMGroupManager.getInstance().loadAllGroups();
EMChatManager.getInstance().loadAllConversations();
context.finish();
showToastOnUI(context, "環信登陸成功");
}
});
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, String message) {
}
});
return null;
}
}.execute();
}
/**
* EM動態註冊廣播,接受廣播
*/
public static void registerEMReceiver(Activity context) {
EMReceiver msgReceiver = new EMReceiver();
IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
context.registerReceiver(msgReceiver, intentFilter);
}
/**
* EM發送文本消息
*/
public static void sendText(Activity context, String friendStr, String inputStr, final MyEMCallBack myEMCallBack) {
LogUtil.e("friendStr=" + friendStr + "\tinputStr=" + inputStr);
String username = AbSharedUtil.getString(context, "username", "");
String password = AbSharedUtil.getString(context, "password", "");
//獲取到與聊天人的會話對象。參數username爲聊天人的userid或者groupid,後文中的username皆是如此
EMConversation conversation = EMChatManager.getInstance().getConversation(username);
//建立一條文本消息
final EMMessage message = EMMessage.createSendMessage(EMMessage.Type.TXT);
//若是是羣聊,設置chattype,默認是單聊
message.setChatType(EMMessage.ChatType.Chat);
//設置消息body
TextMessageBody txtBody = new TextMessageBody(inputStr);
message.addBody(txtBody);
//設置接收人
message.setReceipt(friendStr);
//把消息加入到此會話對象中
conversation.addMessage(message);
//發送消息,並傳入回調監聽
EMChatManager.getInstance().sendMessage(message, new EMCallBack() {
@Override
public void onSuccess() {
LogUtil.e("");
myEMCallBack.onSuccess(message);
}
@Override
public void onError(int i, String s) {
myEMCallBack.onError(i, s);
}
@Override
public void onProgress(int i, String s) {
}
});
}
/**
* 對EM回調進行改造,成功的方法中多傳一個EMMessage對象
*/
public interface MyEMCallBack {
void onSuccess(EMMessage message);
void onError(int var1, String var2);
}
/**
* 在分線程中顯示Toast
*/
public static void showToastOnUI(final Activity context, final CharSequence message) {
context.runOnUiThread(new Runnable() {
@Override
public void run() {
Looper.getMainLooper();
LogUtil.s(message);
}
});
}
}
public class EMReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();// 註銷廣播,避免重複接收
String msgId = intent.getStringExtra("msgid");// 消息id(每條消息都會生成惟一的一個id,目前是SDK生成)
String username = intent.getStringExtra("from");//發送方
EMMessage message = EMChatManager.getInstance().getMessage(msgId); // 收到這個廣播的時候,message已經在db和內存裏了,能夠經過id獲取mesage對象
EMConversation conversation = EMChatManager.getInstance().getConversation(username);
LogUtil.e("接受到環信的消息:message=" + JSON.toJSONString(message));
Intent it = new Intent(context, A3_SendTextActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("message", message);
it.putExtras(bundle);
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);
}
}
4.聊天界面
//發送消息
public class A3_SendTextActivity extends Activity {
Context context = A3_SendTextActivity.this;
@InjectView(R.id.et_friend)
EditText friend;
@InjectView(R.id.et_input)
EditText input;
@InjectView(R.id.listview)
ListView listView;
ChatAdapter adapter;
List<EMMessage> data = new ArrayList<EMMessage>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sendtext);
ButterKnife.inject(this);
initListView();
EMUtil.registerEMReceiver(A3_SendTextActivity.this);
}
@OnClick(R.id.send)
public void doSend(View v) {
String friendStr = friend.getText().toString().trim();
String inputStr = input.getText().toString().trim();
if (TextUtils.isEmpty(friendStr) || TextUtils.isEmpty(inputStr)) {
LogUtil.s("請輸入完整信息!");
return;
}
EMUtil.sendText(A3_SendTextActivity.this, friendStr, inputStr, new EMUtil.MyEMCallBack() {
@Override
public void onSuccess(EMMessage message) {
LogUtil.e("");
addEMMessageToListView(message);
}
@Override
public void onError(int var1, String var2) {
}
});
}
@OnClick(R.id.getmsg)
public void doGetMSg(View v) {
String friendStr = friend.getText().toString().trim();
if (TextUtils.isEmpty(friendStr)) {
LogUtil.s("請輸入完整信息!");
return;
}
getMsgList(friendStr);
}
/**
* 初始化聊天消息列表
*/
private void initListView() {
adapter = new ChatAdapter(context);
listView.setAdapter(adapter);
}
/**
* 從廣播進入聊天界面
*/
@Override
protected void onNewIntent(Intent intent) {
Bundle bun = intent.getExtras();
EMMessage message = bun.getParcelable("message");
addEMMessageToListView(message);
}
/**
* 獲取與好友的聊天記錄
*/
private void getMsgList(String friendStr) {
EMConversation conversation = EMChatManager.getInstance().getConversation(friendStr);
//獲取此會話的全部消息
List<EMMessage> messages = conversation.getAllMessages();
data = messages;
adapter.setData(data);
adapter.notifyDataSetChanged();
listView.setSelection(data.size());
}
/**
* 將接受的消息添加進listview
*/
private void addEMMessageToListView(EMMessage msg) {
data.add(msg);
adapter.setData(data);
adapter.notifyDataSetChanged();
listView.setSelection(data.size());
}
}