Androidのカメラアプリを開発しています。
http://qiita.com/fslasht/items/be41e84cfbc4bbb91af7
上記のページ等を参考にさせて頂き組んでいるのですが、カメラの回転方向が端末ごとに異なっているようで、
90°回転している機種や、180°回転している機種など、バラバラになってしまいます。
SurfaceViewの表示は上手くいったかと思えば、bitmapへ保存してimageviewへ表示するとまた回転が変わったり…
現在は判明した機種ごとに分岐を掛けている状態ですが、キリがないです。
調べてみたところ、
activity android:screenOrientation="landscape"
で横固定にしてしまうという方法もあるようですが、
今回は、純正のソフトキーを活かした状態で縦固定のものをつくろうと思っているので、
screenOrientation="portrait"
を指定して作っています。
開発者の皆様はどのように対処されているのでしょうか。
端末ごとの回転に対応する有効な手段があれば、教えて頂けないでしょうか。
以下がPictureCallback部分のソースです。
MainActivity.java
//カメラのPictureCallback部分
private PictureCallback mPictureListener =
new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// データを生成する
Bitmap tmp_bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
int width = tmp_bitmap.getWidth();
int height = tmp_bitmap.getHeight();
// 画像データを回転する
int rad_y = radianToDegree(orientationValues[2]);
Matrix matrix = new Matrix();
if ((rad_y > -45 && rad_y <= 0) || (rad_y > 0 && rad_y <= 45)) {
matrix.setRotate(0);
} else if (rad_y > 45 && rad_y <= 135) {
matrix.setRotate(180);
} else if ((rad_y > 135 && rad_y <= 180) || (rad_y >= -180 && rad_y <= -135)) {
matrix.setRotate(-90);
} else if (rad_y > -135 && rad_y <= -45) {
matrix.setRotate(0);
}
//上でうまくいかない機種は以下のような感じで、回転を変更しています
String deviceName = Build.DEVICE;
if(deviceName.equals("ここに機種名を入れてます")){
int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
Matrix matrix = new Matrix();
matrix.setRotate(90-degrees);
}
Bitmap bitmap = Bitmap.createBitmap(tmp_bitmap, 0, 0, width, height, matrix, true);
//ここから下は、画像保存などの処理を行っています
}
};