0

API レベル 9 で、Android は CameraInfo クラスを追加しました。このクラスには、デバイス内の各物理カメラに関する情報が含まれています。特に、方向属性が含まれています。これは、「カメラ画像を時計回りに回転させる必要がある角度であり、自然な方向でディスプレイに正しく表示されます。」これは、 から検出されるデバイスの実際の回転とは異なりgetContext().getWindowManager().getDefaultDisplay().getRotation()ます。

Android のサンプル コードでは、背面カメラのカメラの向きからデバイスの回転を差し引き (正面カメラの場合は少し複雑です)、カメラのプレビューをこの量だけ回転させます。これにより、プレビューが画面の縦向きと横向きの両方で適切に表示されます。

CameraInfo クラスがない API レベル 9 未満でカメラの固有の向きを取得するにはどうすればよいですか?

4

1 に答える 1

1

プラットフォーム固有のソリューションがいくつかあります。しかし、簡単な一般的な解決策はありません。

Android には Hardware Abstract Layer (HAL) があり、ベンダーによって HAL の実装方法が異なります。たとえば、カメラ デバイスごとにドライバーが異なる場合があるため、cameraInfo などのデータを取得する方法も異なります。Android が HAL に API を追加すると、ベンダーはハードウェアに基づいてその API を実装する必要があります。その後、Android フレームワークと Android アプリケーションは、その機能を統一された方法で使用できます。

ただし、おっしゃる通り、getCameraInfo は Froyo の前の HAL にはありません。したがって、直接的なアプローチは、ドライバーまたはプラットフォーム固有のライブラリからこれらの情報を自分で取得することです。

MSM Cameraの場合、 にmm_camera_get_camera_info機能がありliboemcamera.soます。これを使用して、camera_info_t 構造体のリストを取得できます。

typedef struct {
  int  modes_supported;
  int8_t camera_id;
  cam_position_t position;
  uint32_t sensor_mount_angle;
}camera_info_t;

この関数は、ターゲット カメラ デバイスへの実際のシステム コールをカプセル化します。ioctl(controlfd, MSM_CAM_IOCTL_GET_CAMERA_INFO, &cameraInfo). 必要に応じて直接呼び出すこともできます。

残念ながら、作業しているデバイスに基づいてその情報を取得する必要があります。しかし、一般的なアプローチを期待しているかもしれません。これを実現する唯一の方法は、HAL を自分で実装することだと思います。どのデバイスまたはどの ioctl コマンドを使用する必要があるかを決定するための多くの if-else。頑張ってください。

于 2013-03-18T07:51:40.060 に答える