অ্যান্ড্রয়েডে ক্যামেরা ওরিয়েন্টেশন সমস্যা


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()পিক ছবিতে।

আমি যখন নেক্সাস একটিতে আমার অ্যাপ্লিকেশনটি চালিত করি তখন এটি ভালভাবে চলে। তবে আমি যখন স্যামসুং গ্যালাক্সি এস বা এইচটিসি ইনস্পায়ার 4 জি তে চালাই, তখন চিত্রটির দিকটি সঠিক নয়।

  • প্রতিকৃতি মোডের সাথে ক্যাপচার করুন, আসল চিত্রটি (এসডি কার্ডে সংরক্ষণ করুন) সর্বদা 90 ডিগ্রি ঘোরান।

শট পরে চিত্র পূর্বরূপ এসডি কার্ডে বাস্তব চিত্র

শটের পরে চিত্র পূর্বরূপ --------- এসডি কার্ডে আসল চিত্র

  • ল্যান্ডস্কেপ মোডের সাথে ক্যাপচার করুন, সমস্ত কিছু ভাল।

শট পরে চিত্র পূর্বরূপ এসডি কার্ডে বাস্তব চিত্র

শটের পরে চিত্র পূর্বরূপ --------- এসডি কার্ডে আসল চিত্র


4
সেটরোটেশন (90) আমার পক্ষে স্যামসুং গ্যালাক্সি নেক্সাসে কাজ করেছিল, যদিও এটি চিত্রটি এক্সপেরিয়া এস
তে

যে কেউ এই আমাকে সাহায্য করতে পারেন? আমি একই সমস্যা আছে stackoverflow.com/questions/28379130/...



উত্তর:


50

এখানে প্রায় বেশ কয়েকটি অনুরূপ বিষয় এবং সমস্যা রয়েছে। যেহেতু আপনি নিজের ক্যামেরা লিখছেন না, তাই আমার মনে হয় এটি এটিকে ফুটিয়ে তোলে:

কিছু ডিভাইস চিত্রটি সংরক্ষণের আগে ঘোরান, আবার অন্যরা কেবল ফটোটির এক্সিফ ডেটাতে ওরিয়েন্টেশন ট্যাগ যুক্ত করে।

আমি ছবির এক্সিফ ডেটা পরীক্ষা করে বিশেষত সন্ধান করার পরামর্শ দেব

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

যেহেতু ফটোটি আপনার অ্যাপ্লিকেশনটিতে সঠিকভাবে প্রদর্শিত হচ্ছে, সমস্যাটি কোথায় তা আমি নিশ্চিত নই, তবে এটি অবশ্যই আপনাকে সঠিক পথে সরিয়ে দেবে!


34
এটি কিছু ডিভাইসে কাজ করছে বলে মনে হচ্ছে না, এটি সমস্ত দিকনির্দেশের জন্য 0 প্রদান করে .. আমি জানি যে এটি গ্যালাক্সি এস ইনফিউজ এবং সনি এক্স্পেরিয়া আর্ক এবং এস II এ ঘটেছিল Interest এখানে মজার বিষয় হ'ল যখন এই চিত্রগুলি গ্যালারী থেকে নির্বাচিত হয় , সামগ্রী সরবরাহকারীর যথাযথ ওরিয়েন্টেশন মান আছে .. কোনও ধারণা?
টোলগা ই

4
@ অভিজিৎ হ্যাঁ আমি এটিকে সমাধান করার চেষ্টা করেছি (অ্যান্ড্রয়েডের সাথে খোলা টিকিট এবং আরও অনেক কিছু) এবং আমি মনে করি যে সঠিক এবং ত্রুটিযুক্ত তথ্যের সাথে উভয় ফোন হ্যান্ডেল করার জন্য আমি একটি যুক্তিসঙ্গত সমাধান পেয়েছি। আমি আমার নিজের প্রশ্নে পোস্ট করা আমার বিস্তারিত উত্তরটি এখানে দেখুন; stackoverflow.com/a/8864367/137404
টোলগা ই

4
@ramz আমি এই সমাধানটি অনুসন্ধান করার চেষ্টা করেছি। তবে এটি সমস্ত দিকনির্দেশের জন্য 0 ফিরিয়ে দিচ্ছে। আপনার কেন কোনও ধারণা আছে কেন এটি সমস্ত দিকনির্দেশের জন্য 0 এ ফিরে আসছে।
ডরি

4
এই সমাধানটি কাজ না করার কারণটি কখনও কখনও এক্সিফাইনটারফেস কনস্ট্রাক্টরে একটি ভুল "পথ" ব্যবহৃত হয়। বেশিরভাগ ক্ষেত্রে কিটকেটে। এখানে দেখুন, কিভাবে সঠিক পথে পেতে: stackoverflow.com/a/20559175/690777
peter.bartos

4
এটি সর্বদা আমার স্যামসাং গ্যালাক্সি এস 4-তে 0 (ExifInterface.ORIENTATION_UNDEFINED) ফেরায় ...
ভ্যালিরিবডাক

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
কি হবে যদি ইমেজ আসলে ছিল গ্রহণ তাড়াতে? আপনার কোডটি এখনও এটি ঘোরানো হবে। এটি প্রশ্নের উত্তর নয়।
ও্লাদিমির পালান্ট

4
আমার অ্যাপ্লিকেশন প্রতিকৃতি জোর করে, তাই এটি কোনও সমস্যা নয়। আমি কেবল এখানে এটি সমস্যার বিকল্প বিকল্প অন্তর্ভুক্ত করেছি।

5
তবে যদি অ্যাপ্লিকেশন প্রতিকৃতি জোর করে তবে আপনি এখনও কোনও ল্যান্ডস্কেপ চিত্র (প্রস্থ> উচ্চতা) নিতে পারেন এবং এটি ঘোরানো হবে ... এটি অন্তত যা আমি পর্দার সেট করছি সেটাই হ'ল "প্রতিকৃতি" সবকিছুর জন্য ... ক্যামেরা এখনও ল্যান্ডস্কেপ নিতে পারে ছবি
আইএক্সএক্স

পূর্ণ & সঠিক উত্তর বর্তমান এখানে 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);
    

আশা করি এইটি কাজ করবে.


এই হল! অন্তর্বর্তী বিটম্যাপে রেন্ডারিং না করে ক্যামেরা.প্যারামিটারগুলি স্ন্যাপশটগুলি সংরক্ষণ করতে সত্যই সুবিধাজনক
রুপস

সবচেয়ে সহজ উত্তর হিসাবে চিহ্নিত করুন! এই কাজ! এই সহজ সমাধান সম্পর্কে খুব খুশি
কাই বার্গার্ট

এই স্নিপেটটি যদি সেইভাবে নেওয়া হয় তবে আমরা কেবল বলতে পারি parameters.setRotation(result), না?
ম্যাট লোগান

10
এটি ধরে নিয়েছে যে আপনি সরাসরি ক্যামেরা ক্লাস ব্যবহার করছেন, আপনি যখন অ্যাকশন_আইএমএপিপিএসিপিটিউচার অভিপ্রায়টি ব্যবহার করছেন তখন আপনি একই বিকল্পগুলি নির্দিষ্ট করতে পারবেন না।
ছাদে

4
ফলাফল এবং getCameraDisplayOrientation () কি?
ভেঙ্কট

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

আপনার কোডটি কী করছে এবং কীভাবে এটি অন্যান্য উত্তরগুলির চেয়ে আলাদাভাবে কাজ করছে সে সম্পর্কে কিছুটা ব্যাখ্যা করা সহায়ক (প্রশ্নটি ইতিমধ্যে বেশ পুরানো, এবং অন্যান্য উত্তরগুলি সম্ভবত বেশ পরিপক্ক)।
14:58

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
এই পদ্ধতিটি কার্যকর হবে না, কারণ এটি ডিভাইসগুলি থেকে চিত্রগুলিও ঘোরান যা সঠিকভাবে ওরিয়েন্টেশন পরিচালনা করে।
হানস্পিডে

পূর্ণ & সঠিক উত্তর বর্তমান এখানে 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

এইভাবে চেষ্টা করুন: স্থির উরি চিত্র_রি; স্ট্যাটিক বিটম্যাপ নেওয়া_image = নাল;

            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

আর ফটোটির এক্সিফ ডেটা পরীক্ষা করা হচ্ছে না। গ্লাইড সহ সহজ যান ।

গুগল আমাদের গ্লাইড নামে বাম্পটেক দ্বারা বিকাশিত অ্যান্ড্রয়েডের জন্য একটি চিত্র লোডার লাইব্রেরি চালু করেছে যা গুগলের দ্বারা প্রস্তাবিত একটি লাইব্রেরি হিসাবেএটি গুগল আই / ও ২০১৪ অফিসিয়াল অ্যাপ্লিকেশন সহ এখন পর্যন্ত অনেকগুলি গুগল ওপেন সোর্স প্রকল্পগুলিতে ব্যবহৃত হয়েছে।

উদাঃ গ্লাইড.উইথ (প্রসঙ্গে) .লোড (ইউরি) .আইন্টো (চিত্রদর্শন);

আরও জন্য: 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

পৃষ্ঠতলের পরিবর্তিত কলব্যাকটিতে এটি ব্যবহার করে দেখুন:

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

// একটি ক্লাস ফাইলপথ তৈরি করুন

পাবলিক ক্লাস ফাইলপথ {

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

কোডটি ল্যান্ডস্কেপ এবং প্রতিকৃতির জন্য কার্যক্রমে রয়েছে @ ফ্রন্টকামেরআইডি = ভেরিয়েবল এটি ক্যামেরার জন্য ক্যামেরা চেয়েছিল পদ্ধতিটি ক্লাসিক পেয়েছে

@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 = ওরিয়েন্টেশন

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

পিকাসো এবং গ্লাইড গ্রন্থাগার ব্যবহার করে দুটি ওয়ান লাইন সমাধান

ইমেজ রোটেশন সমস্যার জন্য অনেকগুলি সমাধান সহ অনেক সময় ব্যয় করার পরে অবশেষে দুটি সহজ সমাধান পেয়েছি। আমাদের কোনও অতিরিক্ত কাজ করার দরকার নেই। আপনার অ্যাপ্লিকেশনটিতে চিত্রগুলি পরিচালনা করার জন্য পিকাসো এবং গ্লাইড একটি খুব শক্তিশালী গ্রন্থাগার। এটি চিত্রের এক্সআইএফ ডেটা পড়বে এবং চিত্রগুলি স্বয়ংক্রিয়ভাবে ঘোরাবে।

গ্লাইড গ্রন্থাগার https://github.com/bumptech/glide ব্যবহার করা

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

পিকাসোর লাইব্রেরি https://github.com/square/picasso ব্যবহার করা

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

তাই আপনাকে স্বাগতম। Upvotes জন্য জিজ্ঞাসা থেকে বিরত থাকুন: meta.stackexchange.com/questions/194061/...
Jans
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.