【问题标题】:Camera Intent, can't save photo to external storage相机意图,无法将照片保存到外部存储
【发布时间】:2013-04-23 20:37:04
【问题描述】:

我正在尝试通过 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;
}

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

谢谢。

【问题讨论】:

  • 检查externalStorage挂载与否。
  • 顺便说一句,所有相机应用程序都不会听您要求保存图像的位置。因此,无法保证您的图像会出现在您想要的位置。
  • @FahadIshaque 我会尝试事先运行 getExternalStorageState。
  • @StevenByle 有没有办法知道文件是否保存?
  • 你有没有检查过fileUri这句话后面的值是否正确(即不为null)? >>fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE)

标签: java android android-intent camera


【解决方案1】:

到目前为止的几点:

  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(); } 不必要(数据将始终为空)。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,我有这个权限。
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多