android.provider.MediaStore.ACTION_VIDEO_CAPTURE返回null onActivityResult与nexus 7

我正在使用意图录制video。

所以我使用recordVideobutton的点击下面的代码

Videofilepath = ""; Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE); startActivityForResult(intent,REQUEST_VIDEO_CAPTURED); 

并在onActivityResult

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case IMAGE_PICK: this.imageFromGallery(resultCode, data); break; case IMAGE_CAPTURE: this.imageFromCamera(resultCode, data); break; case REQUEST_VIDEO_CAPTURED: this.videoFromCamera(resultCode, data); break; default: break; } } } private void videoFromCamera(int resultCode, Intent data) { uriVideo = data.getData(); uploadedFileName=""; Constant.IS_FILE_ATTACH = true; Toast.makeText(PDFActivity.this, uriVideo.getPath(), Toast.LENGTH_LONG) .show(); String[] filePathColumn = { MediaStore.Video.Media.DATA }; Cursor cursor = getContentResolver().query(uriVideo, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); Videofilepath = filePath; System.out.println("Videofilepath filepath from camera : " + Videofilepath); cursor.close(); File f = new File(filePath); System.out.println("file created ? : " + f.exists()); Bitmap bMap = null; do { try { // Simulate network access. Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } while (!f.exists()); bMap = ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.MICRO_KIND); do { try { // Simulate network access. Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } while (bMap == null); imageOrVideo = "video"; attachmentvalue.setImageBitmap(bMap); } 

此代码与三星Galaxy Tab工作正常。 但不适用于Nexus 7.可能是Nexus 7有前置摄像头。 但结果数据意图是null onActivityResult。

所以在我的Logcat中,我得到了以下exception:

 08-08 12:51:31.160: E/AndroidRuntime(10899): FATAL EXCEPTION: main 08-08 12:51:31.160: E/AndroidRuntime(10899): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=200, result=-1, data=Intent { }} to activity {com.example.activity/com.example.PDFActivity}: java.lang.NullPointerException 

Solutions Collecting From Web of "android.provider.MediaStore.ACTION_VIDEO_CAPTURE返回null onActivityResult与nexus 7"

最后我解决了这个问题。 Nexus 7将video存储在DCIM目录中,但onActivityResults则返回null 。 它是Nexus 7设备logging的问题。

所以用intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);修复这个问题intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
代码是: –

代码loggingbutton点击: –

  intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE); fileUri = getOutputMediaFile(MEDIA_TYPE_VIDEO); // create a file to save the video in specific folder (this works for video only) 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 startActivityForResult(intent, REQUEST_VIDEO_CAPTURED_NEXUS); 

onActivityResult的switch – case块内的代码: –

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case REQUEST_VIDEO_CAPTURED_NEXUS: this.videoFromCameraNexus(resultCode, data); break; default: break; } } } 

// videoFromCameraNexus方法

 private void videoFromCameraNexus(int resultCode, Intent data) { if(fileUri != null) { Log.d(TAG, "Video saved to:\n" + fileUri); Log.d(TAG, "Video path:\n" + fileUri.getPath()); Log.d(TAG, "Video name:\n" + getName(fileUri)); // use uri.getLastPathSegment() if store in folder //use the file Uri. } } 

使用以下方法获取输出媒体文件uri

 public Uri getOutputMediaFile(int type) { // To be safe, you should check that the SDCard is mounted if(Environment.getExternalStorageState() != null) { // this works for Android 2.2 and above File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "SMW_VIDEO"); // 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(TAG, "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_VIDEO) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_"+ timeStamp + ".mp4"); } else { return null; } return Uri.fromFile(mediaFile); } return null; } 

它的作品给我。

感谢您的解决方法!

这里是更多的刷和复制粘贴可用的代码:

 /** * Create intent to take video. */ public static Intent createTakeVideoIntent() { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); Uri uri = getOutputVideoUri(); // create a file to save the video in specific folder if (uri != null) { intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); } intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high return intent; } @CheckForNull private static Uri getOutputVideoUri() { if (Environment.getExternalStorageState() == null) { return null; } File mediaStorage = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "YOUR_APP_VIDEO"); if (!mediaStorage.exists() && !mediaStorage.mkdirs()) { Log.e(YourApplication.TAG, "failed to create directory: " + mediaStorage); return null; } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()); File mediaFile = new File(mediaStorage, "VID_" + timeStamp + ".mp4"); return Uri.fromFile(mediaFile); } 

testingNexus 4 v4.3 JWR66Y

做了一个叉子,并通过存储到一个永久目录来解决问题,永久目录在收到结果后仍然可用。

https://github.com/pencilcheck/cordova-plugin-media-capture