android 使用本机相机照相或用本地相册更新imageview里面的图片
2015-10-21 11:26
746 查看
[align=left]1.点击图片弹出popupwindow对话框[/align]
[align=left][/align]
private void showAvatarPop()
{
[align=left] View view = LayoutInflater.from(this).inflate(R.layout. pop_showavator,[/align]
[align=left] null);[/align]
layout_choose =
(RelativeLayout) view.findViewById(R.id.layout_choose );
layout_photo =
(RelativeLayout) view.findViewById(R.id.layout_photo );
layout_photo.setOnClickListener(new OnClickListener()
{
[align=left]
[/align]
[align=left] @Override[/align]
public void onClick(View
arg0) {
[align=left] ShowLog( "点击拍照" );[/align]
// TODO Auto-generated
method stub
[align=left] layout_choose.setBackgroundColor(getResources().getColor([/align]
[align=left] R.color. base_color_text_white));[/align]
[align=left] layout_photo.setBackgroundDrawable(getResources().getDrawable([/align]
[align=left] R.drawable. pop_bg_press));[/align]
[align=left] File dir = new File(BmobConstants.MyAvatarDir );[/align]
if (!dir.exists())
{
[align=left] dir.mkdirs();[/align]
[align=left] }[/align]
[align=left] //http://www.2cto.com/kf/201410/345874.html[/align]
[align=left] // 原图[/align]
File file = new File(dir, new SimpleDateFormat("yyMMddHHmmss" )
[align=left] .format( new Date()));[/align]
filePath =
file.getAbsolutePath();// 获取相片的保存路径
[align=left] Uri imageUri = Uri.fromFile(file);[/align]
[align=left]
[/align]
[align=left] Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE );[/align]
intent.putExtra(MediaStore. EXTRA_OUTPUT,
imageUri);
[align=left] startActivityForResult(intent,[/align]
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_CAMERA);[/align]
[align=left] }[/align]
[align=left] });[/align]
layout_choose.setOnClickListener(new OnClickListener()
{
[align=left]
[/align]
[align=left] @Override[/align]
public void onClick(View
arg0) {
// TODO Auto-generated
method stub
[align=left] ShowLog( "点击相册" );[/align]
[align=left] layout_photo.setBackgroundColor(getResources().getColor([/align]
[align=left] R.color. base_color_text_white));[/align]
[align=left] layout_choose.setBackgroundDrawable(getResources().getDrawable([/align]
[align=left] R.drawable. pop_bg_press));[/align]
[align=left] Intent intent = new Intent(Intent.ACTION_PICK , null);[/align]
[align=left] intent.setDataAndType([/align]
[align=left] MediaStore.Images.Media. EXTERNAL_CONTENT_URI, "image/*");[/align]
[align=left] startActivityForResult(intent,[/align]
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_LOCATION );[/align]
[align=left] }[/align]
[align=left] });[/align]
[align=left]
[/align]
avatorPop = new PopupWindow(view, mScreenWidth,
600);
avatorPop.setTouchInterceptor(new OnTouchListener()
{
[align=left] @Override[/align]
public boolean onTouch(View
v, MotionEvent event) {
if (event.getAction()
== MotionEvent.ACTION_OUTSIDE )
{
[align=left] avatorPop.dismiss();[/align]
[align=left] return true ;[/align]
[align=left] }[/align]
[align=left] return false ;[/align]
[align=left] }[/align]
[align=left] });[/align]
[align=left]
[/align]
[align=left] avatorPop.setWidth(WindowManager.LayoutParams.MATCH_PARENT);[/align]
[align=left] avatorPop.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);[/align]
[align=left] avatorPop.setTouchable(true);[/align]
[align=left] avatorPop.setFocusable(true);[/align]
[align=left] avatorPop.setOutsideTouchable(true);[/align]
[align=left] avatorPop.setBackgroundDrawable(new BitmapDrawable());[/align]
[align=left] // 动画效果 从底部弹起[/align]
[align=left] avatorPop.setAnimationStyle(R.style.Animations_GrowFromBottom);[/align]
avatorPop.showAtLocation(layout_all ,
Gravity.BOTTOM, 0, 0);
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]2.回调[/align]
[align=left][/align]
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
// TODO Auto-generated
method stub
super.onActivityResult(requestCode,
resultCode, data);
switch (requestCode)
{
case BmobConstants.REQUESTCODE_UPLOADAVATAR_CAMERA ://
拍照修改头像
if (resultCode
== RESULT_OK) {
[align=left] if (!Environment.getExternalStorageState().equals([/align]
Environment. MEDIA_MOUNTED))
{
[align=left] ShowToast( "SD不可用");[/align]
[align=left] return;[/align]
[align=left] }[/align]
[align=left] isFromCamera = true ;[/align]
[align=left] File file = new File(filePath );[/align]
degree =
PhotoUtil.readPictureDegree(file.getAbsolutePath());
[align=left] Log. i("life", "拍照后的角度:" + degree);[/align]
startImageAction(Uri. fromFile(file), 200,
200,
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_CROP, true);[/align]
[align=left] }[/align]
[align=left] break;[/align]
case BmobConstants.REQUESTCODE_UPLOADAVATAR_LOCATION ://
本地修改头像
if (avatorPop != null)
{
[align=left] avatorPop.dismiss();[/align]
[align=left] }[/align]
[align=left] Uri uri = null;[/align]
if (data
== null) {
[align=left] return;[/align]
[align=left] }[/align]
if (resultCode
== RESULT_OK) {
[align=left] if (!Environment.getExternalStorageState().equals([/align]
Environment. MEDIA_MOUNTED))
{
[align=left] ShowToast( "SD不可用");[/align]
[align=left] return;[/align]
[align=left] }[/align]
[align=left] isFromCamera = false ;[/align]
[align=left] uri = data.getData();[/align]
[align=left] startImageAction(uri, 200, 200,[/align]
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_CROP, true);[/align]
[align=left] } else {[/align]
[align=left] ShowToast( "照片获取失败" );[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] break;[/align]
case BmobConstants.REQUESTCODE_UPLOADAVATAR_CROP ://
裁剪头像返回
// TODO sent
to crop
if (avatorPop != null)
{
[align=left] avatorPop.dismiss();[/align]
[align=left] }[/align]
if (data
== null) {
// Toast.makeText(this,
"取消选择", Toast.LENGTH_SHORT).show();
[align=left] return;[/align]
[align=left] } else {[/align]
[align=left] saveCropAvator(data);[/align]
[align=left] }[/align]
[align=left] // 初始化文件路径[/align]
[align=left] filePath = "";[/align]
[align=left] // 上传头像[/align]
[align=left] uploadAvatar();[/align]
[align=left] break;[/align]
[align=left] default:[/align]
[align=left] break;[/align]
[align=left]
[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]3.图片的裁剪[/align]
[align=left]
[/align]
private void startImageAction(Uri
uri, int outputX, int outputY,
int requestCode, boolean isCrop)
{
[align=left] Intent intent = null;[/align]
if (isCrop)
{
[align=left] intent = new Intent("com.android.camera.action.CROP" );[/align]
[align=left] } else {[/align]
[align=left] intent = new Intent(Intent.ACTION_GET_CONTENT , null);[/align]
[align=left] }[/align]
[align=left] intent.setDataAndType(uri, "image/*");[/align]
[align=left] intent.putExtra( "crop", "true" );[/align]
intent.putExtra( "aspectX",
1);
intent.putExtra( "aspectY",
1);
intent.putExtra( "outputX",
outputX);
intent.putExtra( "outputY",
outputY);
[align=left] intent.putExtra( "scale", true );[/align]
intent.putExtra(MediaStore. EXTRA_OUTPUT,
uri);
[align=left] intent.putExtra( "return-data", true );[/align]
intent.putExtra( "outputFormat",
Bitmap.CompressFormat.JPEG .toString());
intent.putExtra( "noFaceDetection", true); //
no face detection
[align=left] startActivityForResult(intent, requestCode);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]4.保存裁剪的图片[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 保存裁剪的头像[/align]
[align=left] *[/align]
[align=left] * @param data[/align]
[align=left] */[/align]
private void saveCropAvator(Intent
data) {
[align=left] Bundle extras = data.getExtras();[/align]
if (extras
!= null) {
[align=left] Bitmap bitmap = extras.getParcelable("data" );[/align]
Log. i("life", "avatar
- bitmap = " + bitmap);
if (bitmap
!= null) {
[align=left] bitmap = PhotoUtil.toRoundCorner(bitmap, 10);[/align]
if (isFromCamera && degree !=
0) {
bitmap = PhotoUtil.rotaingImageView(degree,
bitmap);
[align=left] }[/align]
[align=left] iv_set_avator.setImageBitmap(bitmap);[/align]
[align=left] // 保存图片[/align]
[align=left] String filename = new SimpleDateFormat("yyMMddHHmmss" )[/align]
[align=left] .format( new Date())+".png";[/align]
path =
BmobConstants. MyAvatarDir +
filename;
PhotoUtil. saveBitmap(BmobConstants.MyAvatarDir,
filename,
[align=left] bitmap, true);[/align]
[align=left] // 上传头像[/align]
if (bitmap
!= null &&
bitmap.isRecycled()) {
[align=left] bitmap.recycle();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]4.上传头像[/align]
[align=left]
[/align]
private void uploadAvatar()
{
[align=left] BmobLog. i("头像地址:" + path);[/align]
final BmobFile
bmobFile = new BmobFile(new File(path ));
bmobFile.upload( this, new UploadFileListener()
{
[align=left]
[/align]
[align=left] @Override[/align]
public void onSuccess()
{
// TODO Auto-generated
method stub
[align=left] String url = bmobFile.getFileUrl(SetMyInfoActivity.this );[/align]
[align=left] // 更新BmobUser对象[/align]
[align=left] updateUserAvatar(url);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void onProgress(Integer
arg0) {
// TODO Auto-generated
method stub
[align=left]
[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void onFailure(int arg0,
String msg) {
// TODO Auto-generated
method stub
ShowToast( "头像上传失败:" +
msg);
[align=left] }[/align]
[align=left] });[/align]
[align=left] }[/align]
[align=left]
[/align]
private void updateUserAvatar(final String
url) {
[align=left] User u = new User();[/align]
[align=left] u.setAvatar(url);[/align]
updateUserData(u, new UpdateListener()
{
[align=left] @Override[/align]
public void onSuccess()
{
// TODO Auto-generated
method stub
[align=left] ShowToast( "头像更新成功!" );[/align]
[align=left] // 更新头像[/align]
[align=left] refreshAvatar(url);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void onFailure(int code,
String msg) {
// TODO Auto-generated
method stub
ShowToast( "头像更新失败:" +
msg);
[align=left] }[/align]
[align=left] });[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
private void updateUserData(User
user,UpdateListener listener){
[align=left] User current = (User) userManager.getCurrentUser(User.class);[/align]
[align=left] user.setObjectId(current.getObjectId());[/align]
user.update( this,
listener);
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left] /**[/align]
[align=left] * 更新头像 refreshAvatar[/align]
[align=left] *[/align]
[align=left] * @return void[/align]
[align=left] * @throws[/align]
[align=left] */[/align]
private void refreshAvatar(String
avatar) {
if (avatar
!= null &&
!avatar.equals("" )) {
[align=left] ImageLoader. getInstance().displayImage(avatar, iv_set_avator,[/align]
[align=left] ImageLoadOptions. getOptions());[/align]
[align=left] } else {[/align]
[align=left] iv_set_avator.setImageResource(R.drawable.default_head);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]用到的工具类[/align]
[align=left]
[/align]
package com.bmob.im.demo.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.media.ExifInterface;
import android.media.ThumbnailUtils;
public class PhotoUtil {
/**
* 回收垃圾 recycle
*
* @throws
*/
public static void recycle(Bitmap bitmap) {
// 先判断是否已经回收
if (bitmap != null && !bitmap.isRecycled()) {
// 回收并且置为null
bitmap.recycle();
bitmap = null;
}
System.gc();
}
/**
* 获取指定路径下的图片的指定大小的缩略图 getImageThumbnail
*
* @return Bitmap
* @throws
*/
public static Bitmap getImageThumbnail(String imagePath, int width,
int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意此处的bitmap为null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 设为 false
// 计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}
/**
* saveBitmap
*
* @param @param filename---完整的路径格式-包含目录以及文件名
* @param @param bitmap
* @param @param isDelete --是否只留一张
* @return void
* @throws
*/
public static void saveBitmap(String dirpath, String filename,
Bitmap bitmap, boolean isDelete) {
File dir = new File(dirpath);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dirpath, filename);
// 若存在即删除-默认只保留一张
if (isDelete) {
if (file.exists()) {
file.delete();
}
}
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static File getFilePath(String filePath, String fileName) {
File file = null;
makeRootDirectory(filePath);
try {
file = new File(filePath + fileName);
if (!file.exists()) {
file.createNewFile();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
public static void makeRootDirectory(String filePath) {
File file = null;
try {
file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
} catch (Exception e) {
}
}
/**
*
* 读取图片属性:旋转的角度
* @param path 图片绝对路径
* @return degree旋转的角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/** 旋转图片一定角度
* rotaingImageView
* @return Bitmap
* @throws
*/
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
// 旋转图片 动作
Matrix matrix = new Matrix();
matrix.postRotate(angle);
// 创建新的图片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return resizedBitmap;
}
/**
* 将图片变为圆角
*
* @param bitmap
* 原Bitmap图片
* @param pixels
* 图片圆角的弧度(单位:像素(px))
* @return 带有圆角的图片(Bitmap 类型)
*/
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
/**
* 将图片转化为圆形头像
*
* @Title: toRoundBitmap
* @throws
*/
public static Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
if (width <= height) {
roundPx = width / 2;
left = 0;
top = 0;
right = width;
bottom = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
} else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
}
Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect src = new Rect((int) left, (int) top, (int) right,
(int) bottom);
final Rect dst = new Rect((int) dst_left, (int) dst_top,
(int) dst_right, (int) dst_bottom);
final RectF rectF = new RectF(dst);
paint.setAntiAlias(true);// 设置画笔无锯齿
canvas.drawARGB(0, 0, 0, 0); // 填充整个Canvas
// 以下有两种方法画圆,drawRounRect和drawCircle
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// 画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。
// canvas.drawCircle(roundPx, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));// 设置两张图片相交时的模式,参考http://trylovecatch.iteye.com/blog/1189452
canvas.drawBitmap(bitmap, src, dst, paint); // 以Mode.SRC_IN模式合并bitmap和已经draw了的Circle
return output;
}
}
[align=left] [/align]
[align=left]
[/align]
[align=left][/align]
private void showAvatarPop()
{
[align=left] View view = LayoutInflater.from(this).inflate(R.layout. pop_showavator,[/align]
[align=left] null);[/align]
layout_choose =
(RelativeLayout) view.findViewById(R.id.layout_choose );
layout_photo =
(RelativeLayout) view.findViewById(R.id.layout_photo );
layout_photo.setOnClickListener(new OnClickListener()
{
[align=left]
[/align]
[align=left] @Override[/align]
public void onClick(View
arg0) {
[align=left] ShowLog( "点击拍照" );[/align]
// TODO Auto-generated
method stub
[align=left] layout_choose.setBackgroundColor(getResources().getColor([/align]
[align=left] R.color. base_color_text_white));[/align]
[align=left] layout_photo.setBackgroundDrawable(getResources().getDrawable([/align]
[align=left] R.drawable. pop_bg_press));[/align]
[align=left] File dir = new File(BmobConstants.MyAvatarDir );[/align]
if (!dir.exists())
{
[align=left] dir.mkdirs();[/align]
[align=left] }[/align]
[align=left] //http://www.2cto.com/kf/201410/345874.html[/align]
[align=left] // 原图[/align]
File file = new File(dir, new SimpleDateFormat("yyMMddHHmmss" )
[align=left] .format( new Date()));[/align]
filePath =
file.getAbsolutePath();// 获取相片的保存路径
[align=left] Uri imageUri = Uri.fromFile(file);[/align]
[align=left]
[/align]
[align=left] Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE );[/align]
intent.putExtra(MediaStore. EXTRA_OUTPUT,
imageUri);
[align=left] startActivityForResult(intent,[/align]
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_CAMERA);[/align]
[align=left] }[/align]
[align=left] });[/align]
layout_choose.setOnClickListener(new OnClickListener()
{
[align=left]
[/align]
[align=left] @Override[/align]
public void onClick(View
arg0) {
// TODO Auto-generated
method stub
[align=left] ShowLog( "点击相册" );[/align]
[align=left] layout_photo.setBackgroundColor(getResources().getColor([/align]
[align=left] R.color. base_color_text_white));[/align]
[align=left] layout_choose.setBackgroundDrawable(getResources().getDrawable([/align]
[align=left] R.drawable. pop_bg_press));[/align]
[align=left] Intent intent = new Intent(Intent.ACTION_PICK , null);[/align]
[align=left] intent.setDataAndType([/align]
[align=left] MediaStore.Images.Media. EXTERNAL_CONTENT_URI, "image/*");[/align]
[align=left] startActivityForResult(intent,[/align]
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_LOCATION );[/align]
[align=left] }[/align]
[align=left] });[/align]
[align=left]
[/align]
avatorPop = new PopupWindow(view, mScreenWidth,
600);
avatorPop.setTouchInterceptor(new OnTouchListener()
{
[align=left] @Override[/align]
public boolean onTouch(View
v, MotionEvent event) {
if (event.getAction()
== MotionEvent.ACTION_OUTSIDE )
{
[align=left] avatorPop.dismiss();[/align]
[align=left] return true ;[/align]
[align=left] }[/align]
[align=left] return false ;[/align]
[align=left] }[/align]
[align=left] });[/align]
[align=left]
[/align]
[align=left] avatorPop.setWidth(WindowManager.LayoutParams.MATCH_PARENT);[/align]
[align=left] avatorPop.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);[/align]
[align=left] avatorPop.setTouchable(true);[/align]
[align=left] avatorPop.setFocusable(true);[/align]
[align=left] avatorPop.setOutsideTouchable(true);[/align]
[align=left] avatorPop.setBackgroundDrawable(new BitmapDrawable());[/align]
[align=left] // 动画效果 从底部弹起[/align]
[align=left] avatorPop.setAnimationStyle(R.style.Animations_GrowFromBottom);[/align]
avatorPop.showAtLocation(layout_all ,
Gravity.BOTTOM, 0, 0);
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]2.回调[/align]
[align=left][/align]
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
// TODO Auto-generated
method stub
super.onActivityResult(requestCode,
resultCode, data);
switch (requestCode)
{
case BmobConstants.REQUESTCODE_UPLOADAVATAR_CAMERA ://
拍照修改头像
if (resultCode
== RESULT_OK) {
[align=left] if (!Environment.getExternalStorageState().equals([/align]
Environment. MEDIA_MOUNTED))
{
[align=left] ShowToast( "SD不可用");[/align]
[align=left] return;[/align]
[align=left] }[/align]
[align=left] isFromCamera = true ;[/align]
[align=left] File file = new File(filePath );[/align]
degree =
PhotoUtil.readPictureDegree(file.getAbsolutePath());
[align=left] Log. i("life", "拍照后的角度:" + degree);[/align]
startImageAction(Uri. fromFile(file), 200,
200,
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_CROP, true);[/align]
[align=left] }[/align]
[align=left] break;[/align]
case BmobConstants.REQUESTCODE_UPLOADAVATAR_LOCATION ://
本地修改头像
if (avatorPop != null)
{
[align=left] avatorPop.dismiss();[/align]
[align=left] }[/align]
[align=left] Uri uri = null;[/align]
if (data
== null) {
[align=left] return;[/align]
[align=left] }[/align]
if (resultCode
== RESULT_OK) {
[align=left] if (!Environment.getExternalStorageState().equals([/align]
Environment. MEDIA_MOUNTED))
{
[align=left] ShowToast( "SD不可用");[/align]
[align=left] return;[/align]
[align=left] }[/align]
[align=left] isFromCamera = false ;[/align]
[align=left] uri = data.getData();[/align]
[align=left] startImageAction(uri, 200, 200,[/align]
[align=left] BmobConstants. REQUESTCODE_UPLOADAVATAR_CROP, true);[/align]
[align=left] } else {[/align]
[align=left] ShowToast( "照片获取失败" );[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] break;[/align]
case BmobConstants.REQUESTCODE_UPLOADAVATAR_CROP ://
裁剪头像返回
// TODO sent
to crop
if (avatorPop != null)
{
[align=left] avatorPop.dismiss();[/align]
[align=left] }[/align]
if (data
== null) {
// Toast.makeText(this,
"取消选择", Toast.LENGTH_SHORT).show();
[align=left] return;[/align]
[align=left] } else {[/align]
[align=left] saveCropAvator(data);[/align]
[align=left] }[/align]
[align=left] // 初始化文件路径[/align]
[align=left] filePath = "";[/align]
[align=left] // 上传头像[/align]
[align=left] uploadAvatar();[/align]
[align=left] break;[/align]
[align=left] default:[/align]
[align=left] break;[/align]
[align=left]
[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]3.图片的裁剪[/align]
[align=left]
[/align]
private void startImageAction(Uri
uri, int outputX, int outputY,
int requestCode, boolean isCrop)
{
[align=left] Intent intent = null;[/align]
if (isCrop)
{
[align=left] intent = new Intent("com.android.camera.action.CROP" );[/align]
[align=left] } else {[/align]
[align=left] intent = new Intent(Intent.ACTION_GET_CONTENT , null);[/align]
[align=left] }[/align]
[align=left] intent.setDataAndType(uri, "image/*");[/align]
[align=left] intent.putExtra( "crop", "true" );[/align]
intent.putExtra( "aspectX",
1);
intent.putExtra( "aspectY",
1);
intent.putExtra( "outputX",
outputX);
intent.putExtra( "outputY",
outputY);
[align=left] intent.putExtra( "scale", true );[/align]
intent.putExtra(MediaStore. EXTRA_OUTPUT,
uri);
[align=left] intent.putExtra( "return-data", true );[/align]
intent.putExtra( "outputFormat",
Bitmap.CompressFormat.JPEG .toString());
intent.putExtra( "noFaceDetection", true); //
no face detection
[align=left] startActivityForResult(intent, requestCode);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]4.保存裁剪的图片[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 保存裁剪的头像[/align]
[align=left] *[/align]
[align=left] * @param data[/align]
[align=left] */[/align]
private void saveCropAvator(Intent
data) {
[align=left] Bundle extras = data.getExtras();[/align]
if (extras
!= null) {
[align=left] Bitmap bitmap = extras.getParcelable("data" );[/align]
Log. i("life", "avatar
- bitmap = " + bitmap);
if (bitmap
!= null) {
[align=left] bitmap = PhotoUtil.toRoundCorner(bitmap, 10);[/align]
if (isFromCamera && degree !=
0) {
bitmap = PhotoUtil.rotaingImageView(degree,
bitmap);
[align=left] }[/align]
[align=left] iv_set_avator.setImageBitmap(bitmap);[/align]
[align=left] // 保存图片[/align]
[align=left] String filename = new SimpleDateFormat("yyMMddHHmmss" )[/align]
[align=left] .format( new Date())+".png";[/align]
path =
BmobConstants. MyAvatarDir +
filename;
PhotoUtil. saveBitmap(BmobConstants.MyAvatarDir,
filename,
[align=left] bitmap, true);[/align]
[align=left] // 上传头像[/align]
if (bitmap
!= null &&
bitmap.isRecycled()) {
[align=left] bitmap.recycle();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]4.上传头像[/align]
[align=left]
[/align]
private void uploadAvatar()
{
[align=left] BmobLog. i("头像地址:" + path);[/align]
final BmobFile
bmobFile = new BmobFile(new File(path ));
bmobFile.upload( this, new UploadFileListener()
{
[align=left]
[/align]
[align=left] @Override[/align]
public void onSuccess()
{
// TODO Auto-generated
method stub
[align=left] String url = bmobFile.getFileUrl(SetMyInfoActivity.this );[/align]
[align=left] // 更新BmobUser对象[/align]
[align=left] updateUserAvatar(url);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void onProgress(Integer
arg0) {
// TODO Auto-generated
method stub
[align=left]
[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void onFailure(int arg0,
String msg) {
// TODO Auto-generated
method stub
ShowToast( "头像上传失败:" +
msg);
[align=left] }[/align]
[align=left] });[/align]
[align=left] }[/align]
[align=left]
[/align]
private void updateUserAvatar(final String
url) {
[align=left] User u = new User();[/align]
[align=left] u.setAvatar(url);[/align]
updateUserData(u, new UpdateListener()
{
[align=left] @Override[/align]
public void onSuccess()
{
// TODO Auto-generated
method stub
[align=left] ShowToast( "头像更新成功!" );[/align]
[align=left] // 更新头像[/align]
[align=left] refreshAvatar(url);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public void onFailure(int code,
String msg) {
// TODO Auto-generated
method stub
ShowToast( "头像更新失败:" +
msg);
[align=left] }[/align]
[align=left] });[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
private void updateUserData(User
user,UpdateListener listener){
[align=left] User current = (User) userManager.getCurrentUser(User.class);[/align]
[align=left] user.setObjectId(current.getObjectId());[/align]
user.update( this,
listener);
[align=left] }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left] /**[/align]
[align=left] * 更新头像 refreshAvatar[/align]
[align=left] *[/align]
[align=left] * @return void[/align]
[align=left] * @throws[/align]
[align=left] */[/align]
private void refreshAvatar(String
avatar) {
if (avatar
!= null &&
!avatar.equals("" )) {
[align=left] ImageLoader. getInstance().displayImage(avatar, iv_set_avator,[/align]
[align=left] ImageLoadOptions. getOptions());[/align]
[align=left] } else {[/align]
[align=left] iv_set_avator.setImageResource(R.drawable.default_head);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]用到的工具类[/align]
[align=left]
[/align]
package com.bmob.im.demo.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.media.ExifInterface;
import android.media.ThumbnailUtils;
public class PhotoUtil {
/**
* 回收垃圾 recycle
*
* @throws
*/
public static void recycle(Bitmap bitmap) {
// 先判断是否已经回收
if (bitmap != null && !bitmap.isRecycled()) {
// 回收并且置为null
bitmap.recycle();
bitmap = null;
}
System.gc();
}
/**
* 获取指定路径下的图片的指定大小的缩略图 getImageThumbnail
*
* @return Bitmap
* @throws
*/
public static Bitmap getImageThumbnail(String imagePath, int width,
int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意此处的bitmap为null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 设为 false
// 计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}
/**
* saveBitmap
*
* @param @param filename---完整的路径格式-包含目录以及文件名
* @param @param bitmap
* @param @param isDelete --是否只留一张
* @return void
* @throws
*/
public static void saveBitmap(String dirpath, String filename,
Bitmap bitmap, boolean isDelete) {
File dir = new File(dirpath);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dirpath, filename);
// 若存在即删除-默认只保留一张
if (isDelete) {
if (file.exists()) {
file.delete();
}
}
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static File getFilePath(String filePath, String fileName) {
File file = null;
makeRootDirectory(filePath);
try {
file = new File(filePath + fileName);
if (!file.exists()) {
file.createNewFile();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
public static void makeRootDirectory(String filePath) {
File file = null;
try {
file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
} catch (Exception e) {
}
}
/**
*
* 读取图片属性:旋转的角度
* @param path 图片绝对路径
* @return degree旋转的角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/** 旋转图片一定角度
* rotaingImageView
* @return Bitmap
* @throws
*/
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
// 旋转图片 动作
Matrix matrix = new Matrix();
matrix.postRotate(angle);
// 创建新的图片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return resizedBitmap;
}
/**
* 将图片变为圆角
*
* @param bitmap
* 原Bitmap图片
* @param pixels
* 图片圆角的弧度(单位:像素(px))
* @return 带有圆角的图片(Bitmap 类型)
*/
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
/**
* 将图片转化为圆形头像
*
* @Title: toRoundBitmap
* @throws
*/
public static Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
if (width <= height) {
roundPx = width / 2;
left = 0;
top = 0;
right = width;
bottom = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
} else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
}
Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect src = new Rect((int) left, (int) top, (int) right,
(int) bottom);
final Rect dst = new Rect((int) dst_left, (int) dst_top,
(int) dst_right, (int) dst_bottom);
final RectF rectF = new RectF(dst);
paint.setAntiAlias(true);// 设置画笔无锯齿
canvas.drawARGB(0, 0, 0, 0); // 填充整个Canvas
// 以下有两种方法画圆,drawRounRect和drawCircle
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// 画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。
// canvas.drawCircle(roundPx, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));// 设置两张图片相交时的模式,参考http://trylovecatch.iteye.com/blog/1189452
canvas.drawBitmap(bitmap, src, dst, paint); // 以Mode.SRC_IN模式合并bitmap和已经draw了的Circle
return output;
}
}
[align=left] [/align]
[align=left]
[/align]
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories