【问题标题】:File path from Camera Intent来自相机意图的文件路径
【发布时间】:2013-02-22 14:21:03
【问题描述】:

我正在尝试获取使用相机意图作为字符串拍摄的图片的文件路径,但字符串 filePath 始终为空。我做错了什么?

       public void onClick(View arg0) {
        switch (arg0.getId()) {     
         case R.id.btnImageCapture:
            Intent openCamera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
               startActivityForResult(openCamera, OPEN_CAMERA); 
                 break;
           }
        }



        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         switch(requestCode){
         case OPEN_CAMERA:
             if (resultCode == RESULT_OK && data != null) {
                 Uri captureImage = data.getData();
                 String filePath = captureImage.getPath();
                 break;
              } 
           }
        }

【问题讨论】:

    标签: android file path


    【解决方案1】:

    这就是我获取相机拍摄图像的方式。

    我在保存图像之前创建文件,然后将其保存到我的文件中..

    File externalFile = new File("Whatever you want the path to be...");
    Uri uriSavedImage=Uri.fromFile(externalFile);
    Intent launchcameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    launchcameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
    startActivityForResult(launchcameraIntent,CAMERA_PIC_REQUEST);
    

    然后当收到结果时。

    protected void onActivityResult(int requestCode,int resultCode, Intent data) {
            if (resultCode == Activity.RESULT_OK) {
                if (requestCode == CAMERA_PIC_REQUEST) {
                      Bitmap photo = BitmapUtils.decodeFileForDisplay(new File("Whatever your file's path is");
                }
            }
    }
    

    【讨论】:

    • 为什么你认为它不适合你? CAMERA_PIC_REQUEST 是意图的 id,可以像 private static final int CAMERA_PIC_REQUEST = 123; 那样定义。 BitmapUtils.decode... 行是一个自定义方法。使用 BitmapFactory.decodeFile
    • 是的,但这对我不起作用。我什至没有收到错误消息或其他东西。它只是无所作为。我还尝试对 SDCARD 使用 WRITE_PERMISSIONS,但仍然无法正常工作。
    【解决方案2】:

    尝试以下将您的 captureImage Uri 作为参数传递:

        public String getRealPathFromURI(Uri contentUri) {
            String[] projx = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(contentUri, projx, null, null, null);
             int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    

    编辑:

    这是 getData() 在某些设备上返回 null 的常见错误。您需要使用预先插入的 Uri 来防止这种情况。示例:

      Intent cameraIntent = new Intent(
                    android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
     preinsertedUri = getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    new ContentValues());
    
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
    

    得到结果:

             @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        switch (requestCode) {
    
        case CAMERA_PIC_REQUEST:
    
            if (resultCode != 0 && data != null) {
    
                Uri imageUri = preinsertedUri;
                }
                  break; 
                     }
    

    【讨论】:

    • 这会使应用程序崩溃。 java.lang.RuntimeException:将结果 ResultInfo{who=null, request=2, result=-1, data=Intent { act=inline-data (has extras) }} 传递给活动 {my.test.app.MainActivity} 失败: java.lang.NullPointerException
    • 你在 Uri captureImage = data.getData(); 之后调用了这个方法吗? ?您是否检查了 captureImage Uri 是否为空?
    • 是的,我在 Uri captureImage 之后调用了该方法,但现在我发现 Uri 为空。可能是什么错误?
    • 我更新了我的答案。检查并告诉我 Uri 是否仍然为空。不要忘记将 preinsertedUri 声明为类字段
    • Uri 不再为空,我得到了图片的路径。完美的!非常感谢。 :D
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多