天天看点

Android调用相机及使用图库截取图片

/*
 *  @Copyright (c) tianchenglin
 *  @Author TCL
 *  @Date 2016.8.5
 */

package com.study.tcl.upload;

import android.app.Activity;
import android.content.Intent;
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.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int TAKE_PHOTO = 1;
    private static final int GALLARY = 2;
    private static final int CUT_PICTURE = 3;
    private int WIDTH = 1;
    private int HEIGHT = 1;

    private Intent intent;
    private Uri imageUri;

    private Button mBtnSelect;
    private AlertDialog mSelectDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        //选择图片来源按钮
        mBtnSelect = (Button) findViewById(R.id.btn_select);
        //选择图片来源按钮的点击事件
        mBtnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showSelcetDialog();
            }
        });
    }

    /**
     * 显示选择图片对话框
     */
    private void showSelcetDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        View view = View.inflate(getApplicationContext(),
                R.layout.dialog_layout, null);
        builder.setView(view);
        mSelectDialog = builder.create();
        mSelectDialog.show();

        final TextView take_photo = (TextView) view.findViewById(R.id.take_photo);
        final TextView select_from_phone = (TextView) view.findViewById(R.id.select_from_phone);

        take_photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用系统相机去拍摄照片
                String sdStatus = Environment.getExternalStorageState();
                if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
                    Log.i("TestFile", "SD card is not avaiable/writeable right now.");
                    return;
                }
                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, TAKE_PHOTO);
            }
        });

        select_from_phone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                intent = new Intent(Intent.ACTION_GET_CONTENT, null);
                intent.setType("image/*");
                startActivityForResult(intent, GALLARY);
            }
        });
    }

    /**
     * 调用系统相机或图库返回的结果
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null || resultCode != Activity.RESULT_OK) {
            return;
        }
        switch (requestCode) {
            case TAKE_PHOTO://拍照后返回的结果
                Bundle bundle = data.getExtras();
                //获取相机返回的数据,并转化为bitmap格式
                Bitmap bitmap = (Bitmap) bundle.get("data");
                if (bitmap == null) {
                    return;
                }
//                String title = System.currentTimeMillis() + "";
//                //将图片保存到图库中
//                MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, title, null);
//                //更新图库
//                MediaScannerConnection.scanFile(this, new String[]{bitmap.getAbsolutePath()}, null, null);
                if (data.getData() != null) {
                    imageUri = data.getData();
                } else {
                    //返回图库中图片URI
                    imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null, null));
                }
                //调用CropImage方法进行截取图片
                toCropImage(imageUri, WIDTH, HEIGHT, 480, 320, CUT_PICTURE);
                break;
            case GALLARY://通过系统相册获取到图片并进行截取后的返回值
                if (data.getData() != null) {
                    toCropImage(data.getData(), WIDTH, HEIGHT, 480, 320, CUT_PICTURE);
                }
                break;
            case CUT_PICTURE://调用toCropImage方法截取图片后的返回值
                //截取后的逻辑...
                Toast.makeText(MainActivity.this, "----", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    /**
     * @param uri         图片的路径
     * @param width       截取框宽的比例
     * @param height      截取框高的比例
     * @param outputX     图片的宽
     * @param outputY     图片的高
     * @param requestCode 截取图片的请求码
     */
    private void toCropImage(Uri uri, int width, int height, int outputX, int outputY, int requestCode) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");//设置图片uri
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", width);
        intent.putExtra("aspectY", height);
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//设置截取完成后保存图片的地址
        intent.putExtra("return-data", false);//这里由于是从sd卡直接获取图片,所以不需要通过onActivityResult方法获取数据
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, requestCode);
    }
}
           

继续阅读