1

Androidネイティブカメラを使用してアプリを開発しています。私は正常に写真を撮って保存し、ImageView に表示できます。私は HTC の欲望 Z、ネクサス S、モトローラ ズームでテストしています。Nexus S の 1 つの問題を除いて、3 つのデバイスすべてで動作します。Nexus S を使用して写真を撮ると、プレビュー画像が 90 度回転します。

この問題を克服する方法を教えてください。

私のコード:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera_preview);
        imgTakenPhoto = (ImageView) findViewById(R.id.imageView);
        getPhotoClick();
    }
    private File getTempFile()
    {
        return new File(Environment.getExternalStorageDirectory(),  "image.tmp");
    }

    private void getPhotoClick()
    {
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile()));
      startActivityForResult(intent, REQUEST_FROM_CAMERA);
    }

    InputStream is=null;

    @Override
    protected void onActivityResult(int requestcode, int resultCode, Intent data){
        if (requestcode == REQUEST_FROM_CAMERA && resultCode == RESULT_OK) {

            File file=getTempFile();

            try {
                is=new FileInputStream(file);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            if(is==null){

                try {
                    Uri u = data.getData();
                    is=getContentResolver().openInputStream(u);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }

            Bitmap thumbnail = BitmapFactory.decodeStream(is);
            imgTakenPhoto.setImageBitmap(thumbnail);

          }
    } 

写真をファイルに保存する際の問題から助けを得ました

どうもありがとう

どなたかお願いします。

4

2 に答える 2

1

プレビューに関するこの問題は、一部の電話で発生します。私が知っている唯一の簡単な回避策は、onCreate()でランドスケープモードを設定することです。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

別の(おそらくやり過ぎの)可能性は、プレビューサーフェスの上に別のサーフェスをオーバーレイし、カスタムPreviewCallbackを作成し、このサーフェスに各フレームを手動で回転および描画することですが、パフォーマンスと画面サイズに問題があります。

于 2011-10-17T13:01:21.160 に答える
0

次の関数は、画像の向きを検出します。

public static int getExifOrientation(String filepath) {
        int degree = 0;
        ExifInterface exif = null;
        try {
            exif = new ExifInterface(filepath);
        } catch (IOException ex) {
            Log.e(TAG, "cannot read exif", ex);
        }
        if (exif != null) {
            int orientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION, -1);
            if (orientation != -1) {                    
                switch(orientation) {
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        degree = 90;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        degree = 180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        degree = 270;
                        break;
             }
    }
}

コードで、この関数を使用してビットマップ イメージを回転させます。Util クラスはhttps://android.googlesource.com/platform/packages/apps/Camera.gitにあります。

if(degree != 0){
  bmp = Util.rotate(bmp, degree);
}

これは、画像のプレビューの向きのみを修正することに注意してください。これがお役に立てば幸いです。

于 2011-12-30T14:09:51.263 に答える