天天看點

android調用系統相機和相冊,圖檔裁剪

button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View view) {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(
                            SendMessageActivity.this);
                    builder.setTitle("選擇照片");

                    builder.setPositiveButton("相機",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                                    startActivityForResult(intent, );
                                }
                            });
                    builder.setNegativeButton("相冊",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                    startActivityForResult(intent, );
                                }
                            });
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            });
           
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        ContentResolver resolver = getContentResolver();

        if (data != null) {
            /**
             * 因為兩種方式都用到了startActivityForResult方法,這個方法執行完後都會執行onActivityResult方法
             * , 是以為了差別到底選擇了那個方式擷取圖檔要進行判斷
             * ,這裡的requestCode跟startActivityForResult裡面第二個參數對應 1== 相冊 0 ==相機
             */
            if (requestCode == ) {

                try {
                    // 獲得圖檔的uri
                    Uri originalUri = data.getData();
                    //将圖檔内容解析成位元組數組
                    byte[] bytes = readStream(resolver.openInputStream(Uri.parse(originalUri.toString())));
                    //将位元組數組轉為Bitmap
                    Bitmap myBitmap = getPicFromBytes(bytes, null);
                    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                    imageView.setImageBitmap(myBitmap);
                } catch (Exception e) {
                    Log.e("----->", e.getMessage());
                }

            } else if (requestCode == ) {

                Bundle bundle = data.getExtras();
                // 擷取相機傳回的資料,并轉換為Bitmap圖檔格式
                Bitmap bitmap = (Bitmap) bundle.get("data");
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                imageView.setImageBitmap(bitmap);

            }else if(requestCode == ){
                //TODO 得到裁剪的圖檔,愛幹啥,幹啥去吧
            }
        }
    }

    public static Bitmap getPicFromBytes(byte[] bytes, BitmapFactory.Options opts) {
        if (bytes != null)
            if (opts != null)
                return BitmapFactory.decodeByteArray(bytes, , bytes.length, opts);
            else
                return BitmapFactory.decodeByteArray(bytes, , bytes.length);

        return null;
    }

    public static byte[] readStream(InputStream inStream) throws Exception {
        byte[] buffer = new byte[];
        int len = -;
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        while ((len = inStream.read(buffer)) != -) {

            outStream.write(buffer, , len);
        }
        byte[] data = outStream.toByteArray();
        outStream.close();
        inStream.close();
        return data;

    }

    //将uri轉化為file
    private File uriToFile(Uri uri) {
        File file = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor actualimagecursor = managedQuery(uri, proj, null,
                null, null);
        int actual_image_column_index = actualimagecursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        actualimagecursor.moveToFirst();
        String img_path = actualimagecursor
                .getString(actual_image_column_index);
        file = new File(img_path);
        return file;
    }
/**
     * 裁剪圖檔
     */
    private void cutPhoto(Uri uri) {

        Intent intent = new Intent("com.android.camera.action.CROP");
        // 設定裁剪
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        // aspectX aspectY 是寬高的比例
        intent.putExtra("aspectX", );
        intent.putExtra("aspectY", );
        // outputX outputY 是裁剪圖檔寬高
        intent.putExtra("outputX", );
        intent.putExtra("outputY", );
        intent.putExtra("return-data", true);
        startActivityForResult(intent, );
    }