告诉相机意图保存拍摄的图片。

3
我正在执行以下操作:
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
final File storage = Environment.getExternalStorageDirectory();
final Uri uri = Uri.fromFile(new File(storage, System.currentTimeMillis() + ".jpg"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, id);

为了获取那张照片,我这样做:
private String getLastImagePath() {
    final String[] imageColumns = { MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA };
    final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
    final Cursor imageCursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns,
            null, null, imageOrderBy);
    if (imageCursor.moveToFirst()) {
        final String fullPath = imageCursor.getString(imageCursor
                .getColumnIndex(MediaStore.Images.Media.DATA));
        return fullPath;
    } else {
        throw new RuntimeException();
    }
}

然而,我不断收到像这样的消息:
07-02 14:46:54.751: E/BitmapFactory(23119): Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20130702_144653.jpg: open failed: ENOENT (No such file or directory)

如果我检查相册,发现照片并不在那里,所以我的猜测是 Intent 忽略了 MediaStore.EXTRA_OUTPUT 的值。
有什么办法可以不编写自己的相机解决方案吗?

2
你是否在清单文件中加入了这个权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />。 - Deepanker Chaudhary
真的需要吗?我的意思是,如果我使用一个没有互联网权限的应用程序进行共享意图,我仍然可以在Twitter上分享它。 - Charlie-Blake
2个回答

3

请这样使用:

意图:

             Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(takePicture, 0);

获取该结果的方法:

 protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
       super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

       switch(requestCode) {
       case 0:
           if(resultCode == RESULT_OK){
           Uri selectedImage = imageReturnedIntent.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

                   Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                   cursor.moveToFirst();

                   int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                  //file path of captured image
                   filePath = cursor.getString(columnIndex); 
                   //file path of captured image
                   File f = new File(filePath);
                   filename= f.getName();

                   Toast.makeText(SiteViewFieldCreate.this, "Your Path:"+filePath, 2000).show();
                   Toast.makeText(SiteViewFieldCreate.this, "Your Filename:"+filename, 2000).show();
                   cursor.close();

                 //Convert file path into bitmap image using below line.
                  // yourSelectedImage = BitmapFactory.decodeFile(filePath);


                  //put bitmapimage in your imageview
                  //yourimgView.setImageBitmap(yourSelectedImage);
      }
       break;
     }
    } 

在您的 manifest.xml 中添加此内容。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />


<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

希望这能给你提供一些解决方案。

接收图像的结果。 - Nirmal
2
没看到,算了。无论如何imageReturnedIntent.getData();返回null。 - Charlie-Blake
请按照这段代码进行操作,因为它对我有效。请参考此链接:https://dev59.com/wHE85IYBdhLWcg3wikAu#2737770,可能会对你有所帮助。 - Nirmal
请使用实体设备进行签入,不要使用模拟器进行签入。 - Nirmal
我正在检入一台Nexus 4。 - Charlie-Blake
你能获取文件名和文件路径吗? - Nirmal

1

Nirmals的解决方案在除Android 4.x(Apilevel 15)之外的所有设备上都正常运行。 似乎是一个bug,但是imageReturnedIntent.getData()总是返回null!(在模拟器和设备上测试过) 拍摄的照片甚至没有保存在externaldir中,因此任何尝试从ContentResolver获取最新的id或最大的date_added都将失败(返回卡中的最新照片而不是拍摄的照片)! 目前我没有解决这个问题的方法...似乎无法在Apilevel 15上获取拍摄图片的路径(虽然仍然可以获取可绘制对象并自己保存)...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接