2013-08-08 28 views
9

Używam intencji do nagrywania wideo.android android.provider.MediaStore.ACTION_VIDEO_CAPTURE zwraca wartość null onActivityResult z nexus 7

więc używam następujący kod w przycisk recordVideo za kliknięcia

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

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

Ten kod działa poprawnie z Samsung Galaxy Tab. Ale nie działa z Nexusem 7. Może być Nexus 7 ma przedni aparat. ale otrzymałem wynikową intencję danych jest null onActivityResult.

więc moim logcat mam następujący wyjątek: -

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

mieć Android 4.3 OS wersję –

Odpowiedz

8

końcu rozwiązany ten problem. Nexus 7 Przechowuje wideo w katalogu DCIM, ale onActivityResults zwraca null. Jest to udokumentowany problem z urządzeniem Nexus 7.

więc rozwiązać ten problem z intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
kod jest jako: - kod

w przycisk rekord kliknięciem: -

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

wewnątrz przełącznika - Sprawa blok 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; 
      } 
     } 
    } 

// FilmFamCameraNexus method

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

pobrać plik URI wyjście mediów z następującą metodą

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

swoje prace dla mnie.

+2

Mam problem z tą odpowiedzią jest to, że jeśli przejdą lokalizację EXTRA_OUTPUT z zamiarem grabber następnie większość aplikacji aparatu drugi telefon za nie zachowują się właściwie. W przypadku niektórych starszych urządzeń Samsung aplikacja aparatu ulegnie awarii podczas zapisywania, w notatce galaktyki 1 z Androidem 4.1, aplikacja aparatu zapisze plik, ale nie da użytkownikowi przycisku akceptującego zdjęcie, po prostu pozostanie w aplikacji (nacisnąć przycisk powrotu, który nie jest oczywisty). Mieszane wyniki z innymi aplikacjami/telefonami. Oznacza to, że potrzebujemy logiki, aby wykryć telefon lub aplikację kamery ... –

+0

tak, masz rację, dlatego umieszczam ten kod tylko dla Nexusa. –

+0

jeśli ludzie oddają głos, to proszę, proszę wstaw komentarz tutaj, abym mógł poprawić mój błąd. –

2

Dzięki za obejście problemu!

Oto więcej szczotkowane i kopia wklej kod użytkowa:

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

Testowane na Nexus 4 v4.3 JWR66Y