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

Android调用手机拍照以及从相册选择照片

2015-07-08 15:43 573 查看
Java代码  


/*用来标识请求照相功能的activity*/  

    private static final int CAMERA_WITH_DATA = 3023;  

  

    /*用来标识请求gallery的activity*/  

    private static final int PHOTO_PICKED_WITH_DATA = 3021;  

  

    /*拍照的照片存储位置*/  

    private static final File PHOTO_DIR = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera");  

  

    private File mCurrentPhotoFile;//照相机拍照得到的图片  

 

Java代码  


private void doPickPhotoAction() {  

            Context context = EditContact.this;  

          

            // Wrap our context to inflate list items using correct theme  

            final Context dialogContext = new ContextThemeWrapper(context,  

                    android.R.style.Theme_Light);  

            String cancel="返回";  

            String[] choices;  

            choices = new String[2];  

            choices[0] = getString(R.string.take_photo);  //拍照  

            choices[1] = getString(R.string.pick_photo);  //从相册中选择  

            final ListAdapter adapter = new ArrayAdapter<String>(dialogContext,  

                    android.R.layout.simple_list_item_1, choices);  

          

            final AlertDialog.Builder builder = new AlertDialog.Builder(  

                    dialogContext);  

            builder.setTitle(R.string.attachToContact);  

            builder.setSingleChoiceItems(adapter, -1,  

                    new DialogInterface.OnClickListener() {  

                        public void onClick(DialogInterface dialog, int which) {  

                            dialog.dismiss();  

                            switch (which) {  

                            case 0:{  

                                String status=Environment.getExternalStorageState();  

                                if(status.equals(Environment.MEDIA_MOUNTED)){//判断是否有SD卡  

                                    doTakePhoto();// 用户点击了从照相机获取  

                                }  

                                else{  

                                    showToast("没有SD卡");  

                                }  

                                break;  

                                  

                            }  

                            case 1:  

                                doPickPhotoFromGallery();// 从相册中去获取  

                                break;  

                            }  

                        }  

                    });  

            builder.setNegativeButton(cancel, new DialogInterface.OnClickListener() {  

          

                @Override  

                public void onClick(DialogInterface dialog, int which) {  

                    dialog.dismiss();  

                }  

                  

            });  

            builder.create().show();  

        }  

    }  

      

    /** 

    * 拍照获取图片 

    *  

    */  

    protected void doTakePhoto() {  

        try {  

            // Launch camera to take photo for selected contact  

            PHOTO_DIR.mkdirs();// 创建照片的存储目录  

            mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());// 给新照的照片文件命名  

            final Intent intent = getTakePickIntent(mCurrentPhotoFile);  

            startActivityForResult(intent, CAMERA_WITH_DATA);  

        } catch (ActivityNotFoundException e) {  

            Toast.makeText(this, R.string.photoPickerNotFoundText,  

                    Toast.LENGTH_LONG).show();  

        }  

    }  

      

    public static Intent getTakePickIntent(File f) {  

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);  

        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));  

        return intent;  

    }  

      

    /** 

    * 用当前时间给取得的图片命名 

    *  

    */  

    private String getPhotoFileName() {  

        Date date = new Date(System.currentTimeMillis());  

        SimpleDateFormat dateFormat = new SimpleDateFormat(  

                "'IMG'_yyyy-MM-dd HH:mm:ss");  

        return dateFormat.format(date) + ".jpg";  

    }  

      

    // 请求Gallery程序  

    protected void doPickPhotoFromGallery() {  

        try {  

            // Launch picker to choose photo for selected contact  

            final Intent intent = getPhotoPickIntent();  

            startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);  

        } catch (ActivityNotFoundException e) {  

            Toast.makeText(this, R.string.photoPickerNotFoundText1,  

                    Toast.LENGTH_LONG).show();  

        }  

    }  

      

    // 封装请求Gallery的intent  

    public static Intent getPhotoPickIntent() {  

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);  

        intent.setType("image/*");  

        intent.putExtra("crop", "true");  

        intent.putExtra("aspectX", 1);  

        intent.putExtra("aspectY", 1);  

        intent.putExtra("outputX", 80);  

        intent.putExtra("outputY", 80);  

        intent.putExtra("return-data", true);  

        return intent;  

    }  

      

    // 因为调用了Camera和Gally所以要判断他们各自的返回情况,他们启动时是这样的startActivityForResult  

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  

        if (resultCode != RESULT_OK)  

            return;  

        switch (requestCode) {  

            case PHOTO_PICKED_WITH_DATA: {// 调用Gallery返回的  

                final Bitmap photo = data.getParcelableExtra("data");  

                // 下面就是显示照片了  

                System.out.println(photo);  

                //缓存用户选择的图片  

                img = getBitmapByte(photo);  

                mEditor.setPhotoBitmap(photo);  

                System.out.println("set new photo");  

                break;  

            }  

            case CAMERA_WITH_DATA: {// 照相机程序返回的,再次调用图片剪辑程序去修剪图片  

                doCropPhoto(mCurrentPhotoFile);  

                break;  

            }  

        }  

    }  

      

    protected void doCropPhoto(File f) {  

        try {  

            // 启动gallery去剪辑这个照片  

            final Intent intent = getCropImageIntent(Uri.fromFile(f));  

            startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);  

        } catch (Exception e) {  

            Toast.makeText(this, R.string.photoPickerNotFoundText,  

                    Toast.LENGTH_LONG).show();  

        }  

    }  

      

    /**  

    * Constructs an intent for image cropping. 调用图片剪辑程序  

    */  

    public static Intent getCropImageIntent(Uri photoUri) {  

        Intent intent = new Intent("com.android.camera.action.CROP");  

        intent.setDataAndType(photoUri, "image/*");  

        intent.putExtra("crop", "true");  

        intent.putExtra("aspectX", 1);  

        intent.putExtra("aspectY", 1);  

        intent.putExtra("outputX", 80);  

        intent.putExtra("outputY", 80);  

        intent.putExtra("return-data", true);  

        return intent;  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: