2013-08-08 35 views
9

Tôi đang sử dụng ý định quay video.android android.provider.MediaStore.ACTION_VIDEO_CAPTURE trả lại null onActivityResult với nexus 7

vì vậy tôi sử dụng đoạn mã sau vào nhấp chuột vào nút recordVideo của

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

và trong 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); 
    } 

Mã này đang làm việc tốt với samsung galaxy Tab. Nhưng không hoạt động với Nexus 7. Có thể Nexus 7 có camera trước. nhưng tôi có ý định dữ liệu kết quả là null onActivityResult.

như vậy trong Logcat của tôi tôi đã nhận ngoại lệ sau đây: -

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 
+2

Nó có android phiên bản 4.3 OS –

Trả lời

8

Cuối cùng tôi giải quyết vấn đề này. Nexus 7 Lưu trữ video trong thư mục DCIM nhưng onActivityResults thư sẽ trả lại null. Đó là một vấn đề được ghi nhận với thiết bị Nexus 7.

để khắc phục vấn đề này với intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
mã là như sau: -

mã trên nút ghi nhấp chuột: -

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

mã bên switch - khối trường hợp onActivityResult: -

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

// videoFromCameraNối pháp phương pháp

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. 
     } 
    } 

Lấy tập tin đầu ra uri Truyền thông với các phương pháp sau đây

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

công trình của nó đối với tôi.

+2

Tôi có vấn đề với câu trả lời này là nếu bạn vượt qua vị trí EXTRA_OUTPUT đến mục đích quay video sau đó hầu hết các ứng dụng máy ảnh điện thoại khác không cư xử đúng. Trên một số thiết bị samsung cũ hơn, ứng dụng máy ảnh sẽ bị lỗi khi lưu, trên chú thích thiên hà 1 với android 4.1, ứng dụng máy ảnh sẽ lưu tệp nhưng sẽ không cấp cho người dùng nút chấp nhận ảnh, nó chỉ ở trong ứng dụng (họ phải nhấn nút quay lại không rõ ràng). Kết quả hỗn hợp với các ứng dụng/điện thoại khác. Điều này có nghĩa là chúng ta sẽ cần phải có logic để phát hiện điện thoại hoặc ứng dụng máy ảnh ... –

+0

vâng, bạn đúng đó là lý do tại sao tôi chỉ đặt mã này cho Nexus. –

+0

nếu mọi người bỏ phiếu, sau đó xin vui lòng đặt một bình luận ở đây, để tôi có thể sửa lỗi của tôi. –

2

Cảm ơn bạn đã giải quyết sự cố!

Đây là chải và nhiều hơn nữa copy-dán mã có thể sử dụng:

/** 
* 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); 
} 

Thử nghiệm trên Nexus 4 v4.3 JWR66Y