2013-08-08 13 views
9

Ich verwende Intent für Videoaufzeichnung.android.provider.MediaStore.ACTION_VIDEO_CAPTURE return null onActivityResult mit nexus 7

so verwende ich folgenden Code auf Klick des recordVideo Taste

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

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

Dieser Code funktioniert gut mit Samsung Galaxy Tab. Aber funktioniert nicht mit Nexus 7. Vielleicht haben Nexus 7 Frontkamera. aber ich habe resultierende Daten Absicht ist null onActivityResult.

so in meinem Logcat bekam ich die folgende Ausnahme: -

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

Es hat Android 4.3 OS-Version –

Antwort

8

Schließlich ich dieses Problem behoben. Nexus 7 Speichert die Videos in DCIM Verzeichnis aber onActivityResults es gibt null zurück. Es ist ein dokumentiertes Problem mit Nexus 7-Gerät.

so dieses Problem beheben mit intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
der Code ist als: -

Code auf Aufnahmetaste klicken: -

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

Code innerhalb Schalter - Fall Block 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-Methode

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

die Ausgabedatei uri Setzen Sie sich mit der folgenden Methode

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

Seine Arbeiten für mich.

+2

Das Problem, das ich mit dieser Antwort ist, dass, wenn Sie EXTRA_OUTPUT Lage zur Video-Capture Absicht passieren dann nicht richtig die meisten anderen Handy-Kamera-Anwendungen verhalten. Bei einigen älteren Samsung Geräten stürzt die Kamera-App beim Speichern ab, bei einer Galaxy Note 1 mit Android 4.1 speichert die Kamera-App die Datei, gibt dem Nutzer aber nicht den Knopf, um das Foto zu akzeptieren, es bleibt einfach in der App (sie muss den Zurück-Knopf drücken, der nicht offensichtlich ist). Gemischte Ergebnisse mit anderen Apps/Handys. Das bedeutet, dass wir eine Logik haben müssen, um das Telefon oder die Kamera-App zu erkennen ... –

+0

Ja, Sie haben Recht, deshalb lege ich diesen Code nur für Nexus. –

+0

Wenn Leute abstimmen, dann bitte hier einen Kommentar, damit ich meinen Fehler korrigieren kann. –

2

Vielen Dank für die Problemumgehung!

ist hier mehr geschliffener und verwendbaren Code Copy-Paste:

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

Getestet auf Nexus 4 v4.3 JWR66Y