天天看點

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);
    }
}
           

繼續閱讀