2015-06-09 8 views
5

से कम चल रहे डिवाइसों पर कैमरामैनेजर मुझे एक समस्या का सामना करना पड़ रहा है जहां मैं दोनों कैमरा (लॉलीपॉप डिवाइस से कम) और कैमरामेनगर क्लास (लॉलीपॉप और उपरोक्त डिवाइस) का उपयोग कर रहा हूं।लॉलीपॉप

उपकरणों कि लॉलीपॉप दुर्घटनाओं की तुलना में कम चलाने के लिए, मेरा मानना ​​है कि इस

import android.hardware.camera2.CameraManager; 

भाग की वजह से है। मैं इस

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

     } 
    } 

} 

काम करता है, तो import हिस्सा लॉलीपॉप दुर्घटना की तुलना में कम चलाने वाले उपकरणों कर देगा कैसे बना सकते हैं?

किसी भी मदद और सलाह के लिए धन्यवाद!

संपादित करें: उपरोक्त संपूर्ण वर्ग को जोड़ा गया। Logcat उत्पादन

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 लाइन 121: FlashController fc = new FlashController(this);

+1

आयात आपके ऐप को क्रैश नहीं करता है। अपना लॉगकैट शामिल करें। – ianhanniballake

+0

'आयात' कथन निष्पादन योग्य बयान नहीं हैं और सीधे क्रैश का कारण नहीं बन सकते हैं। अपने क्रैश से जुड़े जावा स्टैक ट्रेस की जांच करने के लिए लॉगकैट का उपयोग करें: https://stackoverflow.com/questions/23353173/unfortun-myapp-has-stopped-how-can-i-solve- यह अगर आपको स्टैक ट्रेस समझ में नहीं आता है , इसे अपने प्रश्न में पेस्ट करें और इंगित करें कि आपके कोड स्निपेट से कोड की कौन सी रेखाएं स्टैक ट्रेस में संदर्भित रेखाओं से मेल खाते हैं। – CommonsWare

+0

@ianhanniballake लॉगकैट जोड़ा गया। – Araw

उत्तर

0

मैं वही समस्या का सामना करना पड़ा है। एकमात्र अंतर यह था कि मैंने एंड्रॉइड एम (एपीआई 23) में एसडीके संस्करण अपडेट किया है।

  1. पहले एपीआई 23. करने के लिए अपने SDK अपडेट

  2. तब के लिए चेक जोड़ें: लॉलीपॉप संस्करण के बजाय Build.VERSION.SDK_INT >= Build.VERSION_CODES.M

  3. तो संभवतः आप एंड्रॉयड एम संस्करण के लिए और इसके बाद के संस्करण कोड के नीचे की कोशिश कर सकते हैं:

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

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

} 

आशा इस मदद करता है।

+0

मैंने इसे बिना किसी किस्मत के साथ आजमाया। मैं वर्तमान में लॉलीपॉप और दुर्घटनाओं में दुर्घटनाओं से बचने के लिए प्रतिबिंब का उपयोग कर रहा हूं, लेकिन यदि संभव हो तो मैं इससे बचना चाहूंगा। – Soflete

0

बस अपनी कक्षा को दो में विभाजित करें: API2 के लिए एक, API1 के लिए दूसरा। सबसे पहले एंड्रॉइड संस्करण स्थापित करें और फिर उपयुक्त वर्ग चलाएं। इसे इस तरह कार्य करें:

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

यह परियोजना में मेरी समाधान है।

संबंधित मुद्दे