Именю такой код, для включения вспышки mCamera = Camera.open(); Camera.Parameters params = mCamera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); mCamera.setParameters(params); И такой для выключения Camera.Parameters params = mCamera.getParameters(); params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); mCamera.setParameters(params); mCamera.release(); mCamera = null; Как организовать мигание вспышки по нажатию ToggleButton. То есть, есть ToggleButton ON то вспышка мигает, а если OFF то останавливается. PS. Работать с ToggleButton умею, нужет только код, запускающий мигание.
Ответ
Собственно, вот рабочий код. Есть маленький нюанс. Если нажать на кнопку в момент, когда вспышка будет гореть, то она так и останется гореть. Кто захочет, добавит дополнительную проверку или выключение вспышки по завершению цикла. Итак, первым делом обязательно добавляем в файл манифеста строки о доступе к камере и вспышке.
import android.app.Activity;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;
import android.widget.ToggleButton;
public class MainActivity extends Activity implements OnCheckedChangeListener {
ToggleButton mSwitcher;
private Camera mCamera;
private Parameters mParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSwitcher = (ToggleButton) findViewById(R.id.btn_switch);
mSwitcher.setOnCheckedChangeListener(this);
if (!checkCameraHardware())
gameOver();
mCamera = getCameraInstance();
checkFlash();
}
@Override
public void finish() {
super.finish();
if (mCamera != null)
mCamera.release();
}
@Override
public void onCheckedChanged(CompoundButton btn, boolean state) {
if (state) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
if (mCamera != null) {
while (mSwitcher.isChecked()) {
String mode = mParams.getFlashMode();
if (mode.equals(Parameters.FLASH_MODE_OFF))
mode = Parameters.FLASH_MODE_TORCH;
else
mode = Parameters.FLASH_MODE_OFF;
mParams.setFlashMode(mode);
mCamera.setParameters(mParams);
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
thread.start();
}
}
/** Check if this device has a camera */
private boolean checkCameraHardware() {
boolean result = false;
PackageManager pm = getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
&& pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
// this device has a camera and flash
result = true;
} else
gameOver();
return result;
}
private void gameOver() {
finish();
Toast.makeText(this, "Error!", Toast.LENGTH_LONG).show();
}
/** A safe way to get an instance of the Camera object. */
public Camera getCameraInstance() {
CameraInfo info = new CameraInfo();
Camera c = null;
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
try {
c = Camera.open(i); // attempt to get a Camera instance
} catch (Exception e) {
e.printStackTrace();
}
}
}
return c; // returns null if camera is unavailable
}
private void checkFlash() {
if (mCamera != null) {
mParams = mCamera.getParameters();
} else
gameOver();
}
}
Комментариев нет:
Отправить комментарий