Страницы

Поиск по вопросам

суббота, 9 марта 2019 г.

Как организовать мигание вспышки

Именю такой код, для включения вспышки 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 умею, нужет только код, запускающий мигание.


Ответ

Собственно, вот рабочий код. Есть маленький нюанс. Если нажать на кнопку в момент, когда вспышка будет гореть, то она так и останется гореть. Кто захочет, добавит дополнительную проверку или выключение вспышки по завершению цикла. Итак, первым делом обязательно добавляем в файл манифеста строки о доступе к камере и вспышке. По условиям вопроса я добавил на слой простую ToggleButton. Её id - btn_switch . Всё, дальше можно копировать код в своё Activity и наслаждаться морганием. package com.blogspot.leved_notes.blinker;
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(); }
}

Комментариев нет:

Отправить комментарий