13

मुझे हाल ही में फ्लैशलाइट के सबसे हालिया मार्शमलो बिल्ड में कैमरे के बारे में कोई समस्या है। कोई भी पहले से Marshmallow संस्करण पर सब मैं/बंद फ्लैश चालू करने के लिए क्या करने की जरूरत पीछा कर रहा था:मार्शमलो में फ्लैशलाइट नियंत्रण

private void turnFlashOn(final Camera camera, int flashLightDurationMs) { 
    if (!isFlashOn()) { 
     final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes(); 
     if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) { 
      mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(mParams); 
     } 
    } 
} 

और

private void turnFlashOff(Camera camera) { 
    if (camera != null) { 
     final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes(); 
     if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) { 
      mParams.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
      camera.setParameters(mParams); 
     } 
    } 
} 

दुर्भाग्य से, Marshmallow उपकरणों जंगल में दुर्घटना के लिए शुरू किया।

RuntimeException: किसी तरह camera.getParameters() और camera.setParameters() जैसे संदेश के साथ असफल करने के लिए शुरू getParameters में विफल रहा है (खाली पैरामीटर)

RuntimeException: setParameters में विफल रहा है

मैं शुरू करने और प्राप्त करने से पहले पूर्वावलोकन रोक की कोशिश की पैरामीटर, जो अब त्रुटियों को फेंकता नहीं है। हालांकि जब मैं camera.startPreview() पर कॉल करता हूं तो पूर्वावलोकन फिर से शुरू नहीं होता है।

मुझे कैमरे को रिहा करने का डर है और इसे फिर से खोलना सवाल से बाहर है क्योंकि इसमें कुछ सेकंड लगते हैं और खराब अनुभव पैदा करेंगे।

मार्शमलो में फ्लैशलाइट को चालू/बंद करने के तरीके पर कोई सुझाव विश्वसनीय रूप से?

उत्तर

0

रनटाइम पर अनुमतियों की जांच के लिए अपने ऐप को अपडेट करें। आपको android.permission.CAMERA दिया गया है। इसे अपने ऐप के मैनिफेस्ट में शामिल करने से यह आपको मार्शमलो पर नहीं दे रहा है। आपको यह पता लगाने की आवश्यकता होगी कि यह दिया गया है या नहीं।

+0

मैं कैमरा अनुमति पहले से ही है। मैं 23 को लक्षित नहीं कर रहा हूं, इसलिए मुझे अभी तक रनटाइम अनुमतियों की जांच करने की आवश्यकता नहीं है, है ना? –

+0

हां और नहीं। यदि आप 23 को लक्षित नहीं कर रहे हैं तो अनुमति पहले से ही दी जानी चाहिए। हालांकि, उपयोगकर्ता एक अक्षम में जा सकता है जो इंस्टॉल करने के बाद अनुमति देता है। उस स्थिति में, आपको जांच करनी होगी (यदि एपीआई 23 डिवाइस पर चल रहा है) चाहे आपके पास अनुमति है या नहीं। यदि आप ऐसा नहीं करते हैं क्योंकि उपयोगकर्ता ने इसे अस्वीकार कर दिया है, तो कैमरा एपीआई खाली या शून्य डेटा वापस कर सकता है। यह बात मार्शमलो के लिए अनुमतियों के बदलावों पर अधिक जानकारी प्रदान करेगी: https://youtu.be/WGz-alwVh8A?list=PLnVy79PaFHMUqqvwbjyKJZv1N8rzHOCBi –

+0

आप सही हैं, वास्तव में यह मामला है। हालांकि ऐप अनुमोदित अनुमतियों के साथ भी दुर्घटनाग्रस्त हो जाता है, इसलिए ऐसा लगता है कि कैमरा एपीआई से संबंधित कुछ बदल गया है और लॉलीपॉप या किटकैट में इसके मुकाबले अलग-अलग व्यवहार करता है। –

4

Google ने ओएस 6 (एंड्रॉइड एम) में टॉर्चमोड पेश किया है।
अगर उद्देश्य है केवल/बंद फ्लैश चालू करने के लिए नीचे दिए गए कोड है कि आपकी मदद कर सकते हैं:

private static void handleActionTurnOnFlashLight(Context context){ 
    try{ 

     CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
     String[] list = manager.getCameraIdList(); 
     manager.setTorchMode(list[0], true); 
    } 
    catch (CameraAccessException cae){ 
     Log.e(TAG, cae.getMessage()); 
     cae.printStackTrace(); 
    } 
} 

private static void handleActionTurnOffFlashLight(Context context){ 
    try{ 
     CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); 
     manager.setTorchMode(manager.getCameraIdList()[0], false); 
    } 
    catch (CameraAccessException cae){ 
     Log.e(TAG, cae.getMessage()); 
     cae.printStackTrace(); 
    } 
} 

आपको बस इतना करना है: जो कैमरे आईडी से बाहर cameraid की सूची प्राप्त शून्य (0) आपका प्राथमिक कैमरा है जिसके लिए आप फ्लैश चालू/बंद करना चाहते हैं। बस इसे चालू या बंद करने के लिए बूलियन मान के साथ setTochMode API सेट करने के लिए कैमरा आईडी को पास करें।

ध्यान दें कि कोड का यह टुकड़ा केवल ओएस 6 के साथ काम करेगा, इसलिए आपको डिवाइस ओएस की जांच करने की आवश्यकता है और इसके आधार पर आपको प्री-मार्शमलो उपकरणों के लिए कौन सी एपीआई कॉल करने की आवश्यकता है।

अगर यह आपकी समस्या हल करता है तो कृपया इसे समाधान के रूप में चिह्नित करें।

1

Saurabh7474 has responded के रूप में, एंड्रॉइड के संस्करण की जांच करने और setTorchMode API का उपयोग करने के लिए यह बहुत सही है।

आप भी Camera.open (...) और इससे पहले कि mCamera बुला के बाद

mCamera.setPreviewTexture (new SurfaceTexture (100)) 

का उपयोग कर मार्शमैलो में params.setFlashMode (...) का उपयोग कर सकते हैं।startPreview();

try { 
       Log.i(TAG, "getCamera"); 
       int requestedCameraId = getIdForRequestedCamera(mFacing); 
       if (requestedCameraId == -1) { 
        throw new RuntimeException("Could not find requested camera."); 
       } 
       mCamera = Camera.open(requestedCameraId); 
       mCamera.setPreviewTexture(new SurfaceTexture(DUMMY_TEXTURE_NAME)); 
       params = mCamera.getParameters(); 
      } catch (RuntimeException e) { 
       Log.e("Failed to Open. Error:", e.getMessage()); 
      } catch (IOException e) { 
       Log.e("Failed to Open. can't setPreviewTexture:", e.getMessage()); 
      } 

फिर जब आप चाहते हैं, आप उपयोग कर सकते हैं

 mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(mParams); 

मेरा जवाब params.setFlashMode (...) का उपयोग करता है और एपीआई 23 और इसके बाद के संस्करण में काम करता है कि विजन एपीआई के CameraSource उदाहरण पर आधारित है। आप CameraSource निरीक्षण करने के लिए निर्णय लेते हैं, कुंजी विधि है कि एक ही समस्या को हल किया है "शुरू()", लाइन 312 में है ...

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java

कारण आप यहां पा सकते हैं https://stackoverflow.com/a/33333046/4114846

0

Saurabh7474 के जवाब के बंद बिल्डिंग, आप एक torchCallback पंजीकरण से Marshmallow के torchMode टॉगल कर सकते हैं:

final CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() { 
    @Override 
    public void onTorchModeUnavailable(String cameraId) { 
     super.onTorchModeUnavailable(cameraId); 
    } 

    @Override 
    public void onTorchModeChanged(String cameraId, boolean enabled) { 
     super.onTorchModeChanged(cameraId, enabled); 
     boolean currentTorchState = enabled; 
     try { 
      mCameraManager.setTorchMode(cameraId, !currentTorchState); 
     } catch (CameraAccessException e){} 



    } 
}; 

mCameraManager.registerTorchCallback(torchCallback, null);//fires onTorchModeChanged upon register 
mCameraManager.unregisterTorchCallback(torchCallback); 
संबंधित मुद्दे