2013-08-08 3 views
9

Я использую намерение для записи видео.android android.provider.MediaStore.ACTION_VIDEO_CAPTURE return null onActivityResult с nexus 7

поэтому я использую следующий код по щелчку кнопки recordVideo в

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

Этот код работает отлично с Samsung Galaxy Tab. Но не работает с Nexus 7. Может быть, Nexus 7 имеет переднюю камеру. , но у меня получилось, что данные, полученные в результате данных, имеют значение null onActivityResult.

так в моем LogCat я получил следующее исключение: -

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

Это есть андроид 4.3 OS версия –

ответ

8

Наконец я решил эту проблему. Nexus 7 Хранит видео в каталоге DCIM, но onActivityResults возвращает null. Его документированная проблема с устройством Nexus 7.

так решить эту проблему с intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
код выглядит: -

код на кнопку записи нажмите: -

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: -

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

ее работы для меня.

+2

У меня есть проблема с этим ответом является то, что если вы передаете местоположение EXTRA_OUTPUT намерения захвата видео, то большинство приложений камеры другого телефона не ведет себя должным образом. На некоторых более старых устройствах Samsung приложение камеры будет сбой при сохранении, на заметке галактики 1 с Android 4.1 приложение камеры сохранит файл, но не даст пользователю кнопку принять фотографию, она просто останется в приложении (они нужно нажать кнопку возврата, которая не очевидна). Смешанные результаты с другими приложениями/телефонами. Это означает, что нам нужно будет иметь логику для обнаружения телефона или приложения для камеры ... –

+0

да, вы правы, поэтому я поместил этот код только для Nexus. –

+0

если люди подавляют голос, то, пожалуйста, разместите здесь комментарий, чтобы я мог исправить свою ошибку. –

2

Спасибо за обходной путь!

Вот еще шлифованный и копипаст полезный код:

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

Проверено на Nexus 4 v4.3 JWR66Y