首页

文章

如何编写一个即时通讯软件

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

我来回答

3个回答

懂视网 时间: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

可以用bmob做后端,有即时通讯的demo
昨天下班前发布了最新的Bmob_IM_V1.1.2版本的SDK和应用Demo,还未正式通知大家,但还是有人察觉到了,那么,这一次版本更新了什么呢?

主要是针对大家都比较关心的问题进行了集中解决。

一、更新功能:

1、新增支持陌生人聊天,允许发送给非好友用户;

2、新增支持自定义消息发送,便于开发者扩展;

3、新版本大幅度增加稳定性和及时性,保证百分百到达;

4、排除web后端推送对客户端的影响。

二、更新讲解:

1、如果你希望能和所有人(不局限于好友关系)进行聊天,那么这一版本就解决了这个问题。

如果你想看到效果,可以点击附近的人,你找到一个非好友用户,再查看他的资料,这一页面下方有个“发起会话”的按钮,这里就可以和陌生人聊天啦。(不要问我,为什么我搜索附近的人没数据呢?你一个新建的key,连注册用户都没有,那附近的人怎么可能会显示出来?)

2、如果你希望发送任意格式的消息,那么你只需要调用如下方法即可:

BmobChatManager.getInstance(this).sendJsonMessage(String json, String targetId);
复制代码
注:第一个参数:你要发的Json格式的字符串,第二个参数,就是对方的objectId

但关于发送的Json格式遵循一定的规范,具体可查看:点我。

然后,你就需要在MyMessageReceiver的广播接收器中自行解析你所定义格式的消息啦。

3、V1.1.2版本大幅度增强了及时性和稳定性,能够保证到达率。

由于推送服务有时候会出现消息丢失的情况,并不能保证消息一定被对方接收到,故在此基础上增加了一个定时检测服务,定时时间可以由开发者自行设定。

你需要开启定时检测服务的话,需要在主程序界面的onCreate方法中调用如下方法:

BmobChat.getInstance(this).startPollService(30)
复制代码
然后在onDestory方法里调用如下方法取消检测服务:

BmobChat.getInstance(this).stopPollService()
复制代码

另外,需要在你的AndroidManifest.xml里面加上如下一段代码

<!-- 启动定时检测操作 -->

<service android:name="cn.bmob.im.poll.BmobPollService">

<intent-filter>

<action android:name="cn.bmob.im.service.BmobPollService"/>

</intent-filter>

</service>
复制代码

4、有的同学没有两部真机,会从web后台推送消息给客户端,之前的版本会使得客户端奔溃,这一版排除了后端推送对客户端的影响。

三、使用Bmob_IM_SDK时需要注意的问题如下:

1、请使用两台真机测试,请不要用模拟器来测试,模拟器是接收不到推送消息的。

2、很多人由于没有两部真机,会采用一个手机注册两个不同的账号,这样来回切换账户来测试聊天,这种方式达不到测试的效果,虽然这一版本的改进使得这种方式能够收到消息,但是及时性比较低。而之前的版本,这种方式是收不到消息的,故不建议这样测试,只有两部真机才能达到真实的聊天效果。

3、请到Bmob官网注册申请应用的Application ID并在SplashActivity类中完成初始化操作。

4、有很多人导入了工程后发现有这个错:java.lang.IncompatibleClassChangeError: cn.bmob.im.project,这个是因为BmobIM_V1.1.2是基于BmobSDK_v3.2.3_0919混淆打包的,所以如果你要用的话,这两个包应该是一起导进去的,替换之前的Bmobsdk和BmobIM包。

热心网友 时间:2022-04-10 07:02

想多了,一个团队吧,模仿qq做吧,估计的花点功夫
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 跪求大侠,请问谁有bmob的JavaScript的视频教程? word怎么将文字加黑,是加黑,不是加粗,谢谢了。 bmob 短信验证javasdk怎么导入 计算机字处理怎样给文中重复字加重号 bmob的 deletebatch现在是不是不可用,现在怎么进... 字处理软件中上下两行字怎么一起加边框 bmob 使用bmobusermanager是不是要初始化init 在WORD文字处理时,要加的字出来了,已有的字却没... 使用bmob开发app是一种怎样的体验 字处理在表格后加一行怎么加 求安卓使用bmob后端云的详细步骤,以及一个应用后... word字处理中怎么给字加上划线 Android 中如何使用bmob将获取的数据以listview的... 在WPS中对文字进行处理加下划线怎么操作啊 bmob后台是什么技术 字处理添加红色方宽怎么添加 bmobsdk安装后怎么为其添加数据ios 使用bmob是怎么在不同的eclipse上进行开发 bmob即时聊天怎么获得objectid bmob查询结果如何用全局变量接收怎么通过handler+m... 在桌面上建立字处理程序“Winword.exe”的快捷方式,... Bmob,Postman发起数据请求没有反应怎么办 word如何给字体加黑 bmob支付为什么没人用 计算机字处理一篇文章中的几个字加下化线怎么做 bmob怎么判断bmobfile是否为空 在word单元格里如何对某个成语的一个字进行加点(... android flutter可以用bmob吗 字加软件怎么使用?字加使用方法? PS处理图片如何加文字和方框(如图) 文字处理软件Word中如何加入页码 将第三行的“文字处理软件”设置为“华文彩云”字体、... 字加客户端怎么使用?字加软件使用方法? 如何处理图片(加字改字的那种) 如何在Word中把相同的字作处理? “办”字可以加什么偏旁 小米mix2s进水了 放歌不行 是不是主版坏了 网上刷到单赚钱怎么做? 网上刷到单会受到什么处罚 网上刷到单被骗该找谁处理
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com