Android 相册和拍照设置头像功能

来源:互联网 发布:哪个yy协议软件好 编辑:程序博客网 时间:2024/05/09 00:34

前言 : 现在已经管不了我的名字到底干净不干净…坏蛋也好,什么都好,反正我要我的名字轰动全世界!!!

基础讲解

一般而言,使用拍照和裁剪功能基本上都是使用系统自带的Intent来实现,我们要将别人写好的Intent,那肯定要使用隐式Intent的方式来启用了.

拍照 : Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        // 指定调用相机拍照后照片的储存路径      intent.putExtra(MediaStore.EXTRA_OUTPUT,                Uri.fromFile(new File(TEMP_DIR, imageName)));裁剪 : Intent intent = new Intent(Intent.ACTION_PICK, null);      intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*"); 

剪切完成后的图片会设置一些属性
Exta Options Table for image/* crop:

这里写图片描述

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />      <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  

所需权限

代码讲解

布局比较简单就只有一个ImageView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.shao.cemerademo.MainActivity" >    <ImageView         android:id="@+id/imageview"        android:layout_width="64dp"        android:layout_height="64dp"        android:src="@drawable/ic_launcher"        /></RelativeLayout>

1.点击图片

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv = (ImageView) findViewById(R.id.imageview);        iv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                showMyDialog("相册", "拍照", SET_AVATAR);            }        });    }

2.弹出Dialog对话框选择相册还是拍照

// dialog---点击前往相册或者调用照相机,裁剪图片返回一个头像图片    private void showMyDialog(String title1, String titel2, final int Type) {        final AlertDialog dlg = new AlertDialog.Builder(this).create();        dlg.show();        Window window = dlg.getWindow();        // *** 主要就是在这里实现这种效果的.        // 设置窗口的内容页面,fy_dialog_alert.xml文件中定义view内容        window.setContentView(R.layout.fy_dialog_alert);        // 为确认按钮添加事件,执行操作        final TextView tv_content1 = (TextView) window                .findViewById(R.id.tv_content1);        tv_content1.setText(title1);        tv_content1.setOnClickListener(new View.OnClickListener() {            public void onClick(View v) {                if (Type == SET_AVATAR) {                    getImage(PHOTO_REQUEST_GALLERY);                }                dlg.cancel();            }        });        final TextView tv_content2 = (TextView) window                .findViewById(R.id.tv_content2);        tv_content2.setText(titel2);        tv_content2.setOnClickListener(new View.OnClickListener() {            public void onClick(View v) {                if (Type == SET_AVATAR) {                    getImage(PHOTO_REQUEST_TAKEPHOTO);                }                dlg.cancel();            }        });    }

3.无论是相册还是拍照,都是调用getImage()这个方法

private void getImage(int type) {        // 无论是相册还是拍照,先把预定的文件名确定好        getImageName();        if (!checkDir()) {            Toast.makeText(getApplicationContext(), "找不到存储卡...",                    Toast.LENGTH_LONG).show();            return;        }        if (type == PHOTO_REQUEST_TAKEPHOTO) {            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            // 指定调用相机拍照后照片的储存路径            intent.putExtra(MediaStore.EXTRA_OUTPUT,                    Uri.fromFile(new File(TEMP_DIR, imageName)));            startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO);            return;        }        if (type == PHOTO_REQUEST_GALLERY) {            Intent intent = new Intent(Intent.ACTION_PICK, null);            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                    "image/*");            startActivityForResult(intent, PHOTO_REQUEST_GALLERY);            return;        }    }其中有些方法做些简单的说明给图片命名
private String getImageName() {    // 用一个全局变量保存当前图片的文件名    imageName = getNowTime() + ".PNG";    return imageName;}
// 以当前时间作为图片的文件名,精确到秒    private String getNowTime() {        Date date = new Date(System.currentTimeMillis());        SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmssSS",                Locale.getDefault());        return dateFormat.format(date);    }    // 检查目录    private boolean checkDir() {        if (Environment.getExternalStorageState().equals(                Environment.MEDIA_MOUNTED)) {            File dir = new File(TEMP_DIR);            if (!dir.exists()) {                dir.mkdirs();            }            return true;        } else {            return false;        }    }

4,启动照相或者相册之后,onActivityResult处理返回值

@Override    public void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK) {            switch (requestCode) {            case PHOTO_REQUEST_TAKEPHOTO:                startPhotoZoom(Uri.fromFile(new File(TEMP_DIR, imageName)), 240);                break;            case PHOTO_REQUEST_GALLERY:                if (data != null)                    startPhotoZoom(data.getData(), 240);                break;            case PHOTO_REQUEST_CUT:                // 至此已经得到一个头像的图片,先在本地更新                File file = new File(TEMP_DIR, imageName);                bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());                if (bitmap == null) {                    Bundle extra = data.getExtras();                    if (extra != null) {                        bitmap = (Bitmap)extra.get("data");                          ByteArrayOutputStream stream = new ByteArrayOutputStream();                          bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);                        iv.setImageBitmap(bitmap);                    }                  }                break;            }        }    }    private void startPhotoZoom(Uri uri1, int size) {        Intent intent = new Intent("com.android.camera.action.CROP");        intent.setDataAndType(uri1, "image/*");        // crop为true是设置在开启的intent中设置显示的view可以剪裁        intent.putExtra("crop", "true");        // aspectX aspectY 是宽高的比例        intent.putExtra("aspectX", 1);        intent.putExtra("aspectY", 1);        // outputX,outputY 是剪裁图片的宽高        intent.putExtra("outputX", size);        intent.putExtra("outputY", size);        intent.putExtra("return-data", true);        intent.putExtra(MediaStore.EXTRA_OUTPUT,                Uri.fromFile(new File(TEMP_DIR, imageName)));        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG);        intent.putExtra("noFaceDetection", true); // no face detection        startActivityForResult(intent, PHOTO_REQUEST_CUT);    }

return-data:是将结果保存在data中返回,在onActivityResult中,直接调用intent.getdata()就可以获取值了,这里设为true,就是让它保存在data中。

源码

2 0