2015-06-09 3 views
5

Ich habe ein Problem, wo ich sowohl die Kamera (niedriger als Lollipop Geräte) und CameraManager-Klasse (Lollipop und höher Geräte) verwendet.CameraManager auf Geräten niedriger als Lollipop

Die Geräte, die niedriger ist als Lollipop Abstürze laufen, ich glaube, dies wegen der

import android.hardware.camera2.CameraManager; 

Teil ist. Wie kann ich diese

package com.example.DeviceCommands; 

import android.annotation.TargetApi; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.hardware.Camera; 
import android.hardware.Camera.AutoFocusCallback; 
import android.hardware.Camera.Parameters; 
import android.hardware.camera2.CameraAccessException; 
import android.hardware.camera2.CameraManager; 
import android.os.Build; 

public class FlashController 
{ 
    Context _context; 
    boolean _is_supported = false; 
    boolean _enabled = false; 
    Object _camera; 

    @TargetApi(Build.VERSION_CODES.L) public FlashController(Context context) 
    { 
     if (context.getPackageManager().hasSystemFeature(PackageManager 
      .FEATURE_CAMERA_FLASH)) 
     { 
      _context = context; 
      _is_supported = true; 

      if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) 
      { 
       Camera camera = Camera.open(); 

       if (camera == null) 
       { 
        _is_supported = false; 
        System.out.println("NOT SUPPORTED!"); 
        return; 
       } 

       _camera = camera; 
      } 
      else 
      { 
       CameraManager camera = (CameraManager) _context.getSystemService(Context.CAMERA_SERVICE); 
       _camera = camera; 
      } 
     } 
    } 


    @TargetApi(Build.VERSION_CODES.L) public void enableFlashLight() 
    { 
     if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) 
     { 
      Camera camera = (Camera) _camera; 
      Camera.Parameters parameters = camera.getParameters(); 

      if(!parameters.getFlashMode().equals(android.hardware 
             .Camera.Parameters.FLASH_MODE_TORCH) 
             && !_enabled) 
      { 
       Parameters params = camera.getParameters(); 
       params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
       camera.setParameters(params); 
       camera.startPreview(); 
       _enabled = true; 
       camera.autoFocus(new AutoFocusCallback() 
       { 
        public void onAutoFocus(boolean success, Camera camera) 
        { 

        } 
       }); 
      } 
     } 
     else 
     { 
      //CameraManager manager =(CameraManager) _context.getSystemService(Context.CAMERA_SERVICE); 

      try 
      { 
       CameraManager camera = (CameraManager) _camera; 

       for(int i = 0; i < camera.getCameraIdList().length; i++) 
       { 
        System.out.println("Camera=" + camera.getCameraCharacteristics(
                camera.getCameraIdList()[i])); 
       } 
      } 
      catch (CameraAccessException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void disableFlashLight() 
    { 
     if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) 
     { 
      Camera cam = Camera.open(); 
      Camera.Parameters parameters = cam.getParameters(); 

      if(parameters.getFlashMode().equals(android.hardware 
             .Camera.Parameters.FLASH_MODE_TORCH)) 
      { 
       parameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
       cam.setParameters(parameters); 
       cam.release(); 
      } 

     } 
    } 

} 

Arbeit, wenn der import Teil macht Geräte niedriger als Lollipop Absturz läuft?

Danke für jede Hilfe und Beratung!

EDIT: Die gesamte oben genannte Klasse hinzugefügt. Logcat Ausgang

06-09 19:44:30.219: E/ViewRootImpl(956): sendUserActionEvent() mView == null 
06-09 19:44:31.360: E/dalvikvm(956): Could not find class 'android.hardware.camera2.CameraManager', referenced from method com.example.DeviceCommands.FlashController.<init> 
06-09 19:44:31.360: W/dalvikvm(956): VFY: unable to resolve check-cast 122 (Landroid/hardware/camera2/CameraManager;) in Lcom/example/DeviceCommands/FlashController; 
06-09 19:44:31.360: D/dalvikvm(956): VFY: replacing opcode 0x1f at 0x003a 
06-09 19:44:31.367: E/dalvikvm(956): Could not find class 'android.hardware.camera2.CameraManager', referenced from method com.example.DeviceCommands.FlashController.enableFlashLight 
06-09 19:44:31.367: W/dalvikvm(956): VFY: unable to resolve check-cast 122 (Landroid/hardware/camera2/CameraManager;) in Lcom/example/DeviceCommands/FlashController; 
06-09 19:44:31.367: D/dalvikvm(956): VFY: replacing opcode 0x1f at 0x0040 
06-09 19:44:31.367: W/dalvikvm(956): VFY: unable to resolve exception class 120 (Landroid/hardware/camera2/CameraAccessException;) 
06-09 19:44:31.367: W/dalvikvm(956): VFY: unable to find exception handler at addr 0x6b 
06-09 19:44:31.367: W/dalvikvm(956): VFY: rejected Lcom/example/DeviceCommands/FlashController;.enableFlashLight()V 
06-09 19:44:31.367: W/dalvikvm(956): VFY: rejecting opcode 0x0d at 0x006b 
06-09 19:44:31.367: W/dalvikvm(956): VFY: rejected Lcom/example/DeviceCommands/FlashController;.enableFlashLight()V 
06-09 19:44:31.367: W/dalvikvm(956): Verifier rejected class Lcom/example/DeviceCommands/FlashController; 
06-09 19:44:31.367: D/AndroidRuntime(956): Shutting down VM 
06-09 19:44:31.367: W/dalvikvm(956): threadid=1: thread exiting with uncaught exception (group=0x4100d930) 
06-09 19:44:31.375: E/AndroidRuntime(956): FATAL EXCEPTION: main 
06-09 19:44:31.375: E/AndroidRuntime(956): java.lang.VerifyError: com/example/DeviceCommands/FlashController 
06-09 19:44:31.375: E/AndroidRuntime(956): at com.example.babymonitorer.MainActivity.onClick(MainActivity.java:121) 
06-09 19:44:31.375: E/AndroidRuntime(956): at android.view.View.performClick(View.java:4421) 
06-09 19:44:31.375: E/AndroidRuntime(956): at android.view.View$PerformClick.run(View.java:18190) 
06-09 19:44:31.375: E/AndroidRuntime(956): at android.os.Handler.handleCallback(Handler.java:725) 
06-09 19:44:31.375: E/AndroidRuntime(956): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-09 19:44:31.375: E/AndroidRuntime(956): at android.os.Looper.loop(Looper.java:175) 
06-09 19:44:31.375: E/AndroidRuntime(956): at android.app.ActivityThread.main(ActivityThread.java:5279) 
06-09 19:44:31.375: E/AndroidRuntime(956): at java.lang.reflect.Method.invokeNative(Native Method) 
06-09 19:44:31.375: E/AndroidRuntime(956): at java.lang.reflect.Method.invoke(Method.java:511) 
06-09 19:44:31.375: E/AndroidRuntime(956): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
06-09 19:44:31.375: E/AndroidRuntime(956): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
06-09 19:44:31.375: E/AndroidRuntime(956): at dalvik.system.NativeStart.main(Native Method) 

MainActivity Linie 121: FlashController fc = new FlashController(this);

+1

Der Import führt nicht zum Absturz Ihrer App. Fügen Sie Ihr Logcat hinzu. – ianhanniballake

+0

'import' Anweisungen sind keine ausführbaren Anweisungen und können nicht direkt einen Absturz verursachen. Verwenden Sie LogCat, um die mit Ihrem Absturz verbundene Java-Stack-Ablaufverfolgung zu untersuchen: https://stackoverflow.com/questions/23353173/unidymy-myapp-has-stopped-how-cani--solve-this Wenn Sie die Stack-Ablaufverfolgung nicht verstehen Fügen Sie es in Ihre Frage ein und geben Sie an, welche Codezeilen aus Ihrem Codeausschnitt den Zeilen entsprechen, auf die im Stack-Trace verwiesen wird. – CommonsWare

+0

@ianhanniballake Logcat hinzugefügt. – Araw

Antwort

0

Ich habe ähnliches Problem konfrontiert. Der einzige Unterschied war, dass ich die SDK-Version auf Android M (API 23) aktualisiert habe.

  1. zuerst Ihre SDK API aktualisieren 23.

  2. Dann Check hinzu: Build.VERSION.SDK_INT >= Build.VERSION_CODES.M statt Lollipop-Version.

  3. Dann können Sie möglicherweise unter Code für Android M-Version versuchen und oben:

if (context.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { 

    CameraManager camera = (CameraManager) _context.getSystemService(Context.CAMERA_SERVICE); 

} 

Hoffnung, das hilft.

+0

Ich versuchte dies ohne Glück. Ich benutze derzeit Reflektionen, um Abstürze in Lollipop und Brüllen zu vermeiden, aber ich möchte es nach Möglichkeit vermeiden. – Soflete

0

Teilen Sie Ihre Klasse in zwei: eine für API2, eine andere für API1. Überprüfen Sie zunächst, welche Android-Version installiert ist, und führen Sie dann die entsprechende Klasse aus. Machen Sie es wie folgt aus:

// Start Camera capture Image display 
public void intentStartCamera() { 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     Intent myIntent = new Intent(CaptureDetailsActivity.this, CaptureActivityCAPI2.class); 
     startActivityForResult(myIntent, OPEN_CAMERA_REQUEST); 
    } else { 
     Intent myIntent = new Intent(CaptureDetailsActivity.this, CaptureActivityCAPI1.class); 
     startActivityForResult(myIntent, OPEN_CAMERA_REQUEST); 
    } 
} 

Es ist meine Lösung in einem solchen Projekt.