Как использовать вспышку/светодиод камеры в качестве фонарика на вкладке Samsung Galaxy Tab?

Я столкнулся с проблемой с Samsung Galaxy Tab. Я хочу использовать вспышку камеры как факел.

Кто-нибудь знает, как включить его?

Таким образом, код, который работает для включения/выключения вспышки камеры на HTC Desire, но не работает на вкладке Samsung Galaxy.

FlashLight.java:

package com.example.FlashLight;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class FlashLight extends Activity {
    private final static String LOG_TAG = "FlashLight";

    private Button mOnBtn;
    private Button mOffBtn;

    private Camera mCamera;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mOnBtn = (Button) findViewById(R.id.on_btn);
        mOnBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                processOnClick();
            }
        });

        mOffBtn = (Button) findViewById(R.id.off_btn);
        mOffBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                processOffClick();
            }
        });
   }

    @Override
    protected void onResume() {
        super.onResume();
        try{
            mCamera = Camera.open();
        } catch( Exception e ){
            Log.e(LOG_TAG, "Impossible d'ouvrir la camera");
        }
    }

    @Override
    protected void onPause() {
        if( mCamera != null ){
            mCamera.release();
            mCamera = null;
        }
        super.onPause();
    }

    private void processOffClick(){
        if( mCamera != null ){
            Parameters params = mCamera.getParameters();
            params.setFlashMode( Parameters.FLASH_MODE_OFF );
            mCamera.setParameters( params );
        }
    }

    private void processOnClick(){
        if( mCamera != null ){
            Parameters params = mCamera.getParameters();
            params.setFlashMode( Parameters.FLASH_MODE_TORCH );
            mCamera.setParameters( params );
        }
    }
}

AndroidManifest.xml:            

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".FlashLight"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
</manifest>

layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button  
        android:id="@+id/on_btn"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Flash ON" />

    <Button  
        android:id="@+id/off_btn"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Flash OFF" />
</LinearLayout>

Спасибо!

Ответ 1

Ты не делаешь ничего плохого. На самом деле, вы делаете все правильно. Вы сталкиваетесь с проблемой, специфичной для устройства, которая очень распространена в мире Android. Я нашел следующие шаблоны поведения для FLASH_MODE_TORCH:

  • Хорошо работает во всех случаях
  • Работает нормально, но не с автофокусом
  • Не работает вообще

Разочарочно, getSupportedFlashModes() вернет FLASH_MODE_TORCH почти на каждом устройстве, когда только небольшая часть его действительно поддерживает.

Кроме того, некоторые реализации устройств подгоняют поддерживаемые режимы вспышки. Если вы перейдете через Camera.Parameters, вы можете попробовать установить режим вспышки в FLASH_MODE_ON, FLASH_MODE_AUTO или FLASH_MODE_RED_EYE и посмотреть, работает ли какой-либо из них. Примечание. Это хакер, специфичный для устройства.

Я зарегистрировал эти типы ошибок с Google в отношении DroidX и Nexus S. Они закрыли его как проблему, связанную с устройством. Я бы сказал, чтобы сообщить об этом Samsung в надежде на исправление драйвера или прошивки, но их каналы поддержки Android не существуют.

Ответ 2

Взял меня немного, но я думаю, что вам не хватает startPreview().

После выполнения Camera.open() и после установки параметров выполните mCamera.startPreview(). Это должно делать свое дело.

Ответ 3

Вот как я это сделал.

if (Build.MODEL.equals("GT-P1000")) {

            Log.d(FlashlightActivity.TAG, "This is Samsung Galaxy Tab.");

            params.setFlashMode(Parameters.FLASH_MODE_ON);
            camera.setParameters(params);
            camera.startPreview();
            camera.autoFocus(new AutoFocusCallback() {
                public void onAutoFocus(boolean success, Camera camera) {
                }
            });

            isLEDturnedOn = true;
            Log.d(FlashlightActivity.TAG, "LED turned ON.");

} 

Ответ 4

Вот как я включаю факел в LG Nexus 4 и Samsung Galaxy Ace 2.

public void changeTorch() {
            try {
                camera = Camera.open();
                // try to open the camera to turn on the torch
                Camera.Parameters param = camera.getParameters();
                param.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                camera.setParameters(param);
                camera.startPreview(); // needed for some devices
                Log.v("BSW torch", "Torch ON");
            } catch (Exception e) {
                // if open camera fails, try to release camera
                Log.w("BSW torch", "Camera is being used trying to turn Torch OFF");
                try {
                    camera.release();
                } catch (Exception ex) {
                    Log.e("BSF torch", "Error releasing camera");
                }
            }
        }