看图效果如下:

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"/><RelativeLayoutandroid: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" ><TextViewstyle="@style/style_text_black"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:text="@string/add_avator" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:gravity="center_vertical"android:orientation="horizontal" ><ImageViewandroid: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><RelativeLayoutandroid:id="@+id/my_layout_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/about_mid_bg"android:padding="10dp" ><TextViewstyle="@style/style_text_black"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:text="@string/add_name" /><TextViewandroid: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;@Overrideprotected String title() {return "个人资料";}@Overrideprotected 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() {@Overridepublic void onClick(View view) {String title = "选择获取图片方式";String[] items = new String[]{"拍照", "相册"};new AlertDialog.Builder(MyUserInfoActivity.this).setTitle(title).setItems(items, new DialogInterface.OnClickListener() {@Overridepublic 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);}@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void done(BmobException e) {if (e == null) {Toast.makeText(MyUserInfoActivity.this, "update", Toast.LENGTH_SHORT).show();}}});}}});}}
}

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

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

  1. Android 点击换头像(拍照和从相册选择)

    Android 点击换头像(拍照和从相册选择) 首先是layout里的代码,但这之前需要在build.gradle里加两行代码,主要是圆形图片和别的按钮啥的,你也可以改成自己的,不加圆形图片用系统原来 ...

  2. c 将图片存入到mysql数据库中_如何将图片转换存入到数据库中,并从数据库中取出转换成图片...

    有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来. 首先,我们要把图片存 ...

  3. java读取word中的表格并存入到mysql数据库中实例

    将D://word_export.doc(word2003)文件中表格数据读取出来并存入到数据库中.表格数据如下图所示: 20064001 刘景玉 1987-01-25 男 河南商丘 20064002 ...

  4. iOS上传头像, 相册权限,相册权限,拍照上传,相册选择图片,拍照页面语言设置,保存到相册...

    2019独角兽企业重金招聘Python工程师标准>>> 1. 权限 在打开相机拍照或者打开相册选择图片之前, 有必要先判断先是否有权限, 如果没有权限应该给个提示, 让用户自己去设置 ...

  5. 将DataFrame格式的数据存入到mysql数据库中

    因为最近频繁操作数据库,特别是写入数据比较麻烦.在DataFrame格式或者是Series格式的数据处理之后,总是会面临写入数据,迫不得已只能进行格式转换,搜索过程中发现了to_sql()函数,就百度 ...

  6. 利用python编写爬虫程序,从招聘网站上爬取数据,将数据存入到MongoDB数据库中,将存入的数据作一定的数据清洗后做数据分析,最后将分析的结果做数据可视化

    教程演示 创建爬虫项目 编写需要爬取的字段(items.py) 编写spider文件(wuyou.py) 编写数据库连接(pipelines.py) 编写反爬措施(settings.py) Mongo ...

  7. 华为云更换服务器系统,华为云更换服务器系统

    华为云更换服务器系统 内容精选 换一换 华为云支持将已有的SAP ASE系统迁移到华为云上,并针对不同系统提供了相应的迁移方案.应用服务器的迁移推荐使用华为云的主机迁移服务(SMS),具体原理与操作请 ...

  8. iview 组件 设置头像更换

    基于iview 组件 设置头像更换 <!-- 头像更换 --><div style="width: 100%;height:100%;"><div s ...

  9. 【项目难点】实现微信小程序中点击头像更换头像

    由于展示个人信息的时候需要放上个人头像,所以为了更好的用户体验要有修改个人头像的功能. 最开始,打算使用uview的upload组件,结果发现总是有右上角的关闭和下方的进度条,非常丑.想到正常的个人信 ...

最新文章

  1. 最大子矩阵(降维处理)
  2. 报错 findMergedAnnotation activemq
  3. 添加 Bash 自定义命令
  4. 如何启用 SAP Spartacus Guest checkout
  5. IOS之Swift的CoreData入门使用案例
  6. OpenJDK作为Linux上的默认Java
  7. numcpp速度对比_PHP和C++性能对比.pdf
  8. 解决linux下fflush(stdin)无效
  9. Cocos2d-x 引擎概要
  10. Autojs-识别验证码-超级鹰打码(全网独一份,求个三连不过分吧)
  11. 手机远程连接服务器工具:RD client远程桌面使用教程
  12. TD-SCDMA牵动3G牌照发放 重塑中国电信生态
  13. Android技术点滴记录
  14. 一个我记了十几年的BUG
  15. 微信公众号自定义模板内容换行
  16. 随机梯度下降法(stochastic gradient descent,SGD)
  17. 解决U盘中文件全部变成快捷方式的问题
  18. I. Sequence
  19. GSM技术类有哪些最新发表的毕业论文呢?
  20. 365天深度学习训练营-第P6周:好莱坞明星识别

热门文章

  1. linux修改jdk环境变量6,Linux CentOS 6.5 使用自带jdk修改环境变量(示例代码)
  2. Java黑皮书课后题第2章:*2.17(科学:风寒温度)外面有多冷?...twc=35.74+0.6215ta-35.75v0.16+0.4275tav0.16,输入度数、风速显示风寒温度
  3. final在java中的含义_在java中一个类被声明为final类型,表示的意思是()
  4. Android 带有字数统计的 TextInputLayout
  5. [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】
  6. Oracle 中重新编译无效的存储过程, 或函数、触发器等对象(转)
  7. 利用自定义分页技术提高数据库性能
  8. Day11多态部分-2-1
  9. 操作系统实验报告12:线程2
  10. 【数据结构与算法】之深入解析“最长公共前缀”的求解思路与算法示例