2

我正在尝试通过 Intent 调用相机并将用户拍摄的照片保存到 SD 卡中。我正在窃取 Google 的大部分代码,但他们保存照片的示例对我不起作用。

这是我到目前为止的代码:

public void takePhoto (View view) {
    // create Intent to take a picture and return control to the calling application
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

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

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            if (data!=null) {
            // Image captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
            }
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }
}

从那里,按下一个按钮,将用户带到相机,然后他们在那里拍照并确认。确认后,应用程序返回上一个活动,但使用此代码时,没有迹象表明照片已保存在设备上的任何位置:

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
      return Uri.fromFile(getOutputMediaFile(type));
}

/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "MyCameraApp");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

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

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date(type));
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "VID_"+ timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

我有权编写外部存储,不确定我在这里缺少什么。它是我放置代码的地方吗?

谢谢。

4

2 回答 2

2

到目前为止有几点:

  1. 你应该从你的new Date()句子中删除论点:

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());或者你最终会在 1970 年代约会

  2. 当您像intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);在告诉 Intent 一样调用 Intent 时,您希望文件出现在某个路径上。该代码使

    if (data!=null) { // Image captured and saved to fileUri specified in the Intent Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show(); }不必要的(数据将始终为空)。

您的文件是否出现在我们已经在您的日志中看到的路径中还有待观察,但它应该出现。

于 2013-04-23T22:49:42.660 回答
0

您是否设置了以下AndroidManifest权限?

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2013-04-23T20:58:50.833 回答