Android中相机拍照并获取路径

本文介绍了在Android中如何调用系统相机拍照并获取照片的文件路径。提供了两种情况的解决方案:一种是通过ContentValues保存文件名并从onActivityResult()获取Uri;另一种是直接指定保存到固定文件夹并在onActivityResult()中处理。还包含了裁剪图片的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     Android中系统中,调用系统相机拍照并取得照片的文件做进一步的使用(裁剪、显示在View控件上、上传文件等)。

第一种情况:调用系统相机拍照保存在系统中并在onActvitiyResult()方法中,获取文件的UriBitmap对象。

                          代码如下: 

                          ------------------------------------------------------------------------------------------------

                                  // 调用系统相机拍照

             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

             //设置日期的转换格式

             SimpleDateFormat timeStampFormat =new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");

                //设置文件名

             String filename =timeStampFormat.format(new Date());

             //使用ContentValues保存文件名

             ContentValues values = newContentValues();

            values.put(MediaStore.Images.Media.TITLE, filename);

               //使用内容提供者,定义照片保存的Uri

             photoUri =getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);                      

             intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);

             startActivityForResult(intent, CAMREA_REQUEST_CODE);

         -------------------------------------------------------------------------------------------------

          onActivityResult()方法中获取数据

                          -------------------------------------------------------------------------------------------------

                                    //请求码等于相机的请求码,执行相应的操作

              if (requestCode== CAMREA_REQUEST_CODE && requestcode ==RESULT_OK) {

                   //判断返回的数据data是否为空,在三星s5、华为p7等机型上面有data为空的现象

                  if (data != null &&data.getData() != null) {

                      uri = data.getData();

                     if(data.hasExtra("data")){

                         Bitmap thunbnail = data.getParcelableExtra("data"); //获取照片的Bitmap对象,并设置

                      }

                   }

                      //如果data数据为空,就令uri==之前指定保存的照片的photoUri

                  if(uri == null) {

                      if(photoUri != null) {

                          uri= photoUri;

                         startPhotoZoom1(uri);//裁剪照片的方法

                      }

                  }

              }

         -------------------------------------------------------------------------------------------------

第二种情况:调用系统相机拍照,将照片保存在固定的文件目录下,在onActivityResult()方法中获取图片信息。这种情况下就不会                      发生datanull 的现象。

                          代码如下:

                         ------------------------------------------------------------------------------------------------         

             Intent intentFromCapture = newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

             File file = newFile(Environment.getExternalStorageDirectory().getPath()+"/wood/head/");

             //是否是文件夹,不是就创建文件夹

             if (!file.exists()) file.mkdirs();

              //指定保存路径

             cameraPath = Environment.getExternalStorageDirectory().getPath()+"/wood/head/" +

                          format.format(new Date()) + ".jpg";

             File imageFile = new File(cameraPath);

             //创建一个图片保存的Uri

             Uri imageFileUri = Uri.fromFile(imageFile);

             intentFromCapture.putExtra(MediaStore.Images.Media.ORIENTATION, 0);

             //设置MediaStore.EXTRA_OUTPUT的输出路径为imageFileUri

             intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);

             startActivityForResult(intentFromCapture, CAMERA_REQUEST_CODE);

                         

                          -------------------------------------------------------------------------------------------------

          onActivityResult()方法中获取数据

                          -------------------------------------------------------------------------------------------------

            /相机的请求编码

                case CAMERA_REQUEST_CODE:

                 isCamera =true;

                 startPhotoZoom(Uri.fromFile(new File(cameraPath)));

                 break;

            //相机、相册的图片再 剪辑完 在这地方上传

          case RESULT_REQUEST_CODE:

                if (isCamera){

                   upLoadPictrue(new File(cameraPath));

                } else {

                   String path = null;

                    if (android.os.Build.VERSION_CODES.KITKAT >= 19) {

                        path = new GetPicPath().getPath_above19(getActivity(), uri1);

                    }else {

                        path = getFilePath_below19(uri1);

                    }

                   upLoadPictrue(new File(path));

               }

               break;

 

          -------------------------------------------------------------------------------------------------

裁剪图片: 代码如下:

            public void startPhotoZoom1(Uri uri) {

                SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");

                Filefile = new File(Environment.getExternalStorageDirectory().getPath()+"/wood/head/");

                if (!file.exists())file.mkdirs();

                //指定保存路径

                              String photoPath = Environment.getExternalStorageDirectory().getPath()+ "/wood/head/"+

                                   timeStampFormat.format(newDate()) + ".jpg";

                if (uri ==null) {

                   System.out.println("The uri is not exist.");

                }

                Filefile1 = new File(photoPath);

                uri1 =Uri.fromFile(file1);

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

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

                intent.putExtra("crop", "true");//可裁剪

                                        intent.putExtra("aspectX", 1);

                intent.putExtra("aspectY", 1);

                intent.putExtra("outputX", 320);

                intent.putExtra("outputY", 320);

                intent.putExtra("scale", true);

                intent.putExtra(MediaStore.EXTRA_OUTPUT, uri1);//输出到指定的uri

                intent.putExtra("return-data", false);//若为false则表示不返回数据

                                        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

                intent.putExtra("noFaceDetection", true);

                startActivityForResult(intent, RESULT_REQUEST_CODE);

              }

          -------------------------------------------------------------------------------------------------

              public void startPhotoZoom(Uri uri){

                  if (uri ==null) {

                   //System.out.println("The uri is null.");

                  }

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

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

                 intent.putExtra("crop", "true");//可裁剪

                  intent.putExtra("aspectX", 1);

                 intent.putExtra("aspectY", 1);

                 intent.putExtra("outputX", 320);

                 intent.putExtra("outputY", 320);

                 intent.putExtra("scale", true);

                 intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);

                 intent.putExtra("return-data", false);//若为false则表示不返回数据

                  intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

                 intent.putExtra("noFaceDetection", true);

                 startActivityForResult(intent, RESULT_REQUEST_CODE);

             }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值