【问题标题】:How to get path of picture in onActivityresult (Intent data is null)如何在 onActivityresult 中获取图片路径(Intent 数据为空)
【发布时间】:2015-11-26 13:30:59
【问题描述】:

我必须启动相机,当用户拍完照片后,我必须将其拍摄并显示在视图中。

看着http://developer.android.com/guide/topics/media/camera.html我做了:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bLaunchCamera = (Button) findViewById(R.id.launchCamera);
        bLaunchCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "lanzando camara");

                //create intent to launch camera
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                imageUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); //create a file to save the image
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //set the image file name

                //start camera
                startActivityForResult(intent, CAMERA_REQUEST);
            }
        });

/**
     * Create a File Uri for saving image (can be sued to save video to)
     **/
    private Uri getOutputMediaFileUri(int mediaTypeImage) {
        return Uri.fromFile(getOutputMediaFile(mediaTypeImage));
    }

    /**
     * Create a File  for saving image (can be sued to save video to)
     **/
    private File getOutputMediaFile(int mediaType) {
        //To be safe, is necessary to check if SDCard is mounted

        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                (String) getResources().getText(R.string.app_name));

        //create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d(TAG, "failed to create directory");
                return null;
            }
        }

        //Create a media file name

        String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date());
        File mediaFile;

        if (mediaType == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");

        } else {
            return null;
        }
        return mediaFile;
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == CAMERA_REQUEST) {
            if(resultCode == RESULT_OK) {
                //Image captured and saved to fileUri specified in Intent
                Toast.makeText(this, "image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show();
                Log.d(TAG, "lanzando camara");
            } else if(resultCode == RESULT_CANCELED) {
                //user cancelled the image capture;
                Log.d(TAG, "usuario a cancelado la captura");
            } else {
                //image capture failed, advise user;
                Log.d(TAG, "algo a fallado");
            }
        }
    }

图片完成后,应用程序在尝试发送“Toast”信息时崩溃,因为“data”为空。

但如果我调试应用程序,我可以看到图像已保存。

所以我的问题是:如何在 onActivityResult 中获取路径?

【问题讨论】:

    标签: android android-intent android-camera-intent


    【解决方案1】:

    您面临的问题是,每当我们从相机意图中选择图像时,它可能会完成调用它的活动,因此您创建的 imageUri 对象将在您返回时为空。

    所以你需要在退出活动时保存它(进入相机意图),就像这样 -

        /**
         * Here we store the file url as it will be null after returning from camera
         * app
         */
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
    
            // save file url in bundle as it will be null on screen orientation
            // changes
            outState.putParcelable("file_uri", mImageUri);
        }
    

    当您返回活动时将其取回 -

        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
    
            // get the file url
            mImageUri = savedInstanceState.getParcelable("file_uri");
        }
    

    您的代码看起来不错,您只需在其中添加此更改即可。

    【讨论】:

      【解决方案2】:

      这是我用于捕获和保存相机图像然后将其显示到 imageview 的代码。您可以根据需要使用。

      您必须将相机图像保存到特定位置,然后从该位置获取,然后将其转换为字节数组。

      这是打开捕获相机图像活动的方法。

      private static final int CAMERA_PHOTO = 111;
      private Uri imageToUploadUri;
      
      private void captureCameraImage() {
              Intent chooserIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              File f = new File(Environment.getExternalStorageDirectory(), "POST_IMAGE.jpg");
              chooserIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
              imageToUploadUri = Uri.fromFile(f);
              startActivityForResult(chooserIntent, CAMERA_PHOTO);
          }
      
      @Override
              protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                  super.onActivityResult(requestCode, resultCode, data);
      
                  if (requestCode == CAMERA_PHOTO && resultCode == Activity.RESULT_OK) {
                      if(imageToUploadUri != null){
                          Uri selectedImage = imageToUploadUri;
                          getContentResolver().notifyChange(selectedImage, null);
                          Bitmap reducedSizeBitmap = getBitmap(imageToUploadUri.getPath());
                          if(reducedSizeBitmap != null){
                              ImgPhoto.setImageBitmap(reducedSizeBitmap);
                              Button uploadImageButton = (Button) findViewById(R.id.uploadUserImageButton);
                                uploadImageButton.setVisibility(View.VISIBLE);                
                          }else{
                              Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show();
                          }
                      }else{
                          Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show();
                      }
                  } 
              }
      

      这里是 onActivityResult() 中使用的 getBitmap() 方法。在获取相机捕获图像位图时,我已经完成了所有可能的性能改进。

      private Bitmap getBitmap(String path) {
      
              Uri uri = Uri.fromFile(new File(path));
              InputStream in = null;
              try {
                  final int IMAGE_MAX_SIZE = 1200000; // 1.2MP
                  in = getContentResolver().openInputStream(uri);
      
                  // Decode image size
                  BitmapFactory.Options o = new BitmapFactory.Options();
                  o.inJustDecodeBounds = true;
                  BitmapFactory.decodeStream(in, null, o);
                  in.close();
      
      
                  int scale = 1;
                  while ((o.outWidth * o.outHeight) * (1 / Math.pow(scale, 2)) >
                          IMAGE_MAX_SIZE) {
                      scale++;
                  }
                  Log.d("", "scale = " + scale + ", orig-width: " + o.outWidth + ", orig-height: " + o.outHeight);
      
                  Bitmap b = null;
                  in = getContentResolver().openInputStream(uri);
                  if (scale > 1) {
                      scale--;
                      // scale to max possible inSampleSize that still yields an image
                      // larger than target
                      o = new BitmapFactory.Options();
                      o.inSampleSize = scale;
                      b = BitmapFactory.decodeStream(in, null, o);
      
                      // resize to desired dimensions
                      int height = b.getHeight();
                      int width = b.getWidth();
                      Log.d("", "1th scale operation dimenions - width: " + width + ", height: " + height);
      
                      double y = Math.sqrt(IMAGE_MAX_SIZE
                              / (((double) width) / height));
                      double x = (y / height) * width;
      
                      Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x,
                              (int) y, true);
                      b.recycle();
                      b = scaledBitmap;
      
                      System.gc();
                  } else {
                      b = BitmapFactory.decodeStream(in);
                  }
                  in.close();
      
                  Log.d("", "bitmap size - width: " + b.getWidth() + ", height: " +
                          b.getHeight());
                  return b;
              } catch (IOException e) {
                  Log.e("", e.getMessage(), e);
                  return null;
              }
          }
      

      希望对你有帮助!

      【讨论】:

      • 是的!在这一行中找到了我的问题的解决方案 --> if(imageToUploadUri != null){ Uri selectedImage = imageToUploadUri;非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2013-02-07
      • 1970-01-01
      • 2012-06-05
      • 2016-12-18
      相关资源
      最近更新 更多