使用安卓摄像头捕获视频后的空指针

时间:2016-01-29 19:18:39

标签: android android-camera

我试图在创建应用程序文件夹名称和SD卡中捕获视频。当我点击相机时,它会捕获视频,但是当我点击保存按钮时,我的应用程序崩溃了

body {
    counter-reset: count;
}

.question-number {
    counter-increment: count;
}

.question-number:after {
    content: counter(count);
}

这是我的日志cat错误:

public class MainActivity extends AppCompatActivity {

private Uri fileUri;
public static final int MEDIA_TYPE_VIDEO = 2;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
public static MainActivity ActivityContext =null;
public static TextView output;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    ActivityContext = this;

    Button buttonRecording = (Button)findViewById(R.id.recording);
    output = (TextView)findViewById(R.id.output);

    buttonRecording.setOnClickListener(new Button.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            // create new Intentwith with Standard Intent action that can be
            // sent to have the camera application capture an video and return it.
            Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

            // create a file to save the video
            fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);

            // set the image file name
            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

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

            // start the Video Capture Intent
            startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);





        }
    });



}
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
            Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

/** 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){

    // Check that the SDCard is mounted
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), "MyCameraVideo");


    // Create the storage directory(MyCameraVideo) if it does not exist
    if (! mediaStorageDir.exists()){

        if (! mediaStorageDir.mkdirs()){

            output.setText("Failed to create directory MyCameraVideo.");

            Toast.makeText(ActivityContext, "Failed to create directory MyCameraVideo.",
                    Toast.LENGTH_LONG).show();

            Log.d("MyCameraVideo", "Failed to create directory MyCameraVideo.");
            return null;
        }
    }


    // Create a media file name

    // For unique file name appending current timeStamp with file name
    java.util.Date date= new java.util.Date();
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
            .format(date.getTime());

    File mediaFile;

    if(type == MEDIA_TYPE_VIDEO) {

        // For unique video file name appending current timeStamp with file name
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "VID_"+ timeStamp + ".mp4");

    } else {
        return null;
    }

    return mediaFile;
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    // After camera screen this code will excuted

    if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {

        if (resultCode == RESULT_OK) {

            output.setText("Video File : " +data.getData());

            // Video captured and saved to fileUri specified in the Intent
           // Toast.makeText(this, "Video saved to:
                 //   " +
                  //  data.getData(), Toast.LENGTH_LONG).show();

        } else if (resultCode == RESULT_CANCELED) {

            output.setText("User cancelled the video capture.");

            // User cancelled the video capture
            Toast.makeText(this, "User cancelled the video capture.",
                    Toast.LENGTH_LONG).show();

        } else {

            output.setText("Video capture failed.");

            // Video capture failed, advise user
            Toast.makeText(this, "Video capture failed.",
                    Toast.LENGTH_LONG).show();
        }
    }
}
}

2 个答案:

答案 0 :(得分:1)

在你的onActivityResult()方法

您已编写代码行

    output.setText("Video File : " +data.getData()); 

这就是为什么应用程序崩溃的原因,对上面的代码行进行更改,以及对下面注释的行进行更改,以下是更改:

    output.setText("Video File: "+fileUri.getPath());

    Toast.makeText(this,"Video saved to: "+fileUri.getPath(),Toast.LENGTH_LONG).show(); 

答案 1 :(得分:0)

您需要使用随意图发送的fileUri。

如果您可以创建新文件,请尝试签入onActivityResult 来自fileUri你。

像这样:

new File(fileUri.getPath());

一旦你这样做,检查大小并测试文件。