4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Androidアプリについての質問です!】カメラの回転が端末ごとにバラバラになる場合の対処法はどのように行っていますか?

Posted at

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);



//ここから下は、画像保存などの処理を行っています



            }
        };


4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?