2015-06-09 18 views
5

'dan daha düşük cihazlarda çalışıyor Fotoğraf makinesini (Lollipop aygıtlarından daha düşük) ve CameraManager sınıfını (Lollipop ve üzeri cihazlar) kullanıyorum. Lollipop çöker daha düşük çalıştırmakCameraManager, Lollipop

cihazları, ben bu çünkü

import android.hardware.camera2.CameraManager; 

parçanın olduğuna inanıyoruz. nasıl import bölüm Lollipop kazasında daha düşük çalışan cihazlarını yapacak eğer bu

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

     } 
    } 

} 

uygulayabiliriz?

Yardımlarınız ve önerileriniz için teşekkür ederiz!

DÜZENLEME: Yukarıdaki tüm sınıf eklendi. Logcat çıkış

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 hattı 121:

+1

İthalat, uygulamanızın çökmesine neden olmaz. Logcat'ini dahil et. – ianhanniballake

+0

'import' ifadeleri, yürütülebilir ifadeler değildir ve doğrudan bir çakışma neden olmaz. Kilitlenme ile ilişkili Java yığın izlemesini incelemek için LogCat'ı ​​kullanın: https://stackoverflow.com/questions/23353173/unales-myapp-has-stopped-how-can-i-solve-this Yığın izlemesini anlamıyorsanız sorunuza yapıştırın ve kod snippet'inizden hangi kod satırlarının yığın izlemede başvurulan satırlara karşılık geldiğini belirtin. – CommonsWare

+0

@ianhanniballake Logcat eklendi. – Araw

cevap

0

FlashController fc = new FlashController(this); Ben benzer bir sorun karşı karşıya kalmışlardır. Tek fark, SDK sürümünü Android M (API 23) olarak güncelledim. yerine Lollipop sürümü Build.VERSION.SDK_INT >= Build.VERSION_CODES.M:

  1. İlk

  2. Sonra çeki eklemek API 23'e SDK'nızı güncelleyin.

  3. Sonra muhtemelen Android M versiyonu için ve yukarıdaki kod aşağıda deneyebilirsiniz: Bu yardımcı olur

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

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

} 

Umut.

+0

Bunu şanssız denedim. Lollipop ve feryatta meydana gelebilecek çökmeleri önlemek için şu anda yansıma kullanıyorum, ancak mümkün olduğunca kaçınmak istiyorum. – Soflete

0

Sınıfınızı ikiye ayırın: API2 için bir tane, API1 için başka. Önce android sürümü yüklü olup olmadığını kontrol edin ve daha sonra uygun sınıfı çalıştırın. bunu böyle yapın:

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

Böyle projede benim çözüm.

İlgili konular