ปัญหาการวางแนวกล้องใน Android


100

ฉันกำลังสร้างแอพพลิเคชั่นที่ใช้กล้องถ่ายรูป นี่คือซอร์สโค้ดของฉันที่จะทำสิ่งนี้:

        File file = new File(Environment.getExternalStorageDirectory(),
            imageFileName);
    imageFilePath = file.getPath();
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    //Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    startActivityForResult(intent, ACTIVITY_NATIVE_CAMERA_AQUIRE);

ในonActivityResult()วิธีการฉันใช้BitmapFactory.decodeStream()เพื่อรับภาพ

เมื่อฉันเรียกใช้แอปพลิเคชันบน Nexus one มันทำงานได้ดี แต่เมื่อฉันรันบน Samsung Galaxy S หรือ HTC Inspire 4G ทิศทางของภาพไม่ถูกต้อง

  • ถ่ายภาพด้วยโหมดแนวตั้งภาพจริง (บันทึกในการ์ด SD) จะหมุน 90 องศาเสมอ

ภาพตัวอย่างหลังถ่าย ภาพจริงบนการ์ด SD

ภาพตัวอย่างหลังถ่าย --------- ภาพจริงบนการ์ด SD

  • จับภาพด้วยโหมดแนวนอนทุกสิ่งเป็นสิ่งที่ดี

ภาพตัวอย่างหลังถ่าย ภาพจริงบนการ์ด SD

ภาพตัวอย่างหลังถ่าย --------- ภาพจริงบนการ์ด SD


1
setRotation (90) ใช้งานได้สำหรับฉันใน Samsung Galaxy Nexus ในขณะที่มันไม่หมุนภาพใน Xperia S.
StarDust 8

ใครช่วยฉันด้วย ฉันมีปัญหาเดียวกันstackoverflow.com/questions/28379130/…



คำตอบ:


50

มีหัวข้อและประเด็นที่คล้ายกันอยู่ไม่น้อยที่นี่ เนื่องจากคุณไม่ได้เขียนกล้องของคุณเองฉันคิดว่ามันทำให้เกิดสิ่งนี้:

อุปกรณ์บางเครื่องจะหมุนรูปภาพก่อนบันทึกในขณะที่อุปกรณ์อื่น ๆ เพียงแค่เพิ่มแท็กการวางแนวในข้อมูล exif ของรูปภาพ

ขอแนะนำให้ตรวจสอบข้อมูล exif ของรูปภาพและมองหาโดยเฉพาะ

ExifInterface exif = new ExifInterface(SourceFileName);     //Since API Level 5
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);

เนื่องจากรูปภาพแสดงอย่างถูกต้องในแอปของคุณฉันไม่แน่ใจว่าปัญหาอยู่ที่ไหน แต่สิ่งนี้น่าจะทำให้คุณไปถูกทาง!


33
ดูเหมือนจะใช้ไม่ได้กับอุปกรณ์บางรุ่น แต่จะคืนค่าเป็น 0 สำหรับการวางแนวทั้งหมด .. ฉันรู้ว่ามันเกิดขึ้นกับ Galaxy S Infuse และ Sony Xperia Arc และ S II .. สิ่งที่น่าสนใจก็คือเมื่อเลือกภาพเดียวกันนี้จากแกลเลอรี ผู้ให้บริการเนื้อหามีค่าการวางแนวที่เหมาะสม .. ความคิดใด?
Tolga E

3
@Abhijit ใช่ฉันพยายามแก้ปัญหานี้ (เปิดตั๋วด้วย Android เป็นต้น) และฉันคิดว่าฉันพบวิธีแก้ปัญหาที่เหมาะสมในการจัดการโทรศัพท์ทั้งสองเครื่องด้วยข้อมูลการวางแนวที่เหมาะสมและผิดพลาด ตรวจสอบคำตอบโดยละเอียดของฉันที่ฉันโพสต์ไว้ในคำถามของฉันเองที่นี่ stackoverflow.com/a/8864367/137404
Tolga E

1
@ramz ฉันลองวิธีนี้เพื่อค้นหา แต่กลับเป็น 0 สำหรับการวางแนวทั้งหมด คุณมีความคิดว่าเหตุใดจึงส่งคืน 0 สำหรับการวางแนวทั้งหมด
Dory

1
สาเหตุที่ทำให้โซลูชันนี้ไม่ทำงานบางครั้งก็เป็น "เส้นทาง" ที่ไม่ถูกต้องซึ่งใช้ในตัวสร้าง ExifInterface ส่วนใหญ่อยู่ใน KitKat ดูวิธีเดินทางที่ถูกต้องที่นี่: stackoverflow.com/a/20559175/690777
peter.bartos

1
มันจะคืนค่า 0 (ExifInterface.ORIENTATION_UNDEFINED) บน Samsung Galaxy S4 ของฉันเสมอ ...
valerybodak

28

ฉันเพิ่งพบปัญหาเดียวกันและใช้สิ่งนี้เพื่อแก้ไขการวางแนว:

public void fixOrientation() {
    if (mBitmap.getWidth() > mBitmap.getHeight()) {
        Matrix matrix = new Matrix();
        matrix.postRotate(90);
        mBitmap = Bitmap.createBitmap(mBitmap , 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);
    }
}

ถ้าความกว้างของบิตแมปมากกว่าความสูงรูปภาพที่ส่งคืนจะอยู่ในแนวนอนดังนั้นฉันจึงหมุน 90 องศา

หวังว่าจะช่วยทุกคนเกี่ยวกับปัญหานี้


18
เกิดอะไรขึ้นถ้าภาพที่เป็นจริงที่ถ่ายในแนวนอน? รหัสของคุณจะยังคงหมุนอยู่ นี่ไม่ใช่คำตอบสำหรับคำถาม
Wladimir Palant

1
แอปพลิเคชันของฉันบังคับให้เป็นแนวตั้งดังนั้นนั่นไม่ใช่ปัญหา ฉันรวมสิ่งนี้ไว้ที่นี่เพื่อเป็นทางเลือกในการแก้ปัญหาเท่านั้น

5
แต่ถ้าแอปพลิเคชันบังคับให้ถ่ายภาพแนวตั้งคุณก็ยังสามารถถ่ายภาพแนวนอนได้ (ความกว้าง> ความสูง) และจะหมุนได้ ... อย่างน้อยสิ่งที่ฉันกำลังตั้งค่า screenOrientation = "แนวตั้ง" สำหรับทุกสิ่ง ... กล้องยังสามารถถ่ายแนวนอนได้ ภาพ
Ixx

คำตอบแบบเต็มและถูกต้องแสดงที่นี่stackoverflow.com/questions/6069122/…
Shirish Herwade

21

มีสองสิ่งที่จำเป็น:

  1. การแสดงตัวอย่างกล้องต้องเหมือนกับการหมุนของคุณ ตั้งค่าโดยcamera.setDisplayOrientation(result);

  2. บันทึกภาพที่ถ่ายเป็นตัวอย่างกล้องของคุณ ดำเนินการผ่านทางCamera.Parameters.

    int mRotation = getCameraDisplayOrientation();
    
    Camera.Parameters parameters = camera.getParameters();
    
    parameters.setRotation(mRotation); //set rotation to save the picture
    
    camera.setDisplayOrientation(result); //set the rotation for preview camera
    
    camera.setParameters(parameters);

หวังว่าจะช่วยได้


นี่ไง! Camera.parameters สะดวกมากในการบันทึกสแนปช็อตโดยไม่ต้องแสดงผลเป็นบิตแม
ประดับ

โปรดทำเครื่องหมายที่นี่เป็นคำตอบที่ง่ายที่สุด! งานนี้! มีความสุขมากกับวิธีง่ายๆนี้
Kai Burghardt

หากใช้ตัวอย่างข้อมูลนี้ตามที่เป็นอยู่เราสามารถพูดได้ว่าparameters.setRotation(result)ไม่?
Matt Logan

10
สิ่งนี้ถือว่าคุณกำลังใช้คลาสกล้องถ่ายรูปโดยตรงคุณไม่สามารถระบุตัวเลือกเดียวกันได้เมื่อคุณใช้ ACTION_IMAGE_CAPTURE เจตนา
ชั้นดาดฟ้า

1
ผลลัพธ์และ getCameraDisplayOrientation () คืออะไร?
venkat

10
            int rotate = 0;
            try {
                File imageFile = new File(sourcepath);
                ExifInterface exif = new ExifInterface(
                        imageFile.getAbsolutePath());
                int orientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_NORMAL);

                switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotate = 270;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotate = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotate = 90;
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            Matrix matrix = new Matrix();
    matrix.postRotate(rotate);
    bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

มันจะเป็นประโยชน์หากมีคำอธิบายว่าโค้ดของคุณกำลังทำอะไรและมันทำสิ่งต่างจากคำตอบอื่น ๆ อย่างไร (คำถามนี้ค่อนข้างเก่าไปแล้วและคำตอบอื่น ๆ จึงน่าจะเป็นผู้ใหญ่)
เขียนโค้ด

7

อีกทางเลือกหนึ่งคือการหมุนบิตแมปในหน้าจอผลลัพธ์ดังนี้:

ImageView img=(ImageView)findViewById(R.id.ImageView01);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.refresh);
// Getting width & height of the given image.
int w = bmp.getWidth();
int h = bmp.getHeight();
// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(90);
// Rotating Bitmap
Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true);
BitmapDrawable bmd = new BitmapDrawable(rotatedBMP);

img.setImageDrawable(bmd);

30
วิธีนี้ใช้ไม่ได้ผลเนื่องจากยังหมุนภาพจากอุปกรณ์ที่จัดการการวางแนวอย่างถูกต้อง
hanspeide

คำตอบแบบเต็มและถูกต้องแสดงที่นี่stackoverflow.com/questions/6069122/…
Shirish Herwade

3

ฉันมีปัญหาเดียวกันนี้สำหรับอุปกรณ์บางเครื่อง:

private void rotateImage(final String path) {

    Bitmap scaledBitmap = Bitmap.createScaledBitmap(Conasants.bm1, 1000,
            700, true);
    Bitmap rotatedBitmap = null;
    try {
        ExifInterface ei = new ExifInterface(path);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);
        Matrix matrix = new Matrix();
        switch (orientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.postRotate(90);
            rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                    scaledBitmap.getWidth(), scaledBitmap.getHeight(),
                    matrix, true);
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            matrix.postRotate(180);
            rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                    scaledBitmap.getWidth(), scaledBitmap.getHeight(),
                    matrix, true);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.postRotate(270);
            rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                    scaledBitmap.getWidth(), scaledBitmap.getHeight(),
                    matrix, true);
            break;
        default:
            rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                    scaledBitmap.getWidth(), scaledBitmap.getHeight(),
                    matrix, true);
            break;
        }
    } catch (Throwable e) {
        e.printStackTrace();
    }
    cropImage.setImageBitmap(rotatedBitmap);
    rotatedBitmap = null;
    Conasants.bm1 = null;
}

1

ลองวิธีนี้: Uri image_uri คงที่; บิตแมปคงที่ taken_image = null;

            image_uri=fileUri; // file where image has been saved

      taken_image=BitmapFactory.decodeFile(image_uri.getPath());
      try
        {
            ExifInterface exif = new ExifInterface(image_uri.getPath()); 

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


            switch(orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200);
                    RotateBitmap(taken_image, 90);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200);
                    RotateBitmap(taken_image, 180);

                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200);
                    RotateBitmap(taken_image, 270);

                    break;
                case ExifInterface.ORIENTATION_NORMAL:
                    taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200);
                    RotateBitmap(taken_image, 0);

                    break;
            }

        }
        catch (OutOfMemoryError e)
        {
            Toast.makeText(getActivity(),e+"\"memory exception occured\"",Toast.LENGTH_LONG).show();


        }



public Bitmap RotateBitmap(Bitmap source, float angle) {
      Matrix matrix = new Matrix();
      matrix.postRotate(angle);

      round_Image = source;
      round_Image = Bitmap.createBitmap(source, 0, 0, source.getWidth(),   source.getHeight(), matrix, true);


  return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);

}


1

ไม่มีการตรวจสอบข้อมูล exif ของรูปภาพอีกต่อไป ไปง่ายด้วยฉุยฉาย

Google เปิดตัว Image Loader Library สำหรับ Android ที่พัฒนาโดย bumptech ชื่อGlideเป็นไลบรารีที่ Google แนะนำ ถูกใช้ในโครงการโอเพ่นซอร์สของ Google หลายโครงการจนถึงปัจจุบันรวมถึงแอปพลิเคชันอย่างเป็นทางการของ Google I / O 2014

เช่น Glide.with (บริบท) .load (uri) .into (imageview);

สำหรับข้อมูลเพิ่มเติม: https://github.com/bumptech/glide


1
public void setCameraPicOrientation(){
        int rotate = 0;
        try {
            File imageFile = new File(mCurrentPhotoPath);
            ExifInterface exif = new ExifInterface(
                    imageFile.getAbsolutePath());
            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotate = 270;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotate = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotate = 90;
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Matrix matrix = new Matrix();
        matrix.postRotate(rotate);
        int targetW = 640;
        int targetH = 640;

        /* Get the size of the image */
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
        int photoW = bmOptions.outWidth;
        int photoH = bmOptions.outHeight;

        /* Figure out which way needs to be reduced less */
        int scaleFactor = 1;
        if ((targetW > 0) || (targetH > 0)) {
            scaleFactor = Math.min(photoW/targetW, photoH/targetH);
        }

        /* Set bitmap options to scale the image decode target */
        bmOptions.inJustDecodeBounds = false;
        bmOptions.inSampleSize = scaleFactor;
        bmOptions.inPurgeable = true;

        /* Decode the JPEG file into a Bitmap */
        Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
        bitmap= Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            /* Associate the Bitmap to the ImageView */
      imageView.setImageBitmap(bitmap);
    }

หวังว่านี่จะช่วยได้ !! ขอบคุณ


0
    public static  int mOrientation =  1;

    OrientationEventListener myOrientationEventListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.takephoto);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


        myOrientationEventListener
        = new OrientationEventListener(getApplicationContext()) {

            @Override
            public void onOrientationChanged(int o) {
                // TODO Auto-generated method stub
                if(!isTablet(getApplicationContext()))
                {
                    if(o<=285 && o>=80)
                        mOrientation = 2;
                    else
                        mOrientation = 1;
                }
                else
                {
                    if(o<=285 && o>=80)
                        mOrientation = 1;
                    else
                        mOrientation = 2;
                }

            }
        };

        myOrientationEventListener.enable();

    }



    public static boolean isTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE;
    }

}

ฉันหวังว่านี่จะช่วยได้ขอบคุณ!


0

เพียงพบปัญหาเดียวกันที่นี่ข้อมูลโค้ดด้านล่างใช้ได้กับฉัน:

private static final String[] CONTENT_ORIENTATION = new String[] {
        MediaStore.Images.ImageColumns.ORIENTATION
};

static int getExifOrientation(ContentResolver contentResolver, Uri uri) {
    Cursor cursor = null;

    try {
        cursor = contentResolver.query(uri, CONTENT_ORIENTATION, null, null, null);
        if (cursor == null || !cursor.moveToFirst()) {
            return 0;
        }
        return cursor.getInt(0);
    } catch (RuntimeException ignored) {
        // If the orientation column doesn't exist, assume no rotation.
        return 0;
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

หวังว่านี่จะช่วยได้ :)


0

ลองใช้ใน surfaceChanged callback:

Camera.Parameters parameters=mCamera.getParameters();
if(this.getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
    parameters.setRotation(90);
}else{
    parameters.setRotation(0);
}
mCamera.setParameters(parameters);

0

// คลิกปุ่ม

btnCamera.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View view) {

                try {
                    ContentValues values;
                    values = new ContentValues();
                    values.put(MediaStore.Images.Media.TITLE, "New Picture");
                    values.put(MediaStore.Images.Media.DESCRIPTION, "From your Camera");
                    imageUri = context.getContentResolver().insert(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    startActivityForResult(intent, CAMERA_REQUEST);
                }catch (Exception e){}

            });

// เมธอด onActivityResult

   if (requestCode==CAMERA_REQUEST){
        try {
            if (imageUri!=null) {
                path = String.valueOf(new File(FilePath.getPath(context, imageUri)));
                   }  
        }catch (Exception e){
            toast("please try again "+e.getMessage());
            Log.e("image error",e.getMessage());
        }
    }

// สร้างคลาสไฟล์พา ธ

FilePath ระดับสาธารณะ {

public static String getPath(final Context context, final Uri uri) {

    // check here to KITKAT or new version
    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

    // DocumentProvider
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

        // ExternalStorageProvider
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/"
                        + split[1];
            }
        }
        // DownloadsProvider
        else if (isDownloadsDocument(uri)) {

            final String id = DocumentsContract.getDocumentId(uri);
            final Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"),
                    Long.valueOf(id));

            return getDataColumn(context, contentUri, null, null);
        }
        // MediaProvider
        else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[] { split[1] };

            return getDataColumn(context, contentUri, selection,
                    selectionArgs);
        }
    }
    // MediaStore (and general)
    else if ("content".equalsIgnoreCase(uri.getScheme())) {

        // Return the remote address
        if (isGooglePhotosUri(uri))
            return uri.getLastPathSegment();

        return getDataColumn(context, uri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
}

/**
 * Get the value of the data column for this Uri. This is useful for
 * MediaStore Uris, and other file-based ContentProviders.
 *
 * @param context
 *            The context.
 * @param uri
 *            The Uri to query.
 * @param selection
 *            (Optional) Filter used in the query.
 * @param selectionArgs
 *            (Optional) Selection arguments used in the query.
 * @return The value of the _data column, which is typically a file path.
 */
public static String getDataColumn(Context context, Uri uri,
                                   String selection, String[] selectionArgs) {

    Cursor cursor = null;
    final String column = "_data";
    final String[] projection = { column };

    try {
        cursor = context.getContentResolver().query(uri, projection,
                selection, selectionArgs, null);
        if (cursor != null && cursor.moveToFirst()) {
            final int index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;
}

/**
 * @param uri
 *            The Uri to check.
 * @return Whether the Uri authority is ExternalStorageProvider.
 */
public static boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri
            .getAuthority());
}

/**
 * @param uri
 *            The Uri to check.
 * @return Whether the Uri authority is DownloadsProvider.
 */
public static boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri
            .getAuthority());
}

/**
 * @param uri
 *            The Uri to check.
 * @return Whether the Uri authority is MediaProvider.
 */
public static boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri
            .getAuthority());
}

/**
 * @param uri
 *            The Uri to check.
 * @return Whether the Uri authority is Google Photos.
 */
public static boolean isGooglePhotosUri(Uri uri) {
    return "com.google.android.apps.photos.content".equals(uri
            .getAuthority());
}

}


-1

รหัสใช้งานได้สำหรับแนวนอนและแนวตั้ง @frontCameraID = ตัวแปรทำให้เป็นวิธีคลาสสิกสำหรับการแสดงกล้องที่ต้องการ

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    if(holder.getSurface() == null) {
        return;
    }
    try{
        camera.stopPreview();
    } catch (Exception e){
    }

    try{

        int orientation = getDisplayOrientation(frontCameraID);

        Camera.Parameters parameters = camera.getParameters();
        parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
        if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        }

        parameters.setRotation(rotationPicture);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(orientation);
        camera.startPreview();

    } catch (Exception e) {
        Log.i("ERROR", "Camera error changed: " + e.getMessage());
    }
}

วิธีรับทิศทางการหมุน y เพื่อบันทึกภาพและแสดงการวางแนว @result = การวางแนวบนมุมมองภาพตัวอย่างของกล้อง @rotationPicture = การหมุนที่จำเป็นในการบันทึกภาพอย่างถูกต้อง

private int getDisplayOrientation(int cameraId) {

    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId, info);
    int rotation = ((Activity) context).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;
    }

    int result;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        result = (info.orientation + degrees) % 360;
        result = (360 - result) % 360;
        rotationPicture = (360 - result) % 360;
    } else {
        result = (info.orientation - degrees + 360) % 360;
        rotationPicture = result;
    }

    return result;
}

มีใครมีคำถามเกี่ยวกับรหัสโปรดบอกฉัน


-2

โซลูชัน One line สองรายการโดยใช้ Picasso และ Glide library

หลังจากใช้เวลาไปกับการแก้ไขปัญหาการหมุนภาพมากมายในที่สุดฉันก็พบวิธีง่ายๆสองวิธี เราไม่จำเป็นต้องทำงานเพิ่มเติมใด ๆ Picasso และ Glide เป็นไลบรารีที่ทรงพลังมากสำหรับการจัดการรูปภาพในแอปของคุณ มันจะอ่านข้อมูล EXIF ​​รูปภาพและหมุนภาพอัตโนมัติ

การใช้ห้องสมุด glide https://github.com/bumptech/glide

Glide.with(this).load("http url or sdcard url").into(imgageView);

การใช้ห้องสมุด Picasso https://github.com/square/picasso

Picasso.with(context).load("http url or sdcard url").into(imageView);

ยินดีต้อนรับสู่ SO งดการขอ upvotes: meta.stackexchange.com/questions/194061/…
60
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.