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

看图效果如下:

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多博客大神的代码才写出来的,写在这供大家参考,希望大家多多发扬开源的精神。

时间: 2024-08-26 03:32:30

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

Bmob移动后端云服务平台--Android从零开始--(一)何为Bmob

Bmob移动后端云服务平台--Android从零开始--(一)何为Bmob 在正式的项目开发中,单客户端不能满足我们的需求,需要实现客户端与服务端的连接.而在编写Android服务端代码时,常常有很多问题困扰这我们.问题就来了,怎么能通过过简单的方式去实现我们复杂的流程呢?Bmob移动后端服务平台给我们创造了一个很好的后端平台.下面就让我们一起来了解和学习Bmob. 官网地址:http://www.bmob.cn/ Android SDK:http://www.bmob.cn/site/sdk

Android头像更换之详细操作

Android开发之头像的更换(拍照,从手机照片中选择) 先说一下昨天未解决的问题:原因是自己在获取对象时,没有将新加的图片属性加到该对象里,导致一直爆空指针异常. 接下来分析一下头像更换的具体操作:(参考的书籍是:Android第一行代码) 先分析一下布局流程: 我是这样子安排的,先到个人界面如果点击更换头像,就会跳出一个界面来选择:拍照,还是图库里选择. 因此我们需要再新建一个xml来设计:拍照和图库选择 dialog_select_photo.xml: <?xml version="

内容和图片在从网络上获取到之后都会存入到本地缓存中

内容和图片在从网络上获取到之后都会存入到本地缓存中,因此即使手机在没有网络的情况下依然能够加载出以前浏览过的新闻.而使用的缓存技术不用多说,自然是DiskLruCache了,那么首先第一个问题,这些数据都被缓存在了手机的什么位置呢? 其实DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,但是通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径.选择在这个位置有两点好处:第一,

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

作者:黑郁金香链接:http://www.zhihu.com/question/51803053/answer/127562835来源:知乎著作权归作者所有,转载请联系作者获得授权. 在8月网盘大面积关闭的时候我回答过类似的问题目前(2016 年 8 月),市面上哪个云同步盘最好用? - 知乎用户的回答现在还能用的免费大容量网盘:百度网盘(刚从百度云改名过来).微云.天翼云.115等先放观点:对非主营业务的大容量免费网盘我都不看好.理由: 同步盘用户比较小众,并且从几个还存活的网盘关闭同步功能来

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

原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStream类.BinaryReader把图片读成字节的形式,赋给一个字节数组,然后用ADO.SqlCommand对象的ExecuteNonQuery()方法来把数据保存到数据库中.主要代码如下: private void button1_Click(object sender, EventArgs e)

真云还是假云?适合你的才是真云服务器

不少新手刚建站时,都会选择比虚拟主机稳定,比服务器便宜的云服务器. 众说纷纭,你家阿里云,这家快云都说自己的真云服务器:你说我们这群屌丝建个站容易吗?还没开始就让我们先去学习什么是云服务器,了解了什么云服务器三大概念——IaaS.PaaS和SasS,可是我们看不见硬件,有什么用呢. 我想每位站长并不会在意自己用的是谁家的云VPS,还是谁家的云服务器.只要保证网站的安全.稳定.例如:有的云服务器是很牛逼,但是自己的网站放上去,就是打不开,这时你还会用吗? 什么是真假云服务器?笔者觉得适合你的才是云

相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传

一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) NSData *imageWithData; (2)头像点击事件 - (void)headImageEvent{ NSLog(@"上传头像"); [self selectPhotoAlbumWithSelectPhotoHandle:^(UIImage *img) { self.heade

Android之修改用户头像并上传服务器(实现手机拍照和SD卡选择上传)

写了这么多个的APP,最近才把他这个功能写上来,就抽取其中的用户修改头像的相关操作这个功能写了这篇博客,来与大家分享,希望对你有所帮助. 案例包含了: Xutil图片上传 拍照和SD卡选择图片 图片缓存和界面逻辑处理 图片压缩和图片处理 自定义圆形头像 XUtils.Jar 下载 其他图片上传方式请看博客  :Volley-XUtils-OkHttp三种方式实现单张多张图片上传 效果图:(注:模拟器没拍照功能,效果图只有SD卡上传,手机测试拍照上传也是可以的) 代码: MainActivity.

使用Python向MySQL数据库中存入json类型数据

0.说明 因为出于个人项目的需要,获取到的数据都是json类型的,并且都要存入MySQL数据库中,因为json类型数据不像一般的文本数据,所以在存入MySQL时需要注意的问题很多. 在网上找了很多方法,整理了一下比较实用可靠的,总结下来就是下面的过程: MySQL表中需要保证存储json数据的列类型为BLOB: 使用sql语句时,使用MySQLdb.excape_string函数来对json数据进行转义: 查询数据时,将结果使用json.loads就能够得到原来的Python数据类型: 下面就来