2013-03-07 3 views
0

Я использую ZXing Barcode Scanner library в своем приложении, и у меня возникает следующая ошибка: автофокус камеры работает только в том случае, если устройство подключено к зарядному устройству. Как только я отсоединяю устройство, камера останавливает непрерывную автофокусировку, но как только устройство снова подключается, автоматически фокусируется автоматическая фокусировка (изображение фокусируется каждые 2000 миллисекунд). Батарея испытательного устройства полностью заряжена.Автоматическая фокусировка камеры Android прекращается при отключении от зарядного устройства

Следует отметить, что пример кода из XZing работает правильно, но поскольку я использую его часть в своем приложении, я испытываю вышеупомянутую проблему.

Вот код класса AutoFocusManager:

/*Copyright (C) 2012 ZXing authors 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.myapp.utils.barcode.camera; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.hardware.Camera; 
import android.os.AsyncTask; 
import android.preference.PreferenceManager; 
import android.util.Log; 

import java.util.ArrayList; 
import java.util.Collection; 

import com.myapp.utils.barcode.main.PreferencesActivity; 
import com.myapp.utils.barcode.common.executor.AsyncTaskExecInterface; 
import com.myapp.utils.barcode.common.executor.AsyncTaskExecManager; 

final class AutoFocusManager implements Camera.AutoFocusCallback { 

    private static final String TAG = AutoFocusManager.class.getSimpleName(); 

    private static final long AUTO_FOCUS_INTERVAL_MS = 2000L; 
    private static final Collection<String> FOCUS_MODES_CALLING_AF; 
    static { 
    FOCUS_MODES_CALLING_AF = new ArrayList<String>(2); 
    FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_AUTO); 
    FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_MACRO); 
    } 

    private boolean active; 
    private final boolean useAutoFocus; 
    private final Camera camera; 
    private AutoFocusTask outstandingTask; 
    private final AsyncTaskExecInterface taskExec; 

    AutoFocusManager(Context context, Camera camera) { 
    this.camera = camera; 
    taskExec = new AsyncTaskExecManager().build(); 
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); 
    String currentFocusMode = camera.getParameters().getFocusMode(); 
    useAutoFocus = 
     sharedPrefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true) && 
     FOCUS_MODES_CALLING_AF.contains(currentFocusMode); 
    Log.i(TAG, "Current focus mode '" + currentFocusMode + "'; use auto focus? " + useAutoFocus); 
    start(); 
    } 

    @Override 
    public synchronized void onAutoFocus(boolean success, Camera theCamera) { 
    if (active) { 
     outstandingTask = new AutoFocusTask(); 
     taskExec.execute(outstandingTask); 
    } 
    } 

    synchronized void start() { 
    if (useAutoFocus) { 
     active = true; 
     try { 
     camera.autoFocus(this); 
     } catch (RuntimeException re) { 
     // Have heard RuntimeException reported in Android 4.0.x+; continue? 
     Log.w(TAG, "Unexpected exception while focusing", re); 
     } 
    } 
    } 

    synchronized void stop() { 
    if (useAutoFocus) { 
     try { 
     camera.cancelAutoFocus(); 
     } catch (RuntimeException re) { 
     // Have heard RuntimeException reported in Android 4.0.x+; continue? 
     Log.w(TAG, "Unexpected exception while cancelling focusing", re); 
     } 
    } 
    if (outstandingTask != null) { 
     outstandingTask.cancel(true); 
     outstandingTask = null; 
    } 
    active = false; 
    } 

    private final class AutoFocusTask extends AsyncTask<Object,Object,Object> { 
    @Override 
    protected Object doInBackground(Object... voids) { 
     try { 
     Thread.sleep(AUTO_FOCUS_INTERVAL_MS); 
     } catch (InterruptedException e) { 
     // continue 
     } 
     synchronized (AutoFocusManager.this) { 
     if (active) { 
      start(); 
     } 
     } 
     return null; 
    } 
    } 
} 

Когда устройство подключено к отладчику, то LogCat показывает следующее:

03-07 23:37:14.624: I/AutoFocusManager(2296): Current focus mode 'auto'; use auto focus? true 

Тестовое устройство HTC Sensation, OS - CyanogenMod 10 (Android 4.1.2).

Есть ли у вас какие-либо предложения, какова может быть причина такого поведения?

спасибо.

+0

Если вы начинаете с устройства, отсоединенного от сети, прежде чем пытаться выполнить сканирование, оно все еще не автофокусируется? Или это только тогда, когда он начинает подключаться, а затем отключается, пока камера работает? – FoamyGuy

+0

Автофокус работает только в том случае, если кабель питания подключен. Итак, если я начну сканирование с отключенного устройства, фокусировка не будет работать. Когда я подключаю силовой кабель, он начинает работать как запланировано (один раз в 2 секунды), но он останавливается, как только я отсоединяю кабель. То же самое происходит, если он начинает подключаться. Таким образом, кажется, что подключение кабеля питания играет роль триггера здесь. Мое предположение заключалось в том, что устройство переходит в другое состояние, а некоторые опции для камеры становятся недоступными. Как вы подумайте, возможно ли это? Но, с другой стороны, исходный код работает правильно. Спасибо. –

+1

Я понятия не имею, я бы сказал, что ваша оценка этого кажется правдоподобной, Звучит для меня как странная причуда с вашим конкретным устройством и/или ПЗУ – FoamyGuy

ответ

0

подобное случилось со мной тоже с ZXing 2.1

autoFocusThread X: AF fail 

на Samsung Galaxy (GT-P6200) с Android 4.0.4 и Sonyericcson Xperia Neo/Android 4.0.4.

Ошибка не произошла с ZXing 2.0. You can download release 2.0 from here.

Попытайтесь, я надеюсь, что вы также решите проблему с автофокусом.