2016-01-29 5 views
1

Я пытаюсь захватить видео в имени папки создания приложения и SD-карте. Когда я нажимаю камеру она захватывает видео, но когда я нажимаю на кнопку сохранить мое приложение падаетNull указатель после захвата видео с помощью камеры Android

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(); 
     } 
    } 
} 
} 

Вот моя ошибка журнала кошки:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference 

ответ

0

Вы должны использовать fileUri, что вы послали с целью ,

Попробуйте проверить onActivityResult, если вы можете создать новый файл из файла.

так:

new File(fileUri.getPath()); 

как только вы сделаете это, проверьте размер и проверить файл.

0

В вашем 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();