Android-相机活动后卡住了活动方向

时间:2018-08-16 16:57:13

标签: java android android-intent camera orientation

在我们的应用程序中,用户按下一个按钮即可打开Android默认的相机活动。

有关如何启动相机活动的摘要:

Uri uri = FileProvider.getUriForFile(this, FILE_PROVIDER, image);

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, 1);

问题是,如果“活动”处于人像模式,一切正常,相机处于人像模式,图像以正确的方向保存,等等。

但是在横向模式下,相机会启动,并且返回后,活动会停留在纵向模式,并且不会因倾斜手机而改变。

有人知道这个问题的解决方案吗?

编辑:onActivityResult(...)的代码

EDIT2:已解决的自定义方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == CAMERA_ACTIVITY_CODE && resultCode == Activity.RESULT_OK) {

        //returns Filehandler to image
        File objektImage = getImageForObjekt(loadedObjekt);

        correctImageRotation(objektImage);

        //ImageView
        this.imgObjekt.setImageDrawable(Drawable.createFromPath(objektImage.getAbsolutePath()));
    }
}

此方法可纠正图像旋转-三星手机上的相机存储方向错误,此处已纠正:

public boolean correctImageRotation(File img) {
    ExifInterface ei;
    try {
        ei = new ExifInterface(img.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

    Log.d(this._LOGKEY, getLogPraefix()+" Store the new Objekt image to: " + img.getName());

    Bitmap bm = BitmapFactory.decodeFile(img.getAbsolutePath());

    switch (orientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            bm = rotateImage(bm, 90);
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            bm = rotateImage(bm, 180);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            bm = rotateImage(bm, 270);
            break;
    }

    bm = ImageHelper.squarify(bm);
    bm = ImageHelper.compress(bm, ImageHelper.Size.large);

    try {
        FileOutputStream stream = new FileOutputStream(img);
        bm.compress(Bitmap.CompressFormat.JPEG, 90, stream);
        stream.flush();
        stream.close();

        return true;
    } catch (FileNotFoundException e) {
        Log.e(_LOGKEY, getLogPraefix()+": file not found.");
        return false;
    } catch (IOException e) {
        Log.e(_LOGKEY, getLogPraefix()+": IO problem.");
        return false;
    }
}

此方法可剪切图像。然后是方形的:

public static Bitmap squarify(Bitmap srcBmp) {
    Bitmap dstBmp;

    if (srcBmp.getWidth() >= srcBmp.getHeight()){

        dstBmp = Bitmap.createBitmap(
                srcBmp,
                srcBmp.getWidth()/2 - srcBmp.getHeight()/2,
                0,
                srcBmp.getHeight(),
                srcBmp.getHeight()
        );

    }else{

        dstBmp = Bitmap.createBitmap(
                srcBmp,
                0,
                srcBmp.getHeight()/2 - srcBmp.getWidth()/2,
                srcBmp.getWidth(),
                srcBmp.getWidth()
        );
    }

    return dstBmp;
}

最后,此方法以三种可能的尺寸之一压缩图像:

public static Bitmap compress(Bitmap srcBmp, Size size) {
    int side;

    switch (size) {
        default:
        case small:
            side = 200;
            break;
        case medium:
            side = 400;
            break;
        case large:
            side = 800;
            break;
    }

    return Bitmap.createScaledBitmap(srcBmp, side, side, true);
}

0 个答案:

没有答案