内置相机应用程序后神秘的NullpointerException正确保存我的视频

时间:2011-10-21 08:19:30

标签: android camera nullpointerexception

如果您打开对话框并点击图标,我有一项活动可让您录制视频。 问题是,在我停止录制后,即使正确保存视频,也会抛出NullPointerException。根据Log Cat,错误不在我的代码中,因此我尝试在我的代码中放置“检查点”,我发现即使我的活动的onActivityResult也正确执行,所以现在我不知道该怎么做。

以下是Log Cat:

enter image description here

代码:

这些来自我调用相机应用程序的对话框

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); 


intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
// start the Video Capture Intent

((Activity)context).startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);



private static Uri getOutputMediaFileUri(int type)
{ 
    return Uri.fromFile(getOutputMediaFile(type));
}


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.getExternalStorageDirectory()+"/Movies",   "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());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + "/" +
        "IMG_"+ timeStamp + ".jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + "/" +
        "VID_"+ timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

此代码或多或少是从Android开发者网站复制的。 正如我所提到的,即使我的活动的onActivityResult在此之后被正确执行(我解雇对话框)。

1 个答案:

答案 0 :(得分:0)

试试这个:

private static File getOutputMediaFile(int type)
{
  File mediaStorageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);

    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());
    String mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = "IMG_"+ timeStamp + ".jpg";
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = "VID_"+ timeStamp + ".mp4";
    } else {
        return null;
    }

    return new File(mediaStorageDir, mediaFile);
}

getExternalStorageDirectory方法返回一个File对象,而不是一个可以附加子目录的字符串。

它还想知道该方法返回的目录是否可用于服务。 Android规格说:

  

在具有多个用户的设备上(如UserManager所述)   用户拥有自己独立的外部存储空间。应用程序只有   访问他们正在运行的用户的外部存储。

LOL !!!!刚刚意识到这个问题是2年前被问到的!你找到答案了吗? LOL