完全な編集:
あなたのコメントによると、カメラの使用中にトーチフラッシュモードを使用したいということを理解しています。これは可能であり、以下は純粋に概念実証のコードです。非常に最小限の例外処理を実装しており、必要に応じて機能するように調整する必要があることに注意してください。ただし、開始するための基本を示します。
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" >
<android.view.SurfaceView android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="initialize"
android:text="Init" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="takePicture"
android:text="Picture" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="release"
android:text="Done" />
<ToggleButton android:id="@+id/tgbToggle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity
{
Camera camera;
Parameters params;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
PictureCallback callBackJpeg;
Button start, stop, capture;
ToggleButton toggle;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
toggle = (ToggleButton) findViewById(R.id.tgbToggle);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton button, boolean checked)
{
toggleTorch(checked);
}
}
);
surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
callBackJpeg = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera)
{
FileOutputStream fos = null;
String filename = String.format(Environment.getExternalStorageDirectory().toString() +
"/%d.jpg", System.currentTimeMillis());
try
{
fos = new FileOutputStream(filename);
fos.write(data);
fos.close();
Toast.makeText(MainActivity.this, "Picture saved - " + filename, 0).show();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
};
}
public void initialize(View v)
{
camera = Camera.open();
params = camera.getParameters();
try
{
camera.setPreviewDisplay(surfaceHolder);
}
catch (IOException e)
{
Toast.makeText(this, "Unable to set preview display.", 0).show();
return;
}
camera.startPreview();
}
public void takePicture(View v)
{
camera.takePicture(null, null, callBackJpeg);
}
public void release(View v)
{
camera.stopPreview();
camera.release();
}
private void toggleTorch(boolean turnOn)
{
params.setFlashMode(turnOn ? Parameters.FLASH_MODE_TORCH : Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.startPreview();
}
}
アプリが起動したら、クリックInit
してカメラのプレビューを開始します。その後、トグル ボタンでトーチのオンとオフを切り替え、クリックPicture
して写真を撮り、外部ストレージ ディレクトリのルートに保存します。Done
アプリを終了または最小化する前にクリックする必要があります。
編集:最小限
次のアクセス許可をマニフェストに追加します。
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
以下をアクティビティに追加します。
Camera camera;
Parameters params;
@Override
public void onResume()
{
super.onResume();
camera = Camera.open();
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
}
@Override
public void onPause()
{
super.onPause();
camera.release();
}