您的位置:首页 > 移动开发 > Android开发

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( thisnew 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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android