Android 使用空表面纹理设置相机时抛出运行时异常

Android runtime exception thrown when setting camera with null surface texture

我开发了一个后台摄像头,但是我有一个奇怪的事情。我的应用程序可以在这些设备上正常运行:三星 Note2 android:4.1.2、4.4.2、LG G3 android 4.4.2、华硕 android 4.4.2。但是,这在这些设备中失败,例如 REDMI android:4.2.2、Samsung S6:5.1、Samsung note3:4.3、Sony Xperia:4.4.4、Sony Z3:4.4.4。想知道原因和解决方法。谢谢大家

我的清单: 使用权限 android:name="android.permission.CAMERA" 使用功能 android:name="android.hardware.camera" 使用功能 android:name="android.hardware.camera.autofocus"

我的 logcat(红米、索尼 Xperia、三星 S6、三星 Note3):

-LOGCAT OF REDMI android 4.2.2: E/AndroidRuntime( 2889): at java.lang.Thread.run(Thread.java:838) E/AndroidRuntime( 4105): FATAL EXCEPTION: main E/AndroidRuntime( 4105): java.lang.RuntimeException: Unable to create service com.video.MyService: java.lang.RuntimeException: Fail to connect to camera service

-UPDATED LOGCAT of SONY Xperia android 5.0.2 I/Process ( 4492): Sending signal. PID: 4492 SIG: 9 W/ResourceType( 4857): Found multiple library tables, ignoring... V/MyActivity( 4857): Camera found W/CameraBase( 4857): Camera service died! W/CameraBase( 4857): An error occurred while connecting to camera: 0 E/video ( 4857): failed to open Camera W/System.err( 4857): java.lang.RuntimeException: Fail to connect to camera service W/System.err( 4857): at android.hardware.Camera.(Camera.java:520) W/System.err( 4857): at android.hardware.Camera.open(Camera.java:361) W/System.err( 4857): at com.video.MyService.safeCameraOpen(MyService.java:151) W/System.err( 4857): at com.video.MyService.onCreate(MyService.java:92) W/System.err( 4857): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2785) W/System.err( 4857): at android.app.ActivityThread.access00(ActivityThread.java:149) W/System.err( 4857): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1407) W/System.err( 4857): at android.os.Handler.dispatchMessage(Handler.java:102) W/System.err( 4857): at android.os.Looper.loop(Looper.java:211) W/System.err( 4857): at android.app.ActivityThread.main(ActivityThread.java:5333) W/System.err( 4857): at java.lang.reflect.Method.invoke(Native Method) W/System.err( 4857): at java.lang.reflect.Method.invoke(Method.java:372) W/System.err( 4857): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) W/System.err( 4857): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) D/AndroidRuntime( 4857): Shutting down VM E/AndroidRuntime( 4857): FATAL EXCEPTION: main E/AndroidRuntime( 4857): Process: com.video, PID: 4857 E/AndroidRuntime( 4857): java.lang.RuntimeException: Unable to create service com.video.MyService: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.setPreviewTexture(android.graphics.SurfaceTexture)' on a >null object reference

-LOGCAT Samsung Note3 android 4.3 E/MediaRecorder(31528): start failed: -19 W/dalvikvm(31528): threadid=14: thread exiting with uncaught exception (group=0x417fc898) --------- beginning of /dev/log/system E/AndroidRuntime(31528): FATAL EXCEPTION: Thread-2241 E/AndroidRuntime(31528): java.lang.RuntimeException: start failed.

LOGCAT Samsung S6 D/OpenGLRenderer(27352): Render dirty regions requested: true D/PhoneWindow(27352): FMB isFloatingMenuEnabled mFloatingMenuBtn : null D/PhoneWindow(27352): FMB isFloatingMenuEnabled return false D/libEGL (27352): loaded /vendor/lib64/egl/libGLES_mali.so I/OpenGLRenderer(27352): Initialized EGL, version 1.4 I/OpenGLRenderer(27352): HWUI protection enabled for context , &this =0x7f73cbd1a0 ,&mEglDisplay = 1 , &mEglConfig = 1866187440 D/OpenGLRenderer(27352): Get maximum texture size. GL_MAX_TEXTURE_SIZE is 8192 D/OpenGLRenderer(27352): Enabling debug mode 0 D/mali_winsys(27352): new_window_surface returns 0x3000, [1440x2560]-format:1 I/LoadedApk(27352): getClassLoader :dalvik.system.PathClassLoader[DexPathList[[zip file E/SELinux (27352): [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL D/TimaKeyStoreProvider(27352): TimaSignature is unavailable D/ActivityThread(27352): Added TimaKeyStore provider --------- beginning of system D/LoadedApk(27352): getResources for android.app.ActivityThread@fde5c5f forcing ? false needsResourceUpdate ?false I/InjectionManager(27352): Inside getClassLibPath + mLibMap{0=, 1=} D/AssetManager(27352): addAssetPath path =/data/app/com.video-1/base.apkmapset is 0 D/AssetManager(27352): addAssetPath path =/data/app/com.video-1/base.apk, mapOffset =0 D/LoadedApk(27352): getResources for android.app.ActivityThread@fde5c5f forcing ? false needsResourceUpdate ?false I/LoadedApk(27352): getClassLoader :null I/InjectionManager(27352): Inside getClassLibPath caller I/LoadedApk(27352): classLibPath :, mActivityThread.mCoreFeatureClassLoader :null D/InjectionManager(27352): InjectionManager I/Choreographer(27352): Skipped 39 frames! The application may be doing too much work on its main thread. I/LoadedApk(27352): getClassLoader :dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.video-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] E/BufferQueueProducer(27352): [unnamed-27352-0] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=8 undequeued=0) E/BufferQueueProducer(27352): [unnamed-27352-0] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=8 undequeued=0) E/BufferQueueProducer(27352): [unnamed-27352-0] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=7 undequeued=1) E/BufferQueueProducer(27352): [unnamed-27352-0] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=7 undequeued=1) E/BufferQueueProducer(27352): [unnamed-27352-0] dequeueBuffer: min undequeued >buffer count (2) exceeded (dequeued=7 undequeued=1)

这是我的代码:

public class MyService extends Service{
   private  Camera mcamera;

   @SuppressLint("NewApi") @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void     
   onCreate() {

    mcamera=Camera.open();

                try {
                    mcamera.setPreviewTexture(new SurfaceTexture(0));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            mcamera.startPreview();

      public void capture(){

                mcamera.takePicture(null, null,null,mPicture);
            }

                 PictureCallback mPicture = new PictureCallback(){

                    @Override
                    public void onPictureTaken(byte[] data, Camera mcamera) {
                        (...)
                };
(...)

我假设您的清单包含所有必要的权限?当我遇到类似问题时,解决方案是必须异步加载任务。如果是这种情况,您将需要一个 AsyncTask 来打开相机或拍摄照片或两者兼而有之。

希望此输入对您有所帮助。