RuntimeException с фонариком Samsung Galaxy

Совершенно не представляю, как это реализовать. Он отлично работает на моем Razr, но не работает на многих устройствах Samsung. У меня есть SurfaceView с предварительным просмотром камеры. Я включил кнопку для использования фонарика. Исключение выдается там, где я вставил блок try:

if (hasFlash()) {
        btnLight = (ImageButton) findViewById(R.id.btn_light);
        btnLight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Parameters p = camera.getParameters();
                if (p.getSupportedFlashModes() != null) {
                    if (p.getSupportedFlashModes().contains(
                            Parameters.FLASH_MODE_TORCH)) {
                        if (isLightOn) {
                            p.setFlashMode(Parameters.FLASH_MODE_OFF);
                            camera.setParameters(p);
                            btnLight.setImageResource(R.drawable.light_on);
                            isLightOn = false;
                        } else {
                            try {
                                p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                                camera.setParameters(p);
                                btnLight.setImageResource(R.drawable.light_off);
                                isLightOn = true;
                            } catch (RuntimeException e){
                                // I don't know how to make this stupid thing work for all phones
                            }
                        }
                    }
                }
            }
        });

person a person    schedule 12.02.2014    source источник
comment
Обычно я распечатываю все параметры камеры и проверяю, какие значения можно использовать. Аппаратные API не могут работать на всех устройствах.   -  person yushulx    schedule 13.02.2014


Ответы (1)


В документации для Android вы можете прочитать:

public void setParameters (Camera.Parameters params)

Throws
RuntimeException    if any parameter is invalid or not supported.

Это означает, что вы используете параметр камеры (FLASH_MODE), который не поддерживается вашим устройством Samsung, и поэтому он не будет работать на этой модели. Я предполагаю, что у него, вероятно, просто нет встроенной вспышки.

person Piotr Chojnacki    schedule 12.02.2014
comment
Я так не думаю, потому что он должен пройти несколько проверок. Сначала метод hasFlash, который проверяет getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH). Затем проверяется getSupportedFlashModes, затем я проверяю, содержат ли режимы флэш-памяти FLASH_MODE_TORCH. - person a person; 12.02.2014
comment
Как он может пройти все эти проверки? - person a person; 12.02.2014
comment
@user3029413 user3029413 Хорошо, каковы подробности этого RuntimeException? У вас есть? - person Piotr Chojnacki; 12.02.2014
comment
java.lang.RuntimeException: сбой setParameters в android.hardware.Camera.native_setParameters(собственный метод) в android.hardware.Camera.setParameters(Camera.java:1352) в - person a person; 12.02.2014
comment
Я пытался найти документацию на сайте Samsung, но ничего не нашел. - person a person; 12.02.2014
comment
@user3029413 user3029413 Вы, вероятно, должны найти свой ответ здесь: stackoverflow.com /вопросы/3890381/ - person Piotr Chojnacki; 12.02.2014
comment
Я изменил его, чтобы выбрать размер из списка, а не пытаться получить наилучший результат самостоятельно. Странно, что RuntimeException было помечено во флеш-коде, а не в onSurfaceChanged() - person a person; 12.02.2014
comment
@user3029413 user3029413 К сожалению, иногда нам приходится искать проблему глубже, чем говорят нам журналы. В любом случае, я рад, что вы решили свою проблему. - person Piotr Chojnacki; 12.02.2014