简体   繁体   English

尝试从null对象引用上的字段'int android.media.CamcorderProfile.fileFormat'中读取

[英]Attempt to read from field 'int android.media.CamcorderProfile.fileFormat' on a null object reference

I'm recording video by using Custom camera on Nexus 7 2012 and get this issue while the other devices, like Zenfone 2, Galaxy S3, S6, HTC One M7, Oppo N1, Sony Xperia M4 ... worked perfectly. 我在Nexus 7 2012上使用自定义摄像头录制视频,但在其他设备(例如Zenfone 2,Galaxy S3,S6,HTC One M7,Oppo N1,Sony Xperia M4 ...)运行正常时,却遇到了这个问题。

public static boolean prepareVideoRecorder(Context mContext, int mode) {
    // Should release before use new Preview for Recording Video mode
    CustomCamera.releaseCamera();

    // Initialize camera
    CustomCamera.mCamera = CustomCamera.getCameraInstance(mode);

    CustomCamera.mCamera.startPreview();

    // Set orientation display
    setCameraDisplayOrientation((Activity) mContext, mode);

    // Should release before use new Preview for Recording Video mode
    CustomCamera.releaseMediaRecorder();

    CustomCamera.mMediaRecorder = new MediaRecorder();

    // Step 1: Unlock and set camera to MediaRecorder
    CustomCamera.mCamera.unlock();
    CustomCamera.mMediaRecorder.setCamera(CustomCamera.mCamera);

    // Step 2: Set sources
    CustomCamera.mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    CustomCamera.mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    // todo NullPointerException: Attempt to read from field 'int android.media.CamcorderProfile.fileFormat' on a null object reference
    //     

   // returned true value, go inside
   if (CamcorderProfile.hasProfile(current_camera_id, CamcorderProfile.QUALITY_LOW)) {
    // CamcorderProfile.get(CamcorderProfile.QUALITY_LOW) RETURNED NULL VALUE, SO I CAN NOT SET PROFILE     
    CustomCamera.mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));

    // Step 4: Set output file - pass False value to indicate choose Video mode
    RECORDED_FILE_PATH = getOutputMediaFile(mContext, false).toString();
    CustomCamera.mMediaRecorder.setOutputFile(RECORDED_FILE_PATH);

    // Step 5: Set the preview output
    /**
     * Define Orientation of image in here,
     * if in portrait mode, use value = 90,
     * if in landscape mode, use value = 0
     */
    if (current_camera_id == define.Camera.CAMERA_BACK)
        // Back Camera
        CustomCamera.mMediaRecorder = Utils.rotateBackVideo(CustomCamera.mMediaRecorder);
    else
        // Front Camera
        CustomCamera.mMediaRecorder = Utils.rotateFrontVideo(CustomCamera.mMediaRecorder);

    // Set preview display to refresh current screen
    CustomCamera.mMediaRecorder.setPreviewDisplay(mCameraPreview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        CustomCamera.mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
        CustomCamera.releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        CustomCamera.releaseMediaRecorder();
        return false;
    }

    return true;
}

These permissions I set : 我设置的这些权限:

<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.microphone"/>

<uses-permission android:name = "android.permission.CAMERA" />
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.RECORD_AUDIO" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.WRITE_INTERNAL_STORAGE" />

What I want is make it can record video on Nexus 7 2012. 我要使它可以在Nexus 7 2012上录制视频。

People who know, 知道的人

Please tell me how to fix. 请告诉我如何解决。

Thank you, 谢谢,

p/s : If I remove the setProfile() line I get the other exception and can not record video: p / s:如果删除setProfile()行, setProfile()出现另一个异常,并且无法录制视频:

07-31 14:33:39.936  25960-25960/com.panasonic_Upload E/MediaRecorder﹕ setOutputFile called in an invalid state(2)
07-31 14:33:39.942  25960-25960/com.panasonic_Upload W/System.err﹕ java.lang.IllegalStateException
07-31 14:33:39.950  25960-25960/com.panasonic_Upload W/System.err﹕ at android.media.MediaRecorder._setOutputFile(Native Method)
07-31 14:33:39.950  25960-25960/com.panasonic_Upload W/System.err﹕ at android.media.MediaRecorder.prepare(MediaRecorder.java:740)
07-31 14:33:39.950  25960-25960/com.panasonic_Upload W/System.err﹕ at ui.fragment.camera.CameraPreviewFragment.prepareVideoRecorder(CameraPreviewFragment.java:533)
07-31 14:33:39.950  25960-25960/com.panasonic_Upload W/System.err﹕ at ui.fragment.camera.CameraPreviewFragment.onClick(CameraPreviewFragment.java:223)
07-31 14:33:39.950  25960-25960/com.panasonic_Upload W/System.err﹕ at android.view.View.performClick(View.java:4780)
07-31 14:33:39.951  25960-25960/com.panasonic_Upload W/System.err﹕ at android.view.View$PerformClick.run(View.java:19866)
07-31 14:33:39.951  25960-25960/com.panasonic_Upload W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
07-31 14:33:39.951  25960-25960/com.panasonic_Upload W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
07-31 14:33:39.951  25960-25960/com.panasonic_Upload W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
07-31 14:33:39.951  25960-25960/com.panasonic_Upload W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5254)
07-31 14:33:39.951  25960-25960/com.panasonic_Upload W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
07-31 14:33:39.951  25960-25960/com.panasonic_Upload W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
07-31 14:33:39.952  25960-25960/com.panasonic_Upload W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
 07-31 14:33:39.952  25960-25960/com.panasonic_Upload W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

You have to pass the camera id when calling get(), exactly the same as you do when you call hasProfile(). 调用get()时必须传递摄像机ID,与调用hasProfile()时完全相同。 Otherwise it will take the profile from the first back camera it founds. 否则,它将从找到的第一个后置摄像头中获取配置文件。

http://developer.android.com/reference/android/media/CamcorderProfile.html#pubmethods http://developer.android.com/reference/android/media/CamcorderProfile.html#pubmethods

The Nexus 7 2012 crashes because it doesn't have a back camera. Nexus 7 2012崩溃,因为它没有后置摄像头。

You need to do this instead: 您需要这样做:

CustomCamera.mMediaRecorder.setProfile(CamcorderProfile.get( current_camera_id , CamcorderProfile.QUALITY_LOW));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android ViewGroup 崩溃:尝试从空对象引用上的字段“int android.view.View.mViewFlags”读取 - Android ViewGroup crash: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference NullPointerException:尝试从空对象引用上的字段&#39;int android.app.Fragment.mContainerId&#39;读取 - NullPointerException: Attempt to read from field 'int android.app.Fragment.mContainerId' on a null object reference “尝试在空对象引用上读取字段&#39;int android.content.pm.ApplicationInfo.targetSdkVersion&#39;”异常 - “Attempt to read from field 'int android.content.pm.ApplicationInfo.targetSdkVersion' on a null object reference” exception Android尝试从空对象引用中的字段读取 - Android Attempt to read from field on a null object reference java.lang.NullPointerException: Attempt to read from field 'int com.google.android.material.timepicker.TimeModel.hour' on a null object reference - java.lang.NullPointerException: Attempt to read from field 'int com.google.android.material.timepicker.TimeModel.hour' on a null object reference 使用导航抽屉时尝试从空对象引用上的字段&#39;int android.support.v4.app.Fragment.mContainerId&#39;读取 - Attempt to read from field 'int android.support.v4.app.Fragment.mContainerId' on a null object reference when using Navigation Drawer 空指针异常,“尝试从空对象引用上的字段读取” - Null pointer exception, "Attempt to read from field on a null object reference" 尝试从 AndroidDevMetrics 中的字段读取空对象引用 - Attempt to read from field in AndroidDevMetrics on a null object reference 尝试在空对象引用上调用虚拟方法&#39;void android.media.AudioManager.setVibrateSetting(int,int)&#39; - Attempt to invoke virtual method 'void android.media.AudioManager.setVibrateSetting(int, int)' on a null object reference 尝试从 null object 参考上的字段 'long android.graphics.Typeface.native_instance' 中读取 - Attempt to read from field 'long android.graphics.Typeface.native_instance' on a null object reference
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM