搜索

bmob即时聊天怎么获得objectid

发布网友 发布时间:2022-04-19 22:53

我来回答

2个回答

懂视网 时间:2022-04-10 08:36

图片已经上传到云端了!!!

 

下面先上xml代码:

里面出现的可能报错的代码都是bmob云IM DEMO照搬的,这里不再提供代码或者图片。

上一个Bmob云IM DEMO下载地址(https://github.com/chaozhouzhang/bmob-newim-demo),这个是官方DEMO

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/my_layout_all"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/theme_bg_color"
  android:orientation="vertical" >

 <include layout="@layout/include_navi"/>

 <RelativeLayout
 android:id="@+id/my_layout_head"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="@drawable/about_top_bg"
 android:minHeight="80dp"
 android:paddingLeft="10dp"
 android:paddingRight="10dp" >

 <TextView
  style="@style/style_text_black"
  android:layout_alignParentLeft="true"
  android:layout_centerVertical="true"
  android:text="@string/add_avator" />

 <LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_centerVertical="true"
  android:gravity="center_vertical"
  android:orientation="horizontal" >

  <ImageView
  android:id="@+id/my_iv_avator"
  android:layout_alignParentRight="true"
  android:layout_width="@dimen/height_50"
  android:layout_height="@dimen/height_50"
  android:layout_alignParentLeft="true"
  android:layout_marginTop="@dimen/margin_12"
  android:layout_marginBottom="@dimen/margin_12"
  android:layout_marginLeft="@dimen/margin_16"
  android:src="@mipmap/head" />
 </LinearLayout>

 </RelativeLayout>

 <RelativeLayout
 android:id="@+id/my_layout_name"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="@drawable/about_mid_bg"
 android:padding="10dp" >

 <TextView
  style="@style/style_text_black"
  android:layout_alignParentLeft="true"
  android:layout_centerVertical="true"
  android:text="@string/add_name" />

 <TextView
  android:id="@+id/my_tv_name"
  style="@style/style_text_black"
  android:layout_alignParentRight="true"
  android:layout_centerVertical="true"
  android:layout_marginRight="20dp"
  android:drawablePadding="10dp" />
 </RelativeLayout>


</LinearLayout>

 

 

下面是JAVA代码:

package cn.bmob.imdemo.ui;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cn.bmob.imdemo.R;
import cn.bmob.imdemo.base.ImageLoaderFactory;
import cn.bmob.imdemo.base.ParentWithNaviActivity;
import cn.bmob.imdemo.bean.AddFriendMessage;
import cn.bmob.imdemo.bean.User;
import cn.bmob.imdemo.model.UserModel;
import cn.bmob.newim.BmobIM;
import cn.bmob.newim.bean.BmobIMConversation;
import cn.bmob.newim.bean.BmobIMMessage;
import cn.bmob.newim.bean.BmobIMUserInfo;
import cn.bmob.newim.core.BmobIMClient;
import cn.bmob.newim.listener.MessageSendListener;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.UpdateListener;
import cn.bmob.v3.listener.UploadFileListener;

/**
 * 用户资料
 */
public class MyUserInfoActivity extends ParentWithNaviActivity {

 @Bind(R.id.my_iv_avator)
 ImageView iv_avator;
 @Bind(R.id.my_tv_name)
 TextView tv_name;


 private File mFile;

 private Bitmap mBitmap;

 String path = "";

 public static final int TAKE_PHOTO = 1;

 public static final int CHOOSE_PHOTO = 2;

 public static final int CUT_PHOTO = 3;

 //用户
 User user;
 //用户信息
 BmobIMUserInfo info;

 @Override
 protected String title() {
 return "个人资料";
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_my_user_info);
 ButterKnife.bind(this);
 //导航栏
 initNaviView();
 //用户
 user = (User) getBundle().getSerializable("u");

 //构造聊天方的用户信息:传入用户id、用户名和用户头像三个参数
 info = new BmobIMUserInfo(user.getObjectId(), user.getUsername(), user.getAvatar());
 //加载头像
 ImageLoaderFactory.getLoader().loadAvator(iv_avator, user.getAvatar(), R.mipmap.head);
 //显示名称
 tv_name.setText(user.getUsername());

 iv_avator.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  String title = "选择获取图片方式";
  String[] items = new String[]{"拍照", "相册"};

  new AlertDialog.Builder(MyUserInfoActivity.this)
   .setTitle(title)
   .setItems(items, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    switch (which) {
     case 0:
     //选择拍照
     pickImageFromCamera();
     break;
     case 1:
     //选择相册
     pickImageFromAlbum();
     break;
     default:
     break;
    }
    }
   }).show();
  }
 });
 }


 //拍照
 public void pickImageFromCamera(){
 String state = Environment.getExternalStorageState();
 if (state.equals(Environment.MEDIA_MOUNTED)) {
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  if (!file.exists()) {
  file.mkdirs();
  }
  mFile = new File(file, System.currentTimeMillis() + ".jpg");
  intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mFile));
  intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
  startActivityForResult(intent, TAKE_PHOTO);
 } else {
  Toast.makeText(this, "请确认已经插入SD卡", Toast.LENGTH_SHORT).show();
 }
 }
 //从相册获取图片
 public void pickImageFromAlbum(){
 Intent picIntent = new Intent(Intent.ACTION_PICK, null);
 picIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
 startActivityForResult(picIntent, CHOOSE_PHOTO);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if (resultCode == RESULT_OK) {
  switch (requestCode) {
  case TAKE_PHOTO:
   startPhotoZoom(Uri.fromFile(mFile));
   break;
  case CHOOSE_PHOTO:

   if (data == null || data.getData() == null) {
   return;
   }
   try {
   Bitmap bm = null;
   Uri originalUri = data.getData(); //获得图片的uri


   bm = MediaStore.Images.Media.getBitmap(getContentResolver(), originalUri); //显得到bitmap图片


   //这里开始的第二部分,获取图片的路径:


   String[] proj = {MediaStore.Images.Media.DATA};


   //好像是android多媒体数据库的封装接口,具体的看Android文档

   Cursor cursor = managedQuery(originalUri, proj, null, null, null);

   //按我个人理解 这个是获得用户选择的图片的索引值

   int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

   //将光标移至开头 ,这个很重要,不小心很容易引起越界

   cursor.moveToFirst();

   //最后根据索引值获取图片路径

   path = cursor.getString(column_index);
   }catch (Exception e){
   e.printStackTrace();
   }

   startPhotoZoom(data.getData());

   break;
  case CUT_PHOTO:

   if (data != null) {
   setPicToView(data);
   }
   break;


  }
 }

 }
 /**
 * 打开系统图片裁剪功能
 *
 * @param uri uri
 */
 private void startPhotoZoom(Uri uri) {
 Intent intent = new Intent("com.android.camera.action.CROP");
 intent.setDataAndType(uri, "image/*");
 intent.putExtra("crop", true);
 intent.putExtra("aspectX", 1);
 intent.putExtra("aspectY", 1);
 intent.putExtra("outputX", 300);
 intent.putExtra("outputY", 300);
 intent.putExtra("scale", true); //黑边
 intent.putExtra("scaleUpIfNeeded", true); //黑边
 intent.putExtra("return-data", true);
 intent.putExtra("noFaceDetection", true);
 startActivityForResult(intent, CUT_PHOTO);

 }
 private void setPicToView(Intent data) {
 Bundle bundle = data.getExtras();
 if (bundle != null) {

//
//  Uri selectedImage = data.getData();
//
//  String[] filePathColumn = { MediaStore.Images.Media.DATA };
//
//  Cursor cursor = getContentResolver().query(selectedImage,
//   filePathColumn, null, null, null);
//  cursor.moveToFirst();
//
//  int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
//  String picturePath = cursor.getString(columnIndex);
//

  //这里也可以做文件上传
  mBitmap = bundle.getParcelable("data");
  // ivHead.setImageBitmap(mBitmap);
  iv_avator.setImageBitmap(mBitmap);
//
//  if (picturePath!=null){
//  path = picturePath;
//  }

  if(mFile != null){
  path = mFile.getPath();
  }

  Toast.makeText(MyUserInfoActivity.this,"path:"+path,Toast.LENGTH_SHORT).show();

  final BmobFile bmobFile = new BmobFile(new File(path));
  //Bmob这个上传文件的貌似不成功..........................
  bmobFile.uploadblock(new UploadFileListener() {

  @Override
  public void done(BmobException e) {
   if (e == null) {
   Toast.makeText(MyUserInfoActivity.this, "pic is success", Toast.LENGTH_SHORT).show();
   // MyUser myUser =MyUser.getCurrentUser(MyUser.class);
   //得到上传的图片地址
   String fileUrl = bmobFile.getFileUrl();
   user.setAvatar(fileUrl);
   //更新图片地址
   user.update(user.getObjectId(), new UpdateListener() {
    @Override
    public void done(BmobException e) {
    if (e == null) {
     Toast.makeText(MyUserInfoActivity.this, "update", Toast.LENGTH_SHORT).show();

    }
    }
   });
   }
  }
  });

 }
 }
}

 

 

 

 我也是参考了N多博客大神的代码才写出来的,写在这供大家参考,希望大家多多发扬开源的精神。

 

Bmob云IM实现头像更换并存入Bmob云数据库中(1.拍照替换,2.相册选择)

标签:ems   loader   sel   show   back   apt   .net   data   ade   

热心网友 时间:2022-04-10 05:44

可以下个demo看看
1、 开启私聊
//如果需要更新用户资料,开发者只需要传新的info进去就可以了
BmobIM.getInstance().startPrivateConversation(BmobImUserInfo info, new ConversationListener() {
@Override
public void done(BmobIMConversation c, BmobException e) {
if(e==null){
//在此跳转到聊天页面
Bundle bundle = new Bundle();
bundle.putSerializable("c", c);
startActivity(ChatActivity.class, bundle, false);
}else{
toast(e.getMessage()+"("+e.getErrorCode()+")");
}
}
});

2、 创建会话实例
使用BmobIMConversation.obtain(BmobIMClient client,BmobIMConversation conversation)方法传入BmobIMClient和BmobIMConversation的各自实例就可以创建一个用于控制消息查询、发送和删除的会话实例。
BmobIMConversation c;
//在聊天页面的onCreate方法中,通过如下方法创建新的会话实例,这个obtain方法才是真正创建一个管理消息发送的会话
c=BmobIMConversation.obtain(BmobIMClient.getInstance(),(BmobIMConversation)getBundle().getSerializable("c"));

创建完成后,就可以使用这个会话实例c对消息进行各种操作啦,以下操作中的c都指的是该会话实例。
注:如果不调用BmobIMConversation的obtain方法是无法控制消息发送等操作的,会报client disconnect的错误。
查询聊天记录
//首次加载,可设置msg为null,
//下拉刷新的时候,可用消息表的第一个msg作为刷新的起始时间点,默认按照消息时间的降序排列,limit由开发者控制
c.queryMessages(msg, limit, new MessagesQueryListener() {
@Override
public void done(List<BmobIMMessage> list, BmobException e) {
sw_refresh.setRefreshing(false);
if (e == null) {
if (null != list && list.size() > 0) {
adapter.addMessages(list);
adapter.notifyDataSetChanged();
layoutManager.scrollToPositionWithOffset(list.size() - 1, 0);
}
} else {
toast(e.getMessage() + "(" + e.getErrorCode() + ")");
}
}
});

删除聊天记录
删除消息不同于删除会话,会直接清空本地的消息记录数据。
//删除指定聊天消息
c.deleteMessage(BmobIMMessage msg)

//删除一条或多条聊天消息
c.deleteBatchMessage(List<BmobIMMessage> msgs)

//清空该会话下的聊天消息,允许保留会话(可选)
c.clearMessage(boolean isKeepConversion,MessageListener listener)

注:isKeepConversion 表示是否保留该会话消息。

更新指定会话的所有消息为已读状态
可以在ChatActivity的聊天页面的onDestory方法中调用如下方法更新该会话的的所有消息为已读状态:
//更新此会话的所有消息为已读状态
c.updateLocalCache();

消息发送
文本消息
文本消息可以是纯文本,也可以是包含表情的文本消息,通过BmobIMTextMessage的setContent方法设置内容来构建BmobIMTextMessage实例,再调用BmobIMConversation的sendMessage方法发送。
BmobIMTextMessage msg =new BmobIMTextMessage();
msg.setContent(text);
//可随意设置额外信息
Map<String,Object> map =new HashMap<>();
map.put("level", "1");
msg.setExtraMap(map);
c.sendMessage(msg, new MessageSendListener() {
@Override
public void onStart(BmobIMMessage msg) {
super.onStart(msg);
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});

图像消息
图片可以是通过系统拍照或本地相册中获取的本地图片地址,也可以使用网络上某个有效的图片地址。然后构造一个BmobIMImageMessage对象,再调用BmobIMConversation的sendMessage方法发送。
发送本地图片
使用系统拍照功能或从本地相册中获取到本地图片地址(localPath),然后调用构造方法BmobIMImageMessage(String localPath)来创建BmobIMImageMessage实例。
BmobIMImageMessage image =new BmobIMImageMessage(localPath);
c.sendMessage(image, new MessageSendListener() {

@Override
public void onProgress(int value) {
super.onProgress(value);
//文件类型的消息才有进度值:do something
Logger.i("onProgress:"+value);
}

@Override
public void onStart(BmobIMMessage msg) {
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});

发送远程图片URL
例如,从微博或QQ中获取到某个图片地址,然后调用BmobIMImageMessage的setRemoteUrl方法设置远程图片URL来创建BmobIMImageMessage实例。
BmobIMImageMessage image =new BmobIMImageMessage();
image.setRemoteUrl("http://img.lakalaec.com/ad/57ab6dc2-43f2-4087-81e2-b5ab56812d.jpg");
c.sendMessage(image, new MessageSendListener() {

@Override
public void onProgress(int value) {
super.onProgress(value);
//文件类型的消息才有进度值
Logger.i("onProgress:"+value);
}

@Override
public void onStart(BmobIMMessage msg) {
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});

语音消息
语音可以是通过录制音频得到的本地音频地址,也可以使用网络上某个有效的音频地址。然后构造一个BmobIMAudioMessage对象,再调用BmobIMConversation的sendMessage方法发送。
发送本地音频文件:
BmobIMAudioMessage image =new BmobIMAudioMessage(localPath);
c.sendMessage(image, new MessageSendListener() {

@Override
public void onProgress(int value) {
super.onProgress(value);
//文件类型的消息才有进度值:do something
Logger.i("onProgress:"+value);
}

@Override
public void onStart(BmobIMMessage msg) {
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});

发送远程语音URL地址
同样的,语音消息也支持发送远程语音URL地址:
BmobIMAudioMessage image =new BmobIMAudioMessage();
image.setRemoteUrl("远程语音地址");
c.sendMessage(image, new MessageSendListener() {

@Override
public void onProgress(int value) {
super.onProgress(value);
//文件类型的消息才有进度值
Logger.i("onProgress:"+value);
}

@Override
public void onStart(BmobIMMessage msg) {
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});

地理位置消息
地理位置可以通过任意地图SDK获取到经纬度,详细地址等信息,然后调用BmobIMLocationMessage(String address,double latitude,double longitude)构造方法构建BmobIMLocationMessage实例,再调用BmobIMConversation的sendMessage方法发送。:
BmobIMLocationMessage location =new BmobIMLocationMessage("广州番禺区",23.5,112.0);
c.sendMessage(location, new MessageSendListener() {

@Override
public void onStart(BmobIMMessage msg) {
scrollToBottom();
adapter.addMessage(msg);
adapter.notifyDataSetChanged();
}

@Override
public void done(BmobIMMessage msg, BmobException e) {
scrollToBottom();
adapter.notifyDataSetChanged();
edit_msg.setText("");
if (e != null) {
toast(e.getMessage());
}
}
});

消息接收
自定义消息接收器
如果你使用的是NewIM_V2.0.4以后(包含v2.0.4)的SDK版本,那么不仅可以使用BmobIMMessageHandler方式来注册全局的消息接收器,还可以使用MessageListHandler为单个页面注册消息接收器,具体步骤如下:
在Activity/Fragment中实现MessageListHandler接口;
在onResume方法中添加页面消息*:BmobIM.getInstance().addMessageListHandler(this);
在onPause方法中移除页面消息*:BmobIM.getInstance().removeMessageListHandler(this);
在MessageListHandler接口的onMessageReceive方法中做相关的操作。
具体示例可查看NewIMDemo中的ChatActivity类:
@Override
public void onMessageReceive(List<MessageEvent> list) {
//当注册页面消息监听时候,有消息(包含离线消息)到来时会回调该方法
for (int i=0;i<list.size();i++){
//do something...
}
}

如果你使用的是NewIM_V2.0.2以后(包含v2.0.2)的SDK版本,那么只需要自定义消息接收器继承自BmobIMMessageHandler来处理服务器发来的消息和离线消息。

public class DemoMessageHandler extends BmobIMMessageHandler{

private Context context;
public DemoMessageHandler(Context context) {
this.context = context;
}

@Override
public void onMessageReceive(final MessageEvent event) {
//当接收到服务器发来的消息时,此方法被调用
//可以统一在此检测更新会话及用户信息
UserModel.getInstance().updateUserInfo(event, new UpdateCacheListener() {
@Override
public void done(BmobException e) {
BmobIMMessage msg = event.getMessage();
//用户自定义的消息类型,其类型值均为0
if(BmobIMMessageType.getMessageTypeValue(msg.getMsgType())==0){
//自行处理自定义消息类型
Logger.i(msg.getMsgType() + "," + msg.getContent() + "," + msg.getExtra());
}else{//SDK内部内部支持的消息类型
if (BmobNotificationManager.getInstance(context).isShowNotification()){
//如果需要显示通知栏,可以使用BmobNotificationManager类提供的方法,也可以自己写通知栏显示方法
}else{//直接发送消息事件
Logger.i("当前处于应用内,发送event");
EventBus.getDefault().post(event);
}
}
}
});
}

@Override
public void onOfflineReceive(final OfflineMessageEvent event) {
//每次调用connect方法时会查询一次离线消息,如果有,此方法会被调用
Map<String,List<MessageEvent>> map =event.getEventMap();
Logger.i("离线消息属于"+map.size()+"个用户");
for (Map.Entry<String, List<MessageEvent>> entry : map.entrySet()) {
List<MessageEvent> list =entry.getValue();
//挨个检测离线用户信息是否需要更新
UserModel.getInstance().updateUserInfo(list.get(0), new UpdateCacheListener() {
@Override
public void done(BmobException e) {
EventBus.getDefault().post(event);
}
});
}
}
}

同样,别忘记在Application的onCreate方法中注册这个DemoMessageHandler:

public class BmobIMApplication extends Application{

@Override
public void onCreate() {
super.onCreate();
//注册消息接收器
BmobIM.registerDefaultMessageHandler(new DemoMessageHandler(this));
}
}
用户管理
NewIMSDK只是即时通讯的消息收发渠道,本身并不提供用户体系。开发者可使用BmobSDK提供的用户管理方面功能,也可使用开发者自己的用户体系。
NewIMSDK内部会自动创建本地用户表,并对外提供方法供开发者调用来操作本地用户表。开发者只需要调用updateUserInfo方法即可更新本地用户信息。
BmobIMUserInfo介绍
NewIMSDK中用户的实体类为BmobIMUserInfo,其有四个属性,开发者只需要关心后三个即可:
id 本地数据库用户表的id值 开发者无需关心
userId 用户的id,唯一标识(NewIMDemo中是用的是BmobUser的objectId)
name 用户名 (NewIMDemo中是用的是BmobUser的username)
avatar 用户头像
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
Top