看图效果如下:

1.个人资料界面

2.点击头像弹出对话框

3.点击拍照

4.切割图片,选择合适的部分

5.点击保存,头像替换完毕,下面看从相册中选择图片。

6.点击相册

7.任选一张图片

8.切割图片

9.图片替换成功

亲测退出账户后重新登陆或者换模拟器登陆有效!!!

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

下面先上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.相册选择)的更多相关文章

  1. 个人信息——头像更换(拍照或相册上传)~ 微信小程序

    微信小程序中 在用户信息中关于用户头像更换(拍照或相册上传)功能实现. 图像点击触发事件: <image src='{{personImage}}' bindtap='changeAvatar' ...

  2. Android头像更换之详细操作

    Android开发之头像的更换(拍照,从手机照片中选择) 先说一下昨天未解决的问题:原因是自己在获取对象时,没有将新加的图片属性加到该对象里,导致一直爆空指针异常. 接下来分析一下头像更换的具体操作: ...

  3. 支付宝小程序serverless---获取用户信息(头像)并保存到云数据库

    支付宝小程序serverless---获取用户信息(头像)并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 我又 ...

  4. 百度网盘,前几天刚从百度云改名过来,百度云这个名字给之前的百度开放云(同步盘用户比较小众)good

    作者:黑郁金香链接:http://www.zhihu.com/question/51803053/answer/127562835来源:知乎著作权归作者所有,转载请联系作者获得授权. 在8月网盘大面积 ...

  5. uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码

    uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码 优优云验证码识别答题平台介绍 优优云|UU云(中国公司)是全球唯一领先的智 ...

  6. C#从SQL server数据库中读取l图片和存入图片

    原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStr ...

  7. 灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?

    灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟? 历史进入2019年,放眼望去,今天的整个技术大环境和生态都发生了很大的变化.在己亥猪年春节刚刚过去的早春时节,我们来梳理和展望一下整个 ...

  8. php + mysql 存入表情 【如何转义emoji表情,让它可以存入utf8的数据库】

    方法1:base_encode64 这种方法是可以,但是旧数据没有经过encode操作,取数据的时候如果统一进行decode的话,旧数据会丢失的. 1 方法2:urlencode 这个似乎可以,对没有 ...

  9. String字符串存入数据库中超出最大长度(oracle varchar2 4000)?应合理分条存储(java实现-工具/方法)

    问题描述 需要向数据库中保存数据,但某个字段内容长度过长(有中文.符号.英文),应该根据字符串内容与数据库存储上限合理设置储存方式. 解决思路 分条存储,即多条数据前n个字段一致,最后内容字段不同,下 ...

随机推荐

  1. [Caffe]使用经验积累

    Caffe使用经验积累 本贴记录Caffe编译好了,使用过程的常用命令与常见错误解决方式.如果对编译过程还存在问题,请参考史上最全的caffe安装过程配置Caffe环境. 1 使用方法 训练网络 xx ...

  2. Ext.grid.EditorGridPanel点击单元格添加菜单栏

    1.定义菜单栏需要的全局变量 var khbm; var type; 2.新建一个菜单栏 var smenu = new Ext.menu.Menu({ id:"sMenu", i ...

  3. pycharm激活

    刚刚下载了2017.1版本专业版的pycharm,作为一个天朝开发者,自然是去找注册码了.转悠了一圈,那些注册码都已经失效了.看到一个有效的方法:把http://elporfirio.com:1017 ...

  4. java的jar包加密

    由于项目要求(虽然我觉得代码没什么机密可言...),写好的jar包需要做一定加密处理 这里提供两种办法,一种奇葩,一种通用 1. 直接修改jar文件: 具体步骤: 在代码中插入一段不会运行的到的代码 ...

  5. xcode模拟器不显示键盘解决方案

    当我们使用Xcode进行开发的时候,并不是所有的时候都需要将代码运行在iPhone,有时候模拟器就可以解决这些问题, 但是当你使用模拟器的时候会发现,在TextFiled中输入信息时,如果你是用模拟器 ...

  6. 6.分析request_irq和free_irq函数如何注册注销中断

    上一节讲了如何实现运行中断,这些都是系统给做好的,当我们想自己写个中断处理程序,去执行自己的代码,就需要写irq_desc->action->handler,然后通过request_irq ...

  7. Day-10: 错误、调试和测试

    程序运行时,会遇到各种各样的错误. 编写错误叫做bug,而另一类由于运行过程中无法预测的,比如写文件时,磁盘满了,写不进去:或者从网络抓取数据,网络突然掉了.这些错误称为异常,程序中需要对异常进行处理 ...

  8. !终端伪装测试之fuck校园网

    众所周知,中国校园网络是最特么弱的网络构架之一,因此也成为众多黑客和学生的攻击对象-肉鸡.为什么学生也是主要报复者呢,我想主要是源于对学校的愤恨吧,不多说了,我这次将介绍一下我的一个个人测试--对学校 ...

  9. 交换机端口呈现err-disable的原因

    导致交换机端口呈现err-disable状态的原因有很多,为方便大家查询,特归纳如下:   1. duplex mismatch (A is correct) 2. port-channel misc ...

  10. 201521123013 《Java程序设计》第1周学习总结

    1. 本章学习总结 1.Java是面向对象的编程语言,它在通过jvm和jre将其转成本地机器代码,达到一次撰写,到处运行的效益,实现跨平台运行,代码开源,使用范围广. 2.了解jdk.jre.jvm的 ...