数日前から、アプリケーションの CAMERA モジュールを使用しています。ハードウェアに組み込まれたモバイル カメラをインテントで呼び出す代わりに、完全なカメラ モジュールをカスタマイズしました。シャッター、画像などにコールバックを使用しました。このカスタマイズされたカメラにズームとオートフォーカス機能を追加しようとしています。マニフェスト ファイルに記載されている必要なアクセス許可と共に、ZOOM および AUTO-FOCUS 機能を追加する方法を誰か教えてください。
2 に答える
私の終わりからのいくつかの観察。
1) Camera.autoFocus
は1回限りの呼び出しであり、
Camera.getParameters.getFocusMode()
がFOCUS-MODE-AUTO
または
の場合に適用さFOCUS-MODE-MACRO
れます。それ以外の場合は、
autoFocus
メソッドを呼び出す必要はありません。APIドキュメントを参照し、熱心にフォローしてください。
2)AutoFocusCallback
1回限りの呼び出しとは、このメソッドがインスタンスを登録して通知を継続的に受信しないことを意味し
ます。
3)むしろ、FOCUS-MODE-AUTO
動的で連続的なフォーカス定数ではありません。代わりに、使用および構築しているAPIレベルとSDKバージョンに応じて使用FOCUS-MODE-EDOF
する
ことをお勧めします。FOCUS-MODE-CONTINUOUS-PICTURES
4)実際のデバイスカメラがまたはFOCUS-MODE
などの定数をサポートしていない可能性があり
ます。カメラパラメータを作成するときは、該当する定数を確認し
て使用するようにしてください。EDOF
INFINITE
getSupportedFocusModes
5)camera.autoFocus
直前に呼び出す
とcamera.takePicture
、結果のjpeg-byte-arrayがPictureCallBack
元のサイズより少なくとも50%大きく膨らむ可能性があります。autoFocus()
明示的に呼び出さないと、前autoFocus()
のファイルが非常に低い解像度で終了し、jpeg-byte-arrayの長さがわずか10Kバイトになり、からの画像ビットマップがnullになる場合がありますBitmapFactory
。
6)オートフォーカスの許可については、APIドキュメントを参照してください。
7)ズームに関しては、オートフォーカス機能の実装ほど複雑ではありません。スライダーなどの画面の相互作用、またはボリュームキーなどのハードウェアキーに応じて、からインスタンスを受信するとすぐににZoomChangeListener
登録できるを実装できます。Camera
Camera
open(int cameraId)
ズーム (2x) の場合:
Camera.Parameters parameters = camera.getParameters();
parameters.set("zoom", "2.0");
parameters.set("taking-picture-zoom", "20");
API レベル > 5 の場合は、setZoom()などの API を使用します。
オートフォーカス用 (zxing から取得)
public final boolean onKeyDown(int keyCode, KeyEvent event) {
synchronized(this) {
if (!bIsPictureTaking) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_CAMERA) {
if (!bIsPictureTaking && !bIsAutoFocusStarted){
YourAutoFocusCallback autoFocusCallBack = new YourAutoFocusCallback();
camera.autoFocus(autoFocusCallBack);
.
final class YourAutoFocusCallback implements Camera.AutoFocusCallback {
private static final long AUTOFOCUS_INTERVAL_MS = 1500L;
private final CameraConfigurationManager configManager;
private boolean reinitCamera;
private Handler autoFocusHandler;
private int autoFocusMessage;
AutoFocusCallback(CameraConfigurationManager configManager) {
this.configManager = configManager;
}
void setHandler(Handler autoFocusHandler, int autoFocusMessage) {
this.autoFocusHandler = autoFocusHandler;
this.autoFocusMessage = autoFocusMessage;
}
public void onAutoFocus(boolean success, Camera camera) {
if (autoFocusHandler != null) {
Message message = autoFocusHandler.obtainMessage(autoFocusMessage, success);
autoFocusHandler.sendMessageDelayed(message, AUTOFOCUS_INTERVAL_MS);
autoFocusHandler = null;
configManager.setDesiredCameraParameters(camera);
} else {
}
}
}