最近工作太忙,都沒(méi)有時(shí)間寫博客了靶草。廢話不多說(shuō),直接上代碼。
在activity_send_message.xml添加發(fā)送圖片的按鈕
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:background="@color/deepskyblue"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_return"
android:layout_width="44sp"
android:layout_height="44sp"
android:gravity="center_vertical">
<ImageView
android:layout_width="24sp"
android:layout_height="24sp"
android:layout_marginStart="20dp"
android:contentDescription="@string/tv_icon_des"
android:src="@drawable/return1" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="@string/btn_send_message"
android:textColor="@color/white"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/ed_send_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_send_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_send_message" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="消息接收顯示" />
<TextView
android:id="@+id/tv_receive_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/btn_album"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_album" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="圖片接收顯示" />
<ImageView
android:id="@+id/iv_receive_message"
android:layout_width="200dp"
android:layout_height="200dp" />
</LinearLayout>
</LinearLayout>
<!--<RelativeLayout-->
<!--android:id="@+id/rl_loading"-->
<!--android:layout_width="150dp"-->
<!--android:layout_height="150dp"-->
<!--android:layout_gravity="center"-->
<!--android:background="@drawable/shape_label_clarity_black">-->
<!--<com.github.ybq.android.spinkit.SpinKitView-->
<!--xmlns:app="http://schemas.android.com/apk/res-auto"-->
<!--android:id="@+id/pb_loading"-->
<!--style="@style/SpinKitView.Large.Circle"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_centerInParent="true"-->
<!--app:SpinKit_Color="@color/white" />-->
<!--<TextView-->
<!--android:id="@+id/tv_loading_text"-->
<!--android:layout_below="@id/pb_loading"-->
<!--android:layout_centerHorizontal="true"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:textColor="@color/white"-->
<!--/>-->
<!--</RelativeLayout>-->
</FrameLayout>
在SendMessageActivity添加按鈕的注冊(cè)以及點(diǎn)擊事件
package heath.com.chat.message;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.msg.MessageBuilder;
import com.netease.nimlib.sdk.msg.MsgService;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import java.io.File;
import java.net.URI;
import java.util.HashMap;
import heath.com.chat.R;
import heath.com.chat.service.IMService;
import heath.com.chat.utils.Common;
import heath.com.chat.utils.RealPathFromUriUtils;
import heath.com.chat.utils.ToastUtil;
public class SendMessageActivity extends AppCompatActivity implements View.OnClickListener {
private static IMService mImService;
private LinearLayout mLlReturn;
private EditText mEdSendText;
//調(diào)用系統(tǒng)相冊(cè)-選擇圖片
private static final int IMAGE = 1;
/**
* 發(fā)消息
*/
private Button mBtnSendText;
private static TextView mTvReceiveMessage;
private Button mBtnAlbum;
private static ImageView mIvReceiveMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_message);
initView();
init();
}
private void init() {
// 綁定服務(wù)
Intent service = new Intent(SendMessageActivity.this, IMService.class);
bindService(service, mMyServiceConnection, BIND_AUTO_CREATE);
}
@Override
public void onDestroy() {
super.onDestroy();
// 解綁服務(wù)
if (mMyServiceConnection != null) {
unbindService(mMyServiceConnection);
}
}
MyServiceConnection mMyServiceConnection = new MyServiceConnection();
private void initView() {
mLlReturn = (LinearLayout) findViewById(R.id.ll_return);
mEdSendText = (EditText) findViewById(R.id.ed_send_text);
mBtnSendText = (Button) findViewById(R.id.btn_send_text);
mBtnSendText.setOnClickListener(this);
mTvReceiveMessage = (TextView) findViewById(R.id.tv_receive_message);
mBtnAlbum = (Button) findViewById(R.id.btn_album);
mIvReceiveMessage = (ImageView) findViewById(R.id.iv_receive_message);
mBtnAlbum.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.ll_return:
finish();
break;
case R.id.btn_album:
Intent intent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, IMAGE);
break;
case R.id.btn_send_text:
final String content = mEdSendText.getText().toString();//消息文本
String account = "1";//目前這里是寫死的賬號(hào)
SessionTypeEnum type = SessionTypeEnum.P2P;//會(huì)話類型
final IMMessage textMessage = MessageBuilder.createTextMessage(account, type, content);
NIMClient.getService(MsgService.class).sendMessage(textMessage, false).setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
ToastUtil.toastOnUiThread(SendMessageActivity.this, "發(fā)送成功");
}
@Override
public void onFailed(int code) {
Log.e("文本發(fā)送失敗", "onEvent: " + code);
}
@Override
public void onException(Throwable exception) {
Log.e("文本發(fā)送異常", "onEvent: " + exception);
}
});
mEdSendText.setText("");
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//獲取圖片路徑
if (requestCode == IMAGE && resultCode == Activity.RESULT_OK && data != null) {
Uri selectedImage = data.getData();
//將uri轉(zhuǎn)換為路徑
String path = RealPathFromUriUtils.getRealPathFromUri(this, selectedImage);
File file = new File(path);
String account = "1";//目前這里是寫死的賬號(hào)
IMMessage message = MessageBuilder.createImageMessage(account, SessionTypeEnum.P2P, file, file.getName());
NIMClient.getService(MsgService.class).sendMessage(message, false).setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
try {
ToastUtil.toastOnUiThread(SendMessageActivity.this, "發(fā)送成功");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailed(int code) {
Log.e("圖片發(fā)送失敗", "onEvent: " + code);
}
@Override
public void onException(Throwable exception) {
exception.printStackTrace();
Log.e("圖片發(fā)送異常", "onEvent: " + exception);
}
});
}
}
//收到文本消息更新界面
public static void updateData(String message) {
mTvReceiveMessage.setText(message);
}
//收到圖片消息更新界面
public static void updateData1(String message) {
mIvReceiveMessage.setImageURI(Uri.parse(message));
}
class MyServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out
.println("--------------onServiceConnected--------------");
IMService.MyBinder binder = (IMService.MyBinder) service;
mImService = binder.getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
System.out
.println("--------------onServiceDisconnected--------------");
}
}
}
RealPathFromUriUtils這個(gè)是將URI轉(zhuǎn)換為路徑的文件
package heath.com.chat.utils;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
public class RealPathFromUriUtils {
/**
* 根據(jù)Uri獲取圖片的絕對(duì)路徑
*
* @param context 上下文對(duì)象
* @param uri 圖片的Uri
* @return 如果Uri對(duì)應(yīng)的圖片存在, 那么返回該圖片的絕對(duì)路徑, 否則返回null
*/
public static String getRealPathFromUri(Context context, Uri uri) {
int sdkVersion = Build.VERSION.SDK_INT;
if (sdkVersion >= 19) { // api >= 19
return getRealPathFromUriAboveApi19(context, uri);
} else { // api < 19
return getRealPathFromUriBelowAPI19(context, uri);
}
}
/**
* 適配api19以下(不包括api19),根據(jù)uri獲取圖片的絕對(duì)路徑
*
* @param context 上下文對(duì)象
* @param uri 圖片的Uri
* @return 如果Uri對(duì)應(yīng)的圖片存在, 那么返回該圖片的絕對(duì)路徑, 否則返回null
*/
private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {
return getDataColumn(context, uri, null, null);
}
/**
* 適配api19及以上,根據(jù)uri獲取圖片的絕對(duì)路徑
*
* @param context 上下文對(duì)象
* @param uri 圖片的Uri
* @return 如果Uri對(duì)應(yīng)的圖片存在, 那么返回該圖片的絕對(duì)路徑, 否則返回null
*/
@SuppressLint("NewApi")
private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {
String filePath = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
// 如果是document類型的 uri, 則通過(guò)document id來(lái)進(jìn)行處理
String documentId = DocumentsContract.getDocumentId(uri);
if (isMediaDocument(uri)) { // MediaProvider
// 使用':'分割
String id = documentId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = {id};
filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
} else if (isDownloadsDocument(uri)) { // DownloadsProvider
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
filePath = getDataColumn(context, contentUri, null, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是 content 類型的 Uri
filePath = getDataColumn(context, uri, null, null);
} else if ("file".equals(uri.getScheme())) {
// 如果是 file 類型的 Uri,直接獲取圖片對(duì)應(yīng)的路徑
filePath = uri.getPath();
}
return filePath;
}
/**
* 獲取數(shù)據(jù)庫(kù)表中的 _data 列幢哨,即返回Uri對(duì)應(yīng)的文件路徑
*
* @return
*/
private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
String path = null;
String[] projection = new String[]{MediaStore.Images.Media.DATA};
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
path = cursor.getString(columnIndex);
}
} catch (Exception e) {
if (cursor != null) {
cursor.close();
}
}
return path;
}
/**
* @param uri the Uri to check
* @return Whether the Uri authority is MediaProvider
*/
private static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* @param uri the Uri to check
* @return Whether the Uri authority is DownloadsProvider
*/
private static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
}
在IMService添加接收?qǐng)D片的消息處理
image
private Observer<IMMessage> statusObserver = new Observer<IMMessage>() {
@Override
public void onEvent(IMMessage message) {
if (message.getDirect() == MsgDirectionEnum.In) {
if (message.getAttachStatus() == AttachStatusEnum.transferred) {
if (message.getMsgType() == MsgTypeEnum.image) {
//這里是圖片下載成功
SendMessageActivity.updateData1(((ImageAttachment) message.getAttachment()).getThumbPath());
}
}
}
}
};
在IMService注冊(cè)statusObserver和注銷
image
在TabHostActivity增加加載動(dòng)態(tài)權(quán)限
private void open() {
if (Build.VERSION.SDK_INT >= 23) {
int REQUEST_CODE_CONTACT = 101;
String[] permissions = {android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.CAMERA};
//驗(yàn)證是否許可權(quán)限
for (String str : permissions) {
if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
//申請(qǐng)權(quán)限
this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
}
}
}
}
項(xiàng)目下載地址:https://download.csdn.net/download/qq_32090185/11122479