ChatActivity.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963
  1. package com.sk.weichat.ui.message;
  2. import android.app.Activity;
  3. import android.content.ActivityNotFoundException;
  4. import android.content.BroadcastReceiver;
  5. import android.content.ComponentName;
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.content.IntentFilter;
  9. import android.content.ServiceConnection;
  10. import android.media.AudioManager;
  11. import android.net.Uri;
  12. import android.os.Bundle;
  13. import android.os.Environment;
  14. import android.os.Handler;
  15. import android.os.IBinder;
  16. import android.os.Message;
  17. import android.text.TextUtils;
  18. import android.util.Log;
  19. import android.view.KeyEvent;
  20. import android.view.Menu;
  21. import android.view.MenuItem;
  22. import android.widget.TextView;
  23. import android.widget.Toast;
  24. import com.android.volley.Response;
  25. import com.android.volley.VolleyError;
  26. import com.ipaulpro.afilechooser.FileUtils;
  27. import com.nostra13.universalimageloader.core.ImageLoader;
  28. import com.sk.weichat.AppConstant;
  29. import com.sk.weichat.MyApplication;
  30. import com.sk.weichat.R;
  31. import com.sk.weichat.bean.Friend;
  32. import com.sk.weichat.bean.User;
  33. import com.sk.weichat.bean.message.ChatMessage;
  34. import com.sk.weichat.bean.message.XmppMessage;
  35. import com.sk.weichat.broadcast.MsgBroadcast;
  36. import com.sk.weichat.db.dao.ChatMessageDao;
  37. import com.sk.weichat.db.dao.FriendDao;
  38. import com.sk.weichat.downloader.Downloader;
  39. import com.sk.weichat.helper.UploadEngine;
  40. import com.sk.weichat.ui.base.ActionBackActivity;
  41. import com.sk.weichat.ui.circle.BasicInfoActivity;
  42. import com.sk.weichat.ui.circle.SendBaiDuLocate;
  43. import com.sk.weichat.ui.erp.util.ViewUtil;
  44. import com.sk.weichat.ui.me.LocalVideoActivity;
  45. import com.sk.weichat.util.CameraUtil;
  46. import com.sk.weichat.util.Constants;
  47. import com.sk.weichat.util.TimeUtils;
  48. import com.sk.weichat.util.ToastUtil;
  49. import com.sk.weichat.view.ChatBottomView;
  50. import com.sk.weichat.view.ChatBottomView.ChatBottomListener;
  51. import com.sk.weichat.view.ChatContentView;
  52. import com.sk.weichat.view.ChatContentView.MessageEventListener;
  53. import com.sk.weichat.view.PullDownListView;
  54. import com.sk.weichat.volley.FastVolley;
  55. import com.sk.weichat.volley.ObjectResult;
  56. import com.sk.weichat.volley.Result;
  57. import com.sk.weichat.volley.StringJsonObjectRequest;
  58. import com.sk.weichat.xmpp.CoreService;
  59. import com.sk.weichat.xmpp.CoreService.CoreServiceBinder;
  60. import com.sk.weichat.xmpp.ListenerManager;
  61. import com.sk.weichat.xmpp.ReceiptManager;
  62. import com.sk.weichat.xmpp.listener.ChatMessageListener;
  63. import java.io.File;
  64. import java.util.ArrayList;
  65. import java.util.HashMap;
  66. import java.util.List;
  67. import java.util.Map;
  68. import java.util.UUID;
  69. /**
  70. * 聊天主界面
  71. *
  72. * @项目名称: SkWeiChat-Baidu
  73. * @包名: com.sk.weichat.ui.message
  74. * @作者:王阳
  75. * @创建时间: 2015年10月9日 下午2:48:05
  76. * @描述: TODO
  77. * @SVN版本号: $Rev$
  78. * @修改人: $Author$
  79. * @修改时间: $Date$
  80. * @修改的内容: TODO 修改聊天,点击用户头像,加入黑名单,返回,还可以和加入黑名单的用户聊天的bug
  81. */
  82. public class ChatActivity extends ActionBackActivity
  83. implements MessageEventListener, ChatBottomListener, ChatMessageListener {
  84. public static final String FRIEND = "friend";
  85. @SuppressWarnings("unused")
  86. private TextView mAuthStateTipTv;
  87. private ChatContentView mChatContentView;
  88. private ChatBottomView mChatBottomView;
  89. private AudioManager mAudioManager = null;
  90. private String mLoginUserId;
  91. private String mLoginNickName;
  92. private Friend mFriend;// 存储所有的当前聊天对象
  93. private List<ChatMessage> mChatMessages;// 存储聊天消息
  94. private Handler mHandler = new Handler() {
  95. @Override
  96. public void handleMessage(Message msg) {
  97. switch (msg.what) {
  98. case 5:
  99. break;
  100. }
  101. }
  102. };
  103. private CoreService mService;
  104. private List<Friend> mBlackList;
  105. private boolean mHasSend = false;// 有没有发送过消息,发送过需要更新界面
  106. private static final int REQUEST_CODE_SELECT_FILE = 4;
  107. private static final int REQUEST_CODE_SELECT_Locate = 5;
  108. private static final int REQUEST_CODE_SELECT_CARD = 6;
  109. private ChatMessage instantMessage;//转发消息传过来的message
  110. private String instantFilePath;//转发文件传过来的path
  111. private FastVolley mFastVolley;
  112. protected void onCreate(Bundle savedInstanceState) {
  113. super.onCreate(savedInstanceState);
  114. setContentView(R.layout.chat);
  115. mLoginUserId = MyApplication.getInstance().mLoginUser.getUserId();
  116. mLoginNickName = MyApplication.getInstance().mLoginUser.getNickName();
  117. if (savedInstanceState != null) {
  118. mFriend = (Friend) savedInstanceState.getSerializable(AppConstant.EXTRA_FRIEND);
  119. } else if (getIntent() != null) {
  120. mFriend = (Friend) getIntent().getSerializableExtra(AppConstant.EXTRA_FRIEND);
  121. }
  122. mAudioManager = (AudioManager) getSystemService(android.app.Service.AUDIO_SERVICE);
  123. mChatMessages = new ArrayList<ChatMessage>();
  124. Downloader.getInstance().init(MyApplication.getInstance().mAppDir + File.separator + mLoginUserId
  125. + File.separator + Environment.DIRECTORY_MUSIC);
  126. initView();
  127. // 表示已读
  128. FriendDao.getInstance().markUserMessageRead(mLoginUserId, mFriend.getUserId());
  129. loadDatas(true);
  130. ListenerManager.getInstance().addChatMessageListener(this);
  131. bindService(CoreService.getIntent(), mConnection, BIND_AUTO_CREATE);
  132. instantMessage = (ChatMessage) getIntent().getParcelableExtra(Constants.INSTANT_MESSAGE);
  133. instantFilePath = getIntent().getStringExtra(Constants.INSTANT_MESSAGE_FILE);//只有转发文件才会有
  134. IntentFilter filter = new IntentFilter(Constants.CHAT_MESSAGE_DELETE_ACTION);
  135. registerReceiver(broadcastReceiver, filter);
  136. }
  137. BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  138. @Override
  139. public void onReceive(Context context, Intent intent) {
  140. Log.d("wang", "接收到广播");
  141. if (mChatContentView != null) {
  142. int position = intent.getIntExtra(Constants.CHAT_REMOVE_MESSAGE_POSITION, 10000);
  143. if (position == 10000) {
  144. return;
  145. }
  146. ChatMessage message = mChatMessages.get(position);
  147. boolean isSuccess = ChatMessageDao.getInstance().deleteSingleChatMessage(mLoginUserId, mFriend.getUserId(), message);
  148. if (isSuccess) {
  149. mChatMessages.remove(position);
  150. mChatContentView.notifyDataSetInvalidated(true);
  151. MsgBroadcast.broadcastMsgUiUpdate(mContext);
  152. } else {
  153. Toast.makeText(mContext, "删除失败", Toast.LENGTH_SHORT).show();
  154. }
  155. }
  156. }
  157. };
  158. @Override
  159. protected void onSaveInstanceState(Bundle outState) {
  160. super.onSaveInstanceState(outState);
  161. outState.putSerializable(AppConstant.EXTRA_FRIEND, mFriend);
  162. }
  163. private ServiceConnection mConnection = new ServiceConnection() {
  164. @Override
  165. public void onServiceDisconnected(ComponentName name) {
  166. mService = null;
  167. }
  168. @Override
  169. public void onServiceConnected(ComponentName name, IBinder service) {
  170. mService = ((CoreServiceBinder) service).getService();
  171. }
  172. };
  173. private void initView() {
  174. String remarkName = mFriend.getRemarkName();
  175. if (remarkName == null) {
  176. getSupportActionBar().setTitle(mFriend.getNickName());
  177. } else {
  178. getSupportActionBar().setTitle(remarkName);
  179. }
  180. findViewById(R.id.root_view);
  181. mAuthStateTipTv = (TextView) findViewById(R.id.auth_state_tip);
  182. mChatContentView = (ChatContentView) findViewById(R.id.chat_content_view);
  183. mChatContentView.setToUserId(mFriend.getUserId());
  184. mChatContentView.setData(mChatMessages);
  185. mChatContentView.setMessageEventListener(this);
  186. mChatContentView.setRefreshListener(new PullDownListView.RefreshingListener() {
  187. @Override
  188. public void onHeaderRefreshing() {
  189. loadDatas(false);
  190. }
  191. });
  192. mChatBottomView = (ChatBottomView) findViewById(R.id.chat_bottom_view);
  193. mChatBottomView.setChatBottomListener(this);
  194. }
  195. private void doBack() {
  196. if (mHasSend) {
  197. MsgBroadcast.broadcastMsgUiUpdate(mContext);
  198. }
  199. finish();
  200. }
  201. @Override
  202. public void onBackPressed() {
  203. doBack();
  204. }
  205. @Override
  206. protected boolean onHomeAsUp() {
  207. doBack();
  208. return true;
  209. }
  210. @Override
  211. protected void onStop() {
  212. // TODO Auto-generated method stub
  213. super.onStop();
  214. }
  215. @Override
  216. protected void onDestroy() {
  217. super.onDestroy();
  218. mChatBottomView.recordCancel();
  219. if (mFastVolley!=null )
  220. mFastVolley.cancelAll(FRIEND);
  221. ListenerManager.getInstance().removeChatMessageListener(this);
  222. unbindService(mConnection);
  223. unregisterReceiver(broadcastReceiver);
  224. }
  225. @Override
  226. protected void onPause() {
  227. mChatContentView.reset();
  228. super.onPause();
  229. }
  230. @Override
  231. protected void onStart() {
  232. // TODO Auto-generated method stub
  233. super.onStart();
  234. mBlackList = FriendDao.getInstance().getAllBlacklists(mLoginUserId);
  235. instantChatMessage();
  236. }
  237. @Override
  238. protected void onResume() {
  239. // TODO Auto-generated method stub
  240. super.onResume();
  241. }
  242. /**
  243. * 转发消息
  244. */
  245. private void instantChatMessage() {
  246. if (instantMessage != null) {
  247. new Handler().postDelayed(new Runnable() {
  248. @Override
  249. public void run() {
  250. // TODO Auto-generated method stub
  251. int messageType = instantMessage.getType();
  252. if (messageType == XmppMessage.TYPE_TEXT) {// 转发文字
  253. sendText(instantMessage.getContent());
  254. } else if (messageType == XmppMessage.TYPE_IMAGE) {// 转发图片
  255. if (instantMessage.getFromUserId().equals(mLoginUserId)) {
  256. sendImage(new File(instantMessage.getFilePath()));
  257. } else {
  258. File file = ImageLoader.getInstance().getDiscCache().get(instantMessage.getContent());
  259. if (file == null || !file.exists()) {// 文件不存在,那么就表示需要重新下载
  260. Toast.makeText(ChatActivity.this, "图片还没有下载,稍等一会哦", Toast.LENGTH_SHORT).show();
  261. } else {
  262. sendImage(file);
  263. }
  264. }
  265. } else if (messageType == XmppMessage.TYPE_VOICE) {// 转发语音
  266. // if(instantMessage.getFromUserId().equals(mLoginUserId)){
  267. sendVoice(instantMessage.getFilePath(), instantMessage.getTimeLen());
  268. // }else{
  269. // }
  270. } else if (messageType == XmppMessage.TYPE_LOCATION) {// 转发地址
  271. sendLocate(Double.parseDouble(instantMessage.getLocation_x()),
  272. Double.parseDouble(instantMessage.getLocation_y()), instantMessage.getContent());
  273. } else if (messageType == XmppMessage.TYPE_VIDEO) {// 转发视频
  274. sendVideo(new File(instantMessage.getFilePath()));
  275. } else if (messageType == XmppMessage.TYPE_FILE && instantFilePath != null) {//转发文件
  276. File file = new File(instantFilePath);
  277. if (file.exists()) {
  278. sendFile(file);
  279. } else {
  280. Toast.makeText(ChatActivity.this, "文件解析错误", Toast.LENGTH_SHORT).show();
  281. }
  282. }
  283. /*
  284. * else if(messageType==XmppMessage.TYPE_CARD){
  285. * sendCard(instantMessage.getObjectId()); }
  286. */
  287. instantMessage = null;
  288. }
  289. }, 1000);
  290. }
  291. }
  292. public boolean onKeyDown(int keyCode, KeyEvent event) {
  293. switch (keyCode) {
  294. case KeyEvent.KEYCODE_VOLUME_UP:
  295. mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE,
  296. AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
  297. return true;
  298. case KeyEvent.KEYCODE_VOLUME_DOWN:
  299. mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER,
  300. AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
  301. return true;
  302. default:
  303. break;
  304. }
  305. return super.onKeyDown(keyCode, event);
  306. }
  307. /***************
  308. * ChatContentView的回调
  309. ***************************************/
  310. @Override
  311. public void onMyAvatarClick() {
  312. Intent intent = new Intent(mContext, BasicInfoActivity.class);
  313. intent.putExtra(AppConstant.EXTRA_USER_ID, mLoginUserId);
  314. startActivity(intent);
  315. }
  316. @Override
  317. public void onFriendAvatarClick(String friendUserId) {
  318. Intent intent = new Intent(mContext, BasicInfoActivity.class);
  319. intent.putExtra(AppConstant.EXTRA_USER_ID, friendUserId);
  320. startActivity(intent);
  321. }
  322. @Override
  323. public void onMessageClick(ChatMessage chatMessage) {
  324. }
  325. @Override
  326. public void onMessageLongClick(ChatMessage chatMessage) {
  327. }
  328. @Override
  329. public void onEmptyTouch() {
  330. mChatBottomView.reset();
  331. }
  332. @Override
  333. public void onSendAgain(ChatMessage message) {
  334. if (interprect(message)) {
  335. return;
  336. }
  337. if (message.getType() == XmppMessage.TYPE_VOICE || message.getType() == XmppMessage.TYPE_IMAGE
  338. || message.getType() == XmppMessage.TYPE_VIDEO || message.getType() == XmppMessage.TYPE_FILE) {
  339. if (!message.isUpload()) {
  340. UploadEngine.uploadImFile(mFriend.getUserId(), message, mUploadResponse);
  341. } else {
  342. mService.sendChatMessage(mFriend.getUserId(), message);
  343. }
  344. } else {
  345. mService.sendChatMessage(mFriend.getUserId(), message);
  346. }
  347. // mService.sendChatMessage(mFriend.getUserId(), chatMessage);
  348. }
  349. /**
  350. * 拦截发送的消息
  351. *
  352. * @param message
  353. */
  354. public boolean interprect(ChatMessage message) {
  355. int len = 0;
  356. for (Friend friend : mBlackList) {
  357. if (friend.getUserId().equals(mFriend.getUserId())) {
  358. Toast.makeText(mContext, "已经加入黑名单,无法发送消息", Toast.LENGTH_SHORT).show();
  359. len++;
  360. }
  361. }
  362. Log.d("wang", "....kkkkk");
  363. if (len != 0) {
  364. // finish();
  365. ListenerManager.getInstance().notifyMessageSendStateChange(mLoginUserId, mFriend.getUserId(),
  366. message.get_id(), ChatMessageListener.MESSAGE_SEND_FAILED);
  367. return true;
  368. }
  369. return false;
  370. }
  371. /***************
  372. * ChatBottomView的回调
  373. ***************************************/
  374. private void sendMessage(final ChatMessage message) {
  375. if (interprect(message)) {
  376. return;
  377. }
  378. mHasSend = true;
  379. Log.d("roamer", "开始发送消息,ChatBottomView的回调 sendmessage");
  380. message.setPacketId(UUID.randomUUID().toString().replaceAll("-", ""));
  381. ChatMessageDao.getInstance().saveNewSingleChatMessage(mLoginUserId, mFriend.getUserId(), message);
  382. if (message.getType() == XmppMessage.TYPE_VOICE || message.getType() == XmppMessage.TYPE_IMAGE
  383. || message.getType() == XmppMessage.TYPE_VIDEO || message.getType() == XmppMessage.TYPE_FILE) {
  384. if (!message.isUpload()) {
  385. Log.d("roamer", "去更新服务器的数据");
  386. UploadEngine.uploadImFile(mFriend.getUserId(), message, mUploadResponse);
  387. } else {
  388. Log.d("roamer", "sendChatMessage....");
  389. mService.sendChatMessage(mFriend.getUserId(), message);
  390. }
  391. } else if (message.getType() == XmppMessage.TYPE_CARD) {
  392. Log.i("gongpengming", "card");
  393. mService.sendChatMessage(mFriend.getUserId(), message);
  394. //进行百度推送
  395. sendPushTask(mLoginUserId, mFriend.getUserId(), message.getContent());
  396. } else {
  397. Log.d("roamer", "sendChatMessage");
  398. mService.sendChatMessage(mFriend.getUserId(), message);
  399. //进行百度推送
  400. sendPushTask(mLoginUserId, mFriend.getUserId(), message.getContent());
  401. }
  402. }
  403. private UploadEngine.ImFileUploadResponse mUploadResponse = new UploadEngine.ImFileUploadResponse() {
  404. @Override
  405. public void onSuccess(String toUserId, ChatMessage message) {
  406. mService.sendChatMessage(mFriend.getUserId(), message);
  407. }
  408. @Override
  409. public void onFailure(String toUserId, ChatMessage message) {
  410. for (int i = 0; i < mChatMessages.size(); i++) {
  411. ChatMessage msg = mChatMessages.get(i);
  412. if (message.get_id() == msg.get_id()) {
  413. msg.setMessageState(ChatMessageListener.MESSAGE_SEND_FAILED);
  414. ChatMessageDao.getInstance().updateMessageSendState(mLoginUserId, mFriend.getUserId(),
  415. message.get_id(), ChatMessageListener.MESSAGE_SEND_FAILED);
  416. mChatContentView.notifyDataSetInvalidated(false);
  417. break;
  418. }
  419. }
  420. }
  421. };
  422. /**
  423. * 停止播放聊天的录音
  424. */
  425. @Override
  426. public void stopVoicePlay() {
  427. mChatContentView.stopPlayVoice();
  428. }
  429. @Override
  430. public void sendText(String text) {
  431. Log.d("wang", "sendText");
  432. if (TextUtils.isEmpty(text)) {
  433. return;
  434. }
  435. ChatMessage message = new ChatMessage();
  436. message.setType(XmppMessage.TYPE_TEXT);
  437. message.setContent(text);
  438. message.setFromUserName(mLoginNickName);
  439. message.setFromUserId(mLoginUserId);
  440. message.setTimeSend(TimeUtils.sk_time_current_time());
  441. mChatMessages.add(message);
  442. mChatContentView.notifyDataSetInvalidated(true);
  443. sendMessage(message);
  444. }
  445. @Override
  446. public void sendGif(String text) {
  447. Log.d("wang", "sendgif");
  448. if (TextUtils.isEmpty(text)) {
  449. return;
  450. }
  451. ChatMessage message = new ChatMessage();
  452. message.setType(XmppMessage.TYPE_GIF);
  453. message.setContent(text);
  454. message.setFromUserName(mLoginNickName);
  455. message.setFromUserId(mLoginUserId);
  456. message.setTimeSend(TimeUtils.sk_time_current_time());
  457. mChatMessages.add(message);
  458. mChatContentView.notifyDataSetInvalidated(true);
  459. sendMessage(message);
  460. }
  461. @Override
  462. public void sendVoice(String filePath, int timeLen) {
  463. if (TextUtils.isEmpty(filePath)) {
  464. return;
  465. }
  466. File file = new File(filePath);
  467. long fileSize = file.length();
  468. ChatMessage message = new ChatMessage();
  469. message.setType(XmppMessage.TYPE_VOICE);
  470. message.setContent("");
  471. message.setFromUserName(mLoginNickName);
  472. message.setFromUserId(mLoginUserId);
  473. message.setTimeSend(TimeUtils.sk_time_current_time());
  474. message.setFilePath(filePath);
  475. message.setFileSize((int) fileSize);
  476. message.setTimeLen(timeLen);
  477. mChatMessages.add(message);
  478. mChatContentView.notifyDataSetInvalidated(true);
  479. sendMessage(message);
  480. }
  481. public void sendImage(File file) {
  482. if (!file.exists()) {
  483. return;
  484. }
  485. long fileSize = file.length();
  486. ChatMessage message = new ChatMessage();
  487. message.setType(XmppMessage.TYPE_IMAGE);
  488. message.setContent("");
  489. message.setFromUserName(mLoginNickName);
  490. message.setFromUserId(mLoginUserId);
  491. message.setTimeSend(TimeUtils.sk_time_current_time());
  492. String filePath = file.getAbsolutePath();
  493. message.setFilePath(filePath);
  494. message.setFileSize((int) fileSize);
  495. mChatMessages.add(message);
  496. mChatContentView.notifyDataSetInvalidated(true);
  497. sendMessage(message);
  498. }
  499. public void sendVideo(File file) {
  500. if (!file.exists()) {
  501. return;
  502. }
  503. long fileSize = file.length();
  504. ChatMessage message = new ChatMessage();
  505. message.setType(XmppMessage.TYPE_VIDEO);
  506. message.setContent("");
  507. message.setFromUserName(mLoginNickName);
  508. message.setFromUserId(mLoginUserId);
  509. message.setTimeSend(TimeUtils.sk_time_current_time());
  510. String filePath = file.getAbsolutePath();
  511. message.setFilePath(filePath);
  512. message.setFileSize((int) fileSize);
  513. mChatMessages.add(message);
  514. mChatContentView.notifyDataSetInvalidated(true);
  515. sendMessage(message);
  516. }
  517. public void sendFile(File file) {
  518. if (!file.exists()) {
  519. return;
  520. }
  521. long fileSize = file.length();
  522. ChatMessage message = new ChatMessage();
  523. message.setType(XmppMessage.TYPE_FILE);
  524. message.setContent("");
  525. message.setFromUserName(mLoginNickName);
  526. message.setFromUserId(mLoginUserId);
  527. message.setTimeSend(TimeUtils.sk_time_current_time());
  528. String filePath = file.getAbsolutePath();
  529. message.setFilePath(filePath);
  530. message.setFileSize((int) fileSize);
  531. mChatMessages.add(message);
  532. mChatContentView.notifyDataSetInvalidated(true);
  533. Log.d("roamer", "开始发送文件");
  534. sendMessage(message);
  535. }
  536. public void sendLocate(double latitude, double longitude, String address) {
  537. ChatMessage message = new ChatMessage();
  538. message.setType(XmppMessage.TYPE_LOCATION);
  539. message.setFromUserName(mLoginNickName);
  540. message.setFromUserId(mLoginUserId);
  541. message.setTimeSend(TimeUtils.sk_time_current_time());
  542. message.setLocation_x(latitude + "");
  543. message.setLocation_y(longitude + "");
  544. message.setContent(address);
  545. mChatMessages.add(message);
  546. mChatContentView.notifyDataSetInvalidated(true);
  547. sendMessage(message);
  548. }
  549. private String objectId;
  550. //TODO 发送卡片
  551. public void sendCard(String ObjectId) {
  552. this.objectId = ObjectId;
  553. // ChatMessage message = new ChatMessage();
  554. // message.setType(XmppMessage.TYPE_CARD);
  555. // message.setFromUserName(mLoginNickName);
  556. // message.setFromUserId(mLoginUserId);
  557. // message.setTimeSend(TimeUtils.sk_time_current_time());
  558. //TODO 选择名片用户
  559. Intent intent = new Intent(this, SelectCardActivity.class);
  560. // intent.setAction("");
  561. startActivityForResult(intent, REQUEST_CODE_SELECT_CARD);
  562. //TODO 以下在返回里写
  563. // message.setObjectId(ObjectId);
  564. // message.setContent(MyApplication.getInstance().mLoginUser.getSex() + "");// 性别
  565. // 0表示女,1表示男
  566. // mChatMessages.add(message);
  567. // mChatContentView.notifyDataSetInvalidated(true);
  568. // sendMessage(message);
  569. }
  570. @Override
  571. public void clickPhoto() {
  572. Log.d("roamer", "clickphoto");
  573. CameraUtil.pickImageSimple(this, REQUEST_CODE_PICK_PHOTO);
  574. mChatBottomView.reset();
  575. }
  576. @Override
  577. public void clickCamera() {
  578. Log.d("roamer", "clickCamera");
  579. mNewPhotoUri = CameraUtil.getOutputMediaFileUri(this, CameraUtil.MEDIA_TYPE_IMAGE);
  580. CameraUtil.captureImage(this, mNewPhotoUri, REQUEST_CODE_CAPTURE_PHOTO);
  581. mChatBottomView.reset();
  582. }
  583. @Override
  584. public void clickVideo() {
  585. Intent intent = new Intent(mContext, LocalVideoActivity.class);
  586. intent.putExtra(AppConstant.EXTRA_ACTION, AppConstant.ACTION_SELECT);
  587. startActivityForResult(intent, REQUEST_CODE_SELECT_VIDE0);
  588. }
  589. @Override
  590. public void clickAudio() {//语音通话
  591. // Intent intent=new Intent(ChatActivity.this,Main.class);
  592. // Log.d("wang","usid.getUserId..."+mFriend.getUserId());
  593. // intent.putExtra(Constants.AUDIO_PHONENUMBER, mFriend.getUserId());
  594. // intent.putExtra(Constants.IS_AUDIO_OR_VIDEO, true);//true为语音
  595. // startActivity(intent);
  596. }
  597. @Override
  598. public void clickVideoChat() {//视频通话
  599. // Intent intent=new Intent(ChatActivity.this,Main.class);
  600. // Log.d("wang","usid.getUserId..."+mFriend.getUserId());
  601. // intent.putExtra(Constants.AUDIO_PHONENUMBER, mFriend.getUserId());
  602. // intent.putExtra(Constants.IS_AUDIO_OR_VIDEO, false);//true为语音
  603. // startActivity(intent);
  604. }
  605. @Override
  606. public void clickFile() {
  607. // Intent intent = new Intent(mContext, MemoryFileManagement.class);
  608. // startActivityForResult(intent, REQUEST_CODE_SELECT_FILE);
  609. Intent target = FileUtils.createGetContentIntent();
  610. // Create the chooser Intent
  611. Intent intent = Intent.createChooser(target, getString(R.string.chooser_title));
  612. try {
  613. startActivityForResult(intent, REQUEST_CODE_SELECT_FILE);
  614. } catch (ActivityNotFoundException e) {
  615. // The reason for the existence of aFileChooser
  616. }
  617. }
  618. @Override
  619. public void clickLocation() {
  620. Intent intent = new Intent(mContext, SendBaiDuLocate.class);
  621. startActivityForResult(intent, REQUEST_CODE_SELECT_Locate);
  622. }
  623. @Override
  624. public void clickCard() {
  625. sendCard(mLoginUserId);
  626. }
  627. /**
  628. * 新消息到来
  629. */
  630. @Override
  631. public boolean onNewMessage(String fromUserId, ChatMessage message, boolean isGroupMsg) {
  632. if (isGroupMsg) {
  633. return false;
  634. }
  635. if (mFriend.getUserId().compareToIgnoreCase(fromUserId) == 0) {// 是该人的聊天消息
  636. mChatMessages.add(message);
  637. mChatContentView.notifyDataSetInvalidated(true);
  638. return true;
  639. }
  640. return false;
  641. }
  642. @Override
  643. public void onMessageSendStateChange(int messageState, int msg_id) {
  644. for (int i = 0; i < mChatMessages.size(); i++) {
  645. ChatMessage msg = mChatMessages.get(i);
  646. if (msg_id == msg.get_id()) {
  647. msg.setMessageState(messageState);
  648. mChatContentView.notifyDataSetInvalidated(false);
  649. break;
  650. }
  651. }
  652. }
  653. private int mMinId = 0;
  654. private int mPageSize = 20;
  655. private boolean mHasMoreData = true;
  656. private void loadDatas(final boolean scrollToBottom) {
  657. if (mChatMessages.size() > 0) {
  658. mMinId = mChatMessages.get(0).get_id();
  659. } else {
  660. mMinId = 0;
  661. }
  662. List<ChatMessage> chatLists = ChatMessageDao.getInstance().getSingleChatMessages(mLoginUserId,
  663. mFriend.getUserId(), mMinId, mPageSize);
  664. if (chatLists == null || chatLists.size() <= 0) {
  665. mHasMoreData = false;
  666. } else {
  667. long currentTime = System.currentTimeMillis() / 1000;
  668. for (int i = 0; i < chatLists.size(); i++) {
  669. ChatMessage message = chatLists.get(i);
  670. if (message.isMySend() && message.getMessageState() == ChatMessageListener.MESSAGE_SEND_ING) {// 如果是我发的消息,有时候在消息发送中,直接退出了程序,此时消息发送状态可能使用是发送中,
  671. if (currentTime - message.getTimeSend() > ReceiptManager.MESSAGE_DELAY / 1000) {
  672. ChatMessageDao.getInstance().updateMessageSendState(mLoginUserId, mFriend.getUserId(),
  673. message.get_id(), ChatMessageListener.MESSAGE_SEND_FAILED);
  674. message.setMessageState(ChatMessageListener.MESSAGE_SEND_FAILED);
  675. }
  676. }
  677. mChatMessages.add(0, message);
  678. }
  679. }
  680. mHandler.postDelayed(new Runnable() {
  681. @Override
  682. public void run() {
  683. mChatContentView.notifyDataSetInvalidated(scrollToBottom);
  684. mChatContentView.headerRefreshingCompleted();
  685. if (!mHasMoreData) {
  686. mChatContentView.setNeedRefresh(false);
  687. }
  688. }
  689. }, 1000);
  690. }
  691. /***********************
  692. * 拍照和选择照片
  693. **********************/
  694. private static final int REQUEST_CODE_CAPTURE_PHOTO = 1;
  695. private static final int REQUEST_CODE_PICK_PHOTO = 2;
  696. private Uri mNewPhotoUri;
  697. private static final int REQUEST_CODE_SELECT_VIDE0 = 3;
  698. @Override
  699. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  700. Log.d("roamer", "进入到activityResult...");
  701. if (requestCode == REQUEST_CODE_CAPTURE_PHOTO) {// 拍照返回
  702. if (resultCode == Activity.RESULT_OK) {
  703. Log.d("roamer", "拍照返回...");
  704. if (mNewPhotoUri != null) {
  705. sendImage(new File(mNewPhotoUri.getPath()));
  706. } else {
  707. // ToastUtil.showToast(this,
  708. // R.string.c_take_picture_failed);
  709. }
  710. }
  711. } else if (requestCode == REQUEST_CODE_PICK_PHOTO) {// 选择一张图片,然后立即调用裁减
  712. if (resultCode == Activity.RESULT_OK) {
  713. Log.d("roamer", "选择了一张图片...");
  714. if (data != null && data.getData() != null) {
  715. sendImage(new File(CameraUtil.getImagePathFromUri(this, data.getData())));
  716. } else {
  717. ToastUtil.showToast(this, R.string.c_photo_album_failed);
  718. }
  719. }
  720. } else if (requestCode == REQUEST_CODE_SELECT_VIDE0 && resultCode == RESULT_OK) {// 选择视频的返回
  721. if (data == null) {
  722. return;
  723. }
  724. String filePath = data.getStringExtra(AppConstant.EXTRA_FILE_PATH);
  725. if (TextUtils.isEmpty(filePath)) {
  726. ToastUtil.showToast(this, R.string.select_failed);
  727. return;
  728. }
  729. File file = new File(filePath);
  730. if (!file.exists()) {
  731. ToastUtil.showToast(this, R.string.select_failed);
  732. return;
  733. }
  734. sendVideo(file);
  735. } else if (requestCode == REQUEST_CODE_SELECT_FILE && resultCode == RESULT_OK) {
  736. String filePath = null;
  737. if (data != null) {
  738. // Get the URI of the selected file
  739. final Uri uri = data.getData();
  740. Log.i(TAG, "Uri = " + uri.toString());
  741. try {
  742. // Get the file path from the URI
  743. filePath = FileUtils.getPath(this, uri);
  744. } catch (Exception e) {
  745. Log.e("roamer", "File select error", e);
  746. }
  747. }
  748. // String filePath = data.getStringExtra(AppConstant.FILE_PAT_NAME);
  749. if (TextUtils.isEmpty(filePath)) {
  750. ToastUtil.showToast(this, R.string.select_failed);
  751. return;
  752. }
  753. File file = new File(filePath);
  754. Log.d("roamer", file.getAbsolutePath());
  755. if (!file.exists()) {
  756. ToastUtil.showToast(this, R.string.select_failed);
  757. return;
  758. }
  759. sendFile(file);
  760. } else if (requestCode == REQUEST_CODE_SELECT_Locate && resultCode == RESULT_OK) {
  761. double latitude = data.getDoubleExtra(AppConstant.EXTRA_LATITUDE, 0);
  762. double longitude = data.getDoubleExtra(AppConstant.EXTRA_LONGITUDE, 0);
  763. String address = MyApplication.getInstance().getBdLocationHelper().getAddress();
  764. if (latitude != 0 && longitude != 0 && !TextUtils.isEmpty(address)) {
  765. sendLocate(latitude, longitude, address);
  766. } else {
  767. ToastUtil.showToast(mContext, "请把定位开启!");
  768. }
  769. } else if (requestCode == REQUEST_CODE_SELECT_CARD && resultCode == RESULT_OK) {//选择名片返回
  770. Friend card = (Friend) data.getSerializableExtra("card");
  771. ChatMessage message = new ChatMessage();
  772. message.setType(XmppMessage.TYPE_CARD);
  773. message.setFromUserName(card.getNickName());
  774. message.setCardId(card.getUserId());
  775. message.setFromUserId(mLoginUserId);
  776. message.setMySend(true);
  777. message.setTimeSend(TimeUtils.sk_time_current_time());
  778. message.setObjectId(objectId);
  779. loadCardInfo(card.getUserId(), message);
  780. mChatMessages.add(message);
  781. mChatContentView.notifyDataSetInvalidated(true);
  782. // message.setContent(MyApplication.getInstance().mLoginUser.getSex() + "");// 性别
  783. // // 0表示女,1表示男
  784. sendMessage(message);
  785. }
  786. }
  787. private void loadCardInfo(String userId, final ChatMessage message) {
  788. //TODO 发送名片时候 访问网络获取性别
  789. mFastVolley = MyApplication.getInstance().getFastVolley();
  790. Map<String, String> params = new HashMap<String, String>();
  791. params.put("access_token", MyApplication.getInstance().mAccessToken);
  792. params.put("userId", userId);
  793. Log.i("LoginInfo", "发送网络数据:userid=" + userId);
  794. StringJsonObjectRequest<User> request = new StringJsonObjectRequest<User>(mConfig.USER_GET_URL,
  795. new Response.ErrorListener() {
  796. @Override
  797. public void onErrorResponse(VolleyError arg0) {
  798. Log.i("gongpengming", "获取失败");
  799. message.setContent(-1 + "");// 当失败时候显示保密
  800. // 0表示女,1表示男
  801. sendMessage(message);
  802. }
  803. }, new StringJsonObjectRequest.Listener<User>() {
  804. @Override
  805. public void onResponse(ObjectResult<User> result) {
  806. boolean success = Result.defaultParser(mContext, result, true);
  807. if (success && result.getData() != null) {
  808. User mUser = result.getData();
  809. message.setContent(mUser.getSex()+ "");// 成功时候显示性别
  810. // 0表示女,1表示男
  811. sendMessage(message);
  812. } else {
  813. Log.i("gongpengming", "获取失败");
  814. message.setContent(-1+ "");// 当失败时候显示保密
  815. // 0表示女,1表示男
  816. sendMessage(message);
  817. }
  818. }
  819. }, User.class, params);
  820. mFastVolley.addDefaultRequest(FRIEND , request);
  821. }
  822. @Override
  823. public boolean onCreateOptionsMenu(Menu menu) {
  824. getMenuInflater().inflate(R.menu.menu_muc_chat, menu);
  825. return super.onCreateOptionsMenu(menu);
  826. }
  827. @Override
  828. public boolean onOptionsItemSelected(MenuItem item) {
  829. if (item.getItemId() == R.id.room_info) {
  830. Intent intent = new Intent(this, BasicInfoActivity.class);
  831. intent.putExtra(AppConstant.EXTRA_USER_ID, mFriend.getUserId());
  832. startActivity(intent);
  833. return true;
  834. }
  835. return super.onOptionsItemSelected(item);
  836. }
  837. /**
  838. * @desc:推送给百度服务
  839. * @author:Administrator on 2016/3/14 19:37
  840. */
  841. public void sendPushTask(String from, String to, String body) {
  842. //http://113.105.74.140:8092/tigase/notify?from=100118&to=100254&body=rrrrr&ts=1
  843. //http://192.168.253.244:8092/tigase/notify
  844. String url = "http://113.105.74.140:8092/tigase/notify";
  845. Map<String, Object> params = new HashMap<String, Object>();
  846. // int[] str;
  847. // params.put("text", str);
  848. params.put("from", from);
  849. params.put("to", to);
  850. params.put("body", body);
  851. params.put("ts", 1);
  852. Log.i("push", "推送百度 from:" + from + "to:" + to + "body:" + body);
  853. ViewUtil.httpSendRequest(this, url, params, mHandler, null, 5, null, null, "get");
  854. }
  855. }