2013-08-08 7 views
9

मैं रिकॉर्ड वीडियो के लिए इरादा का उपयोग कर रहा हूं।एंड्रॉइड android.provider.MediaStore.ACTION_VIDEO_CAPTURE वापसी पर शून्य पर सक्रियता नेक्सस 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); 
    } 

इस कोड में निम्न का उपयोग सैमसंग गैलेक्सी टैब के साथ ठीक काम कर रहा है। लेकिन नेक्सस 7 के साथ काम नहीं कर रहा है। नेक्सस 7 का फ्रंट कैमरा हो सकता है। लेकिन मुझे परिणामस्वरूप डेटा इरादा निष्क्रियता पर शून्य है।

तो मेरे 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

अंत में मैं इस समस्या का समाधान। नेक्सस 7 DCIM निर्देशिका में वीडियो स्टोर करता है लेकिन onActivityResults यह null देता है। यह नेक्सस 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. 
     } 
    } 

मेरे लिए इसका काम करता है निम्नलिखित विधि

साथ
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; 
    } 

उत्पादन मीडिया फ़ाइल uri प्राप्त करें।

+2

है समस्या मैं इस जवाब के साथ है कि यदि आप वीडियो कैप्चर इरादे को EXTRA_OUTPUT स्थान पारित तो अन्य फ़ोन के कैमरे एप्लिकेशन के ठीक से व्यवहार नहीं करते है। कुछ पुराने सैमसंग उपकरणों पर कैमरा ऐप सहेजने पर क्रैश हो जाएगा, एंड्रॉइड 4.1 के साथ गैलेक्सी नोट 1 पर कैमरा ऐप फ़ाइल को सेव करेगा लेकिन उपयोगकर्ता को फोटो स्वीकार करने के लिए बटन नहीं देगा, यह सिर्फ ऐप में रहता है (वे बैक बटन दबाएं जो स्पष्ट नहीं है)। अन्य ऐप्स/फोन के साथ मिश्रित परिणाम भी। इसका मतलब है कि हमें फोन या कैमरा ऐप का पता लगाने के लिए तर्क होना होगा ... –

+0

हाँ, आप सही हैं इसलिए मैंने केवल यह कोड नेक्सस के लिए क्यों रखा। –

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

नेक्सस 4 v4.3 JWR66Y

0

पर परीक्षण किया गया एक कांटा बने और एक स्थायी निर्देशिका के भंडारण के द्वारा समस्या का समाधान होने जो अभी भी होगा परिणाम प्राप्त होने के बाद उपलब्ध हो।

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

संबंधित मुद्दे