INTENT.ACTION_VIDEO_CAPTURE не сохраняет файл в пользовательском местоположении Uri

Я создал приложение, подобное этому. У кнопки есть кнопка, при нажатии кнопки начинается захват видео.

Теперь у меня есть такой код:

public class VideoCaptureComponentActivity extends Activity implements View.OnClickListener { VideoView vv; ImageButton ib; TextView tv; Intent i; final static int cameraData=0; File path = null; Uri myVideo; private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200; private Uri fileUri; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); vv= (VideoView) findViewById(R.id.vvVideoCapture); ib=(ImageButton) findViewById(R.id.btnVideo); ib.setOnClickListener(this); tv= (TextView) findViewById(R.id.tvFilePath); } @Override public void onClick(View v) { switch(v.getId()) { case R.id.btnVideo: Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); fileUri = getOutputMediaFileUri(); // create a file to save the video intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); // set the video image quality to high // start the Video Capture Intent startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { myVideo= data.getData(); tv.setText(myVideo.toString()); vv.setVideoURI(myVideo); vv.setMediaController(new MediaController(this)); vv.requestFocus(); vv.start(); } } } /** Create a file Uri for saving an image or video */ private static Uri getOutputMediaFileUri() { return Uri.fromFile(getOutputMediaFile()); } /** Create a File for saving an image or video */ private static File getOutputMediaFile() { File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ Log.d("MyCameraApp", "failed to create directory"); return null; } } File mediaFile; mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_CAPTURED" + ".mp4"); return mediaFile; } } 

Теперь после того, как я захватил видео, приложение сбой.

 07-06 17:12:09.447: E/AndroidRuntime(2917): FATAL EXCEPTION: main 07-06 17:12:09.447: E/AndroidRuntime(2917): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=200, result=-1, data=Intent { }} to activity {com.optimus.mobile.survey/com.optimus.mobile.survey.VideoCaptureComponentActivity}: java.lang.NullPointerException 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.app.ActivityThread.deliverResults(ActivityThread.java:3712) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3754) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.app.ActivityThread.access$2800(ActivityThread.java:135) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2162) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.os.Handler.dispatchMessage(Handler.java:99) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.os.Looper.loop(Looper.java:143) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.app.ActivityThread.main(ActivityThread.java:4914) 07-06 17:12:09.447: E/AndroidRuntime(2917): at java.lang.reflect.Method.invokeNative(Native Method) 07-06 17:12:09.447: E/AndroidRuntime(2917): at java.lang.reflect.Method.invoke(Method.java:521) 07-06 17:12:09.447: E/AndroidRuntime(2917): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 07-06 17:12:09.447: E/AndroidRuntime(2917): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 07-06 17:12:09.447: E/AndroidRuntime(2917): at dalvik.system.NativeStart.main(Native Method) 07-06 17:12:09.447: E/AndroidRuntime(2917): Caused by: java.lang.NullPointerException 07-06 17:12:09.447: E/AndroidRuntime(2917): at com.optimus.mobile.survey.VideoCaptureComponentActivity.onActivityResult(VideoCaptureComponentActivity.java:82) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.app.Activity.dispatchActivityResult(Activity.java:3931) 07-06 17:12:09.447: E/AndroidRuntime(2917): at android.app.ActivityThread.deliverResults(ActivityThread.java:3708) 07-06 17:12:09.447: E/AndroidRuntime(2917): ... 11 more 

В основном проблема заключается в том, что
В коде

 Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); fileUri = getOutputMediaFileUri(); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); 

Здесь он не сохраняет файл в установленном местоположении, я не знаю, в чем проблема. Я взял этот код из этой ссылки http://developer.android.com/guide/topics/media/camera.html

Нет, если вы передаете Uri для сохранения изображения или видео с помощью putExtra(MediaStore.EXTRA_OUTPUT, fileUri); data.getData(); вы всегда получаете data.getData(); В onActivityResult как NULL . Поэтому используйте Uri изображения или Видео, переданные с намерением как:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { // myVideo= data.getData(); tv.setText("Video"); vv.setVideoURI(fileUri);//set Uri here which you passed with Intent vv.setMediaController(new MediaController(this)); vv.requestFocus(); vv.start(); } } } 
 private static String FILE_NAM1 = "video_one"; protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(requestCode == VIDEO_ACTIVITY) { Uri videoFileUri = data.getData(); String outputfile = getFilesDir() + File.separator+FILE_NAM1+"_tmp.mp4"; try { InputStream in = getContentResolver().openInputStream(videoFileUri); MainActivity.createFileFromInputStream(in, outputfile); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("saved uri is "+videoFileUri.toString()); Intent intent = new Intent(getBaseContext(), VideoActivity.class); intent.putExtra("video_uri",videoFileUri); startActivity(intent); } } private static File createFileFromInputStream(InputStream inputStream, String fileName) { try{ File f = new File(fileName); f.setWritable(true, false); OutputStream outputStream = new FileOutputStream(f); byte buffer[] = new byte[1024]; int length = 0; while((length=inputStream.read(buffer)) > 0) { outputStream.write(buffer,0,length); } outputStream.close(); inputStream.close(); return f; }catch (IOException e) { System.out.println("error in creating a file"); e.printStackTrace(); } return null; } 

Remove intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri); От намерения

Я использую этот код для записи и сохранения видео:

 private String name_vid; private static int REC_VIDEO = 1; public void rec_vid(View v) { //set name & path to vid name_vid = Environment.getExternalStorageDirectory()+"/videos/myvid.mp4"; //check if folder exists, else, create it File path = new File(Environment.getExternalStorageDirectory()+"/videos/"); if (!path.exists()) path.mkdirs(); //create the intent Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); int code = REC_VIDEO; Uri output = Uri.fromFile(new File(name_vid)); //Add extra to save video intent.putExtra(MediaStore.EXTRA_OUTPUT, output); startActivityForResult(intent, code); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REC_VIDEO) { if (resultCode == -1) { //create a MediaScanner to save the vid into the indicate path new MediaScannerConnectionClient() { private MediaScannerConnection msc = null; { msc = new MediaScannerConnection( getApplicationContext(), this); msc.connect(); } public void onMediaScannerConnected() { msc.scanFile(name_vid, null); } public void onScanCompleted(String path, Uri uri) { msc.disconnect(); } }; Toast.makeText(this,"Video saved succesfull", Toast.LENGTH_SHORT).show(); } } } 

Помните, что вы должны установить использование разрешений в манифестах:

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