florent37 / CameraFragment

A simple easy-to-integrate Camera Fragment for Android
Apache License 2.0
2.29k stars 420 forks source link

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.camera2.CaptureRequest$Builder.set(android.hardware.camera2.CaptureRequest$Key, java.lang.Object)' on a null object reference #27

Open yzcheng90 opened 7 years ago

yzcheng90 commented 7 years ago

E/Camera2Manager: Error setting flash: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.camera2.CaptureRequest$Builder.set(android.hardware.camera2.CaptureRequest$Key, java.lang.Object)' on a null object reference at com.github.florent37.camerafragment.internal.manager.impl.Camera2Manager.setFlashModeAndBuildPreviewRequest(Camera2Manager.java:705) at com.github.florent37.camerafragment.internal.manager.impl.Camera2Manager.setFlashMode(Camera2Manager.java:235) at com.github.florent37.camerafragment.internal.controller.impl.Camera2Controller.setFlashMode(Camera2Controller.java:130) at com.github.florent37.camerafragment.internal.ui.BaseAnncaFragment.onFlashModeChanged(BaseAnncaFragment.java:509) at com.github.florent37.camerafragment.internal.ui.BaseAnncaFragment.setFlashMode(BaseAnncaFragment.java:561) at com.github.florent37.camerafragment.internal.ui.BaseAnncaFragment.onViewCreated(BaseAnncaFragment.java:255) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1132) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:607) at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181) at com.trello.rxlifecycle.components.support.RxAppCompatActivity.onStart(RxAppCompatActivity.java:52) at cn.droidlover.xdroidmvp.mvp.XActivity.onStart(XActivity.java:70) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1254) at android.app.Activity.performStart(Activity.java:6930) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2756) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:156) at android.app.ActivityThread.main(ActivityThread.java:6524) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831) E/Camera2Manager: Error setting flash: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.camera2.CaptureRequest$Builder.set(android.hardware.camera2.CaptureRequest$Key, java.lang.Object)' on a null object reference at com.github.florent37.camerafragment.internal.manager.impl.Camera2Manager.setFlashModeAndBuildPreviewRequest(Camera2Manager.java:705) at com.github.florent37.camerafragment.internal.manager.impl.Camera2Manager.setFlashMode(Camera2Manager.java:235) at com.github.florent37.camerafragment.internal.controller.impl.Camera2Controller.setFlashMode(Camera2Controller.java:130) at com.github.florent37.camerafragment.internal.ui.BaseAnncaFragment.onFlashModeChanged(BaseAnncaFragment.java:509) at com.github.florent37.camerafragment.internal.ui.BaseAnncaFragment.notifyListeners(BaseAnncaFragment.java:277) at com.github.florent37.camerafragment.internal.ui.BaseAnncaFragment.onViewCreated(BaseAnncaFragment.java:272) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1132) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:607) at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181) at


invoke the addCamera() then is a error

apMadden commented 7 years ago

same error on a Pixel XL

ghost commented 7 years ago

I see the same thing with nexus 5x. Apparently the flash is being called too early sometimes. This solution suggests adding a 1s delay before attempting to handle flash: https://stackoverflow.com/a/40904906/4830411

rahulmenezes commented 7 years ago

I am having the same issue on a Samsung Note5 and S7. Any updates regarding a solution?

XinyueZ commented 7 years ago

same to me on Android 5.x device

amadeu01 commented 6 years ago

Have anyone got it working ?

amadeu01 commented 6 years ago

I do not know why. However, if you clone the source lib and build the demo app that comes with the source, it will work on devices whose present the problem

amadeu01 commented 6 years ago

@florent37 Have you faced that problem ?

amadeu01 commented 6 years ago
A TextureView or a subclass can only be used with hardware acceleration enabled.
E/Camera2Controller: onCameraOpenError
 W/TextureView: A TextureView or a subclass can only be used with hardware acceleration enabled.
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1

I got that, then I just changed in my manifest android:hardwareAccelerated="true"

sagartrehan commented 6 years ago

@amadeu01 @florent37 Adding "android:hardwareAccelerated="true" in manifest, does not fix the issue for me.

amadeu01 commented 6 years ago

Have you got anything on your logs?

amadeu01 commented 6 years ago

@sagartrehan Can you share your logs before it crashed?

sagartrehan commented 6 years ago

Below are the logs:

  1. Log when land to screen containing CameraFragment

    03-09 21:57:39.412 5521-5521/com.rela E/Camera2Manager: Error setting flash: 
                                                        java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.camera2.CaptureRequest$Builder.set(android.hardware.camera2.CaptureRequest$Key, java.lang.Object)' on a null object reference
                                                            at com.rela.camerafragment.internal.manager.impl.Camera2Manager.setFlashModeAndBuildPreviewRequest(Camera2Manager.java:711)
                                                            at com.rela.camerafragment.internal.manager.impl.Camera2Manager.setFlashMode(Camera2Manager.java:238)
                                                            at com.rela.camerafragment.internal.controller.impl.Camera2Controller.setFlashMode(Camera2Controller.java:130)
                                                            at com.rela.camerafragment.internal.ui.BaseAnncaFragment.onFlashModeChanged(BaseAnncaFragment.java:502)
                                                            at com.rela.camerafragment.internal.ui.BaseAnncaFragment.setFlashMode(BaseAnncaFragment.java:554)
                                                            at com.rela.camerafragment.internal.ui.BaseAnncaFragment.onViewCreated(BaseAnncaFragment.java:255)
                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1430)
                                                            at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
                                                            at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
                                                            at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
                                                            at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
                                                            at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
                                                            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239)
                                                            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
                                                            at android.os.Handler.handleCallback(Handler.java:789)
                                                            at android.os.Handler.dispatchMessage(Handler.java:98)
                                                            at android.os.Looper.loop(Looper.java:164)
                                                            at android.app.ActivityThread.main(ActivityThread.java:6809)
                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                            at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    03-09 21:57:39.413 5521-5521/com.rela E/Camera2Manager: Error setting flash: 
                                                        java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.camera2.CaptureRequest$Builder.set(android.hardware.camera2.CaptureRequest$Key, java.lang.Object)' on a null object reference
                                                            at com.rela.camerafragment.internal.manager.impl.Camera2Manager.setFlashModeAndBuildPreviewRequest(Camera2Manager.java:711)
                                                            at com.rela.camerafragment.internal.manager.impl.Camera2Manager.setFlashMode(Camera2Manager.java:238)
                                                            at com.rela.camerafragment.internal.controller.impl.Camera2Controller.setFlashMode(Camera2Controller.java:130)
                                                            at com.rela.camerafragment.internal.ui.BaseAnncaFragment.onFlashModeChanged(BaseAnncaFragment.java:502)
                                                            at com.rela.camerafragment.internal.ui.BaseAnncaFragment.notifyListeners(BaseAnncaFragment.java:275)
                                                            at com.rela.camerafragment.internal.ui.BaseAnncaFragment.onViewCreated(BaseAnncaFragment.java:271)
                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1430)
                                                            at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
                                                            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
                                                            at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
                                                            at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
                                                            at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
                                                            at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
                                                            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239)
                                                            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
                                                            at android.os.Handler.handleCallback(Handler.java:789)
                                                            at android.os.Handler.dispatchMessage(Handler.java:98)
                                                            at android.os.Looper.loop(Looper.java:164)
                                                            at android.app.ActivityThread.main(ActivityThread.java:6809)
                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                            at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
  2. Log when try to start record but screen freezes:

    E/Legacy-CameraDevice-JNI: LegacyCameraDevice_nativeDetectSurfaceDimens: Error while querying surface width No such device (-19).
    03-10 12:29:06.094 6454-7271/com.rela E/Camera2Manager: startVideoRecord: 
                                                        java.lang.IllegalArgumentException: Surface was abandoned
                                                            at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:70)
                                                            at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:216)
                                                            at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:101)
                                                            at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:504)
                                                            at com.rela.camerafragment.internal.manager.impl.Camera2Manager$6.run(Camera2Manager.java:294)
                                                            at android.os.Handler.handleCallback(Handler.java:789)
                                                            at android.os.Handler.dispatchMessage(Handler.java:98)
                                                            at android.os.Looper.loop(Looper.java:164)
                                                            at android.os.HandlerThread.run(HandlerThread.java:65)
                                                         Caused by: android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException
                                                            at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:73)
                                                            at android.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceSize(LegacyCameraDevice.java:583)
                                                            at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:68)
                                                            at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:216) 
                                                            at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:101) 
                                                            at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:504) 
                                                            at com.rela.camerafragment.internal.manager.impl.Camera2Manager$6.run(Camera2Manager.java:294) 
                                                            at android.os.Handler.handleCallback(Handler.java:789) 
                                                            at android.os.Handler.dispatchMessage(Handler.java:98) 
                                                            at android.os.Looper.loop(Looper.java:164) 
                                                            at android.os.HandlerThread.run(HandlerThread.java:65) 
abhishekthanvi8 commented 6 years ago

has anyone solved this.?

sagartrehan commented 6 years ago

@abhishekthanvi8 I am also facing same issue. This issue is occurring on device supporting the Camera2 APIs. I included this library as module in my project so I modified one utlity class so that always Camera1 APIs will be used. I know this is wrong way to fix the problem but I was not having any other option since delivery was on head.

I will bang my head into the code to find the issue once I get time.

amadeu01 commented 6 years ago

@sagartrehan where are you initiating the camera fragment? on the onCreate, onResume?

yangli1120 commented 6 years ago

Hi, I also get this issue on OnePlus 5T, android 8.1.0。 I initiating camera fragment on the onResume() method because some phone will initiate failed when initiating camera fragment on the onCreate() method.

fruitlangu commented 6 years ago

@amadeu01 Thank You. I also get the same issue then when I include the manifest file "android:hardwareAccelerated=" true" problem has been solved.

jxj2118 commented 5 years ago

In my demo,if CameraSeesion is RepeatingCaptures
session.setRepeatingRequest() If the distance between stopRepeating() and abortCaptures() is too short,happens this bug you should execute stopRepeating() , abortCaptures() is not required

amadeu01 commented 5 years ago

I guess the project is stopped, I would change the library to another implementation. I guess this might help https://www.youtube.com/watch?v=kuv8uK-5CLY

@jxj2118 @YoungLeeForeverBoy @fruitlangu

flankechen commented 4 years ago

Error setting FLASH MODE like things happens even in success runs. if you are facing no camera rendering at all, 02-29 18:18:01.856 15256 15302 E Camera2Manager: Error while setup camera sizes. 02-29 18:18:01.856 15256 15302 E Camera2Manager: java.lang.RuntimeException: Error retrieving camcorder profile params 02-29 18:18:01.856 15256 15302 E Camera2Manager: at android.media.CamcorderProfile.native_get_camcorder_profile(Native Method) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at android.media.CamcorderProfile.get(CamcorderProfile.java:467) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at com.github.florent37.camerafragment.internal.utils.CameraHelper.getCamcorderProfile(CameraHelper.java:450) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at com.github.florent37.camerafragment.internal.utils.CameraHelper.getCamcorderProfile(CameraHelper.java:429) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at com.github.florent37.camerafragment.internal.manager.impl.Camera2Manager.prepareCameraOutputs(Camera2Manager.java:497) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at com.github.florent37.camerafragment.internal.manager.impl.Camera2Manager$3.run(Camera2Manager.java:206) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at android.os.Handler.handleCallback(Handler.java:888) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at android.os.Handler.dispatchMessage(Handler.java:100) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at android.os.Looper.loop(Looper.java:213) 02-29 18:18:01.856 15256 15302 E Camera2Manager: at android.os.HandlerThread.run(HandlerThread.java:67)

check your cameraid, some OEM like huawei, returns like 4 to 5 cameras, but some of them could not get the right CamcorderProfile. usually, the very first one cameraid works most of the times