অ্যান্ড্রয়েড: কোনও ক্রিয়াকলাপে অস্থায়ীভাবে ওরিয়েন্টেশন পরিবর্তনগুলি অক্ষম করুন


116

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

আমার প্রসেসটি শেষ না হওয়া অবধি স্ক্রিন ওরিয়েন্টেশন পরিবর্তনগুলি আমি অগ্রণীভাবে যা করতে চাই, সেই সময়ে ওরিয়েন্টেশন পরিবর্তনগুলি সক্ষম করা হয়।


যেহেতু কেউ এই অংশটি উল্লেখ করেছে বলে মনে হচ্ছে না, আপনি ক্রিয়াকলাপ তথ্য সনাক্তকারী ব্যবহার করার জন্য android.content.pm.ActivityInfo আমদানি করতে চান।
zsalwasser


1
সেরা সমাধানের জন্য দেখুন: স্ট্যাকওভারফ্লো.com / a / 32885911 / 2673792
সুধীর সিনহা

উত্তর:


165

ক্রিস দ্বারা ব্যাখ্যা করা হয়েছে তাঁর স্ব-উত্তরে , কল করে

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

এবং তারপর

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

সত্যিকারের ডিভাইসে ... সত্যই কবিতার মতো কাজ করে!

মনে করবেন না যে এমুলেটরটিতে পরীক্ষা করার সময় এটি নষ্ট হয়ে গেছে, সেন্সরগুলির চালনা ছাড়াই ctrl + F11 শর্টকাট সর্বদা স্ক্রিনের ওরিয়েন্টেশন পরিবর্তন করে।

সম্পাদনা: এটি সর্বোত্তম সম্ভাব্য উত্তর ছিল না। মন্তব্যে বর্ণিত হিসাবে, এই পদ্ধতিতে সমস্যা রয়েছে। আসল উত্তর এখানে


আমি এই ধ্রুবকগুলি সনাক্ত করতে পারি না। তার জন্য ধন্যবাদ.
ক্রিস্টোফার পেরি

41
এই পদ্ধতিগুলির সাথে একটি সমস্যা আছে ... দেখে মনে হচ্ছে আপনি যদি সেটরেক্টেড ওরিয়েন্টেশন (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) কল করেন; যখন ডিভাইসটি তার ডিফল্ট ওরিয়েন্টেশন ব্যবহারে না থাকে, তারপরে ক্রিয়াকলাপ ওরিয়েন্টেশনটি তাত্ক্ষণিকভাবে ডিভাইস ডিফল্ট ওরিয়েন্টেশনে পরিবর্তিত হয় (ধ্বংস এবং পুনরায় তৈরি করা হয়)। উদাহরণস্বরূপ, কোনও ফোনে, আপনি যদি এটিকে ল্যান্ডস্কেপ অভিযোজনে ধরে রাখেন, তবে সেন্সরগুলি পুনরায় সক্রিয় করার সময় ক্রিয়াকলাপটি প্রতিকৃতিতে এবং ল্যান্ডস্কেপে ফিরে আসে। একটি আর্চোস এ 5 আইটির সাথে একই বিপরীত সমস্যা: এটি প্রতিকৃতিতে ব্যবহারের ফলে ক্রিয়াকলাপটি ল্যান্ডস্কেপে পরিবর্তন এবং প্রতিকৃতিতে ফিরে যেতে পারে।
কেভিন গাউডিন

1
মূল প্রশ্নের আসল উত্তরটি এখানে রয়েছে: স্ট্যাকওভারফ্লো
কেভিন গাউডিন

2
এটি আমার পক্ষে কার্যকর হয়নি। যদিও এই এক কাজ করেন: stackoverflow.com/a/10488012/1369016 আমি কলের setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE) এর ছিল; বা সেটঅরচেস্টড ওরিয়েন্টেশন (অ্যাক্টিভিটিআইএনফো। এসসিআরএন_রিআইএনটিশন_সেইনএসওর_প্রেটিআরআইটি); getResource ()। getConfigration () থেকে প্রাপ্ত বর্তমান ওরিয়েন্টেশন ভিত্তিক।
টিয়াগো 21

ActivityInfo.SCREEN_ORIENTATION_SENSORঅ্যান্ড্রয়েডের নেটিভ ওরিয়েন্টেশন লককে সম্মান করে না। ওরিয়েন্টেশনটি পুনরায় সেট করা ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
টিভিঙ্কেন্টার্স

43

অন্যান্য উত্তরগুলির কোনওটিই আমার পক্ষে নিখুঁতভাবে কৌতুক করেনি, তবে আমি যা পেয়েছি তা এখানে।

বর্তমানের দিকে লক ওরিয়েন্টেশন ...

if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ওরিয়েন্টেশন পরিবর্তন করার সময় আবার অনুমতি দেওয়া উচিত, ডিফল্টতে ফিরে সেট করুন ...

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

9
এটির সাথে সমস্যাটি হ'ল Configuration.ORIENTATION_PORTRAITউভয় ল্যান্ডস্কেপ মোডে (যেমন 'সাধারণ' এবং বিপরীত) ফিরে আসবে। তাই যদি ফোনটি বিপরীত ল্যান্ডস্কেপ অভিযোজনে থাকে এবং আপনি এটিকে সেট করেন তবে ActivityInfo.SCREEN_ORIENTATION_LANDSCAPEউল্টে ফ্লপ হয়ে যাবে। এপিআই 9-এ, অ্যাক্টিভিটিআইনফো SCREEN_ORIENTATION_REVERSE_LANDSCAPEধ্রুবকের পরিচয় দেয় , কিন্তু আমি Configurationক্লাসের মাধ্যমে এ জাতীয় অভিমুখ সনাক্তকরণের কোনও উপায় দেখি না ।
Błażej Czapp

1
এটি কাজ করে। উপরোক্ত উদ্বেগের উত্তরটি এই উত্তরে অবস্থিত। stackoverflow.com/a/10453034/1223436
জ্যাক

আমার প্রয়োজনের জন্যও আকর্ষণীয় কাজ করেছে, উজ্জ্বল ধন্যবাদ
ব্যবহারকারী 2029541

39

এখানে আরও সম্পূর্ণ এবং আপ টু ডেট সমাধান যা API 8++ এর জন্য কাজ করে, বিপরীত প্রতিকৃতি এবং ল্যান্ডস্কেপ জন্য কাজ করে এবং একটি গ্যালাক্সি ট্যাবে কাজ করে যেখানে "প্রাকৃতিক" অভিযোজনটি আড়াআড়ি ( activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)অভিযোজন আনলক করার জন্য কল ):

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public static void lockActivityOrientation(Activity activity) {
    Display display = activity.getWindowManager().getDefaultDisplay();
    int rotation = display.getRotation();
    int height;
    int width;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
        height = display.getHeight();
        width = display.getWidth();
    } else {
        Point size = new Point();
        display.getSize(size);
        height = size.y;
        width = size.x;
    }
    switch (rotation) {
    case Surface.ROTATION_90:
        if (width > height)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        break;
    case Surface.ROTATION_180:
        if (height > width)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        break;          
    case Surface.ROTATION_270:
        if (width > height)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    default :
        if (height > width)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}

ট্যাবলেট এবং ফোন দিয়ে আমার জন্য দুর্দান্ত কাজ করেছেন।
ScruffyFox

একমাত্র সঠিক উত্তর যা আমার জন্য সমস্ত ধরণের ডিভাইসে কাজ করে।
আমদেব

অবশ্যই সেরা উত্তর! আপনি এই পদ্ধতিটি তৈরি করতে পারেন staticএবং Activity activityপ্যারামিটার হিসাবে যুক্ত করতে পারেন ।
কাব

18

বিপরীত ওরিয়েন্টেশন মোডগুলি পরিচালনা করার জন্য, আমি ক্রিয়াকলাপের ওরিয়েন্টেশনটি ঠিক করতে সেই কোডটি ব্যবহার করেছি:

int rotation = getWindowManager().getDefaultDisplay().getRotation();

    switch(rotation) {
    case Surface.ROTATION_180:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
        break;
    case Surface.ROTATION_270:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);         
        break;
    case  Surface.ROTATION_0:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    case Surface.ROTATION_90:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        break;
    }

এবং আবার ওরিয়েন্টেশনকে অনুমতি দেওয়ার জন্য:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

17

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);বর্তমান ওরিয়েন্টেশন লক করার জন্য ব্যবহার করুন তা ল্যান্ডস্কেপ বা প্রতিকৃতি হোক।

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);আনলকিং ওরিয়েন্টেশনের জন্য ব্যবহার করুন ।


একটি সংক্ষিপ্ত অস্থায়ী লক জন্য সেরা সমাধান। সেন্সরটির বর্তমান ওরিয়েন্টেশন নিয়ে কোনও গণ্ডগোল নেই।
অবিশ্বাস্য জানুয়ারী

2
Build.VERSION.SDK_INT> = 18 কাজ করে, সম্পূর্ণ উত্তর এই পাতায় tdjprog দেওয়া হয় stackoverflow.com/a/41812971/5235263
bastami82

14

আমি উত্তর খুঁজে পেয়েছি। এটি করতে, কোনও ক্রিয়াকলাপে আপনি setRequestedOrientation(int)এখানে নির্দিষ্ট মানগুলির সাথে কল করতে পারেন : http://developer.android.com/references/android/R.attr.html#screenOrientation

আমার থ্রেডটি লাথি মারার আগে আমি কল করেছিলাম setRequestedOrientation(OFF)(অফ = নাকনসর) এবং থ্রেডটি সম্পন্ন হওয়ার পরে আমি setRequestedOrientation(ON)(ওএন = সেন্সর) কল করেছি। একটি যাদুমন্ত্র মত কাজ করে.


11

সবাইকে ধন্যবাদ. আমি পূর্বের অবস্থায় ফিরে এসেছি কিনা তা নিশ্চিত করার জন্য আমি পাইলট_51 এর সমাধানটি পরিবর্তন করেছি। আমি ল্যান্ডস্কেপ এবং অ-প্রতিকৃতিবিহীন স্ক্রিনগুলি সমর্থন করার জন্য একটি পরিবর্তনও ছুঁড়েছি (তবে এটির স্ক্রিনে এটি পরীক্ষা করে দেখিনি)।

prevOrientation = getRequestedOrientation();
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}

তারপরে এটি পুনরুদ্ধার করতে

setRequestedOrientation(prevOrientation);

ভাল জিনিস - আপনি কেন switchকিছুক্ষণ ব্যবহার করেননি তা নিশ্চিত নয় ।

আমি তৃতীয় বিকল্প যুক্ত করার পরে পরিষ্কার করতে এবং একটি স্যুইচ পরিবর্তন করতে ভুলে গেছি।
প্রকল্পজর্নিম্যান

আমি যদি ক্রিয়াকলাপের অবজেক্টে অ্যাক্সেস না করে তবে বর্তমান কনফিগারেশনটি না পেয়ে এই কাজগুলি পেয়েছি তবে কেবলমাত্র প্রসঙ্গ ActivityInfo.SCREEN_ORIENTATION_NOSENSOR | ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
সর্বোচ্চ 4

8
protected void setLockScreenOrientation(boolean lock) {
    if (Build.VERSION.SDK_INT >= 18) {
        setRequestedOrientation(lock?ActivityInfo.SCREEN_ORIENTATION_LOCKED:ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
        return;
    }

    if (lock) {
        switch (getWindowManager().getDefaultDisplay().getRotation()) {
            case 0: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; // value 1
            case 2: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; // value 9
            case 1: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; // value 0
            case 3: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; // value 8
        }
    } else
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); // value 10
}

আপনি দয়া করে আপনার উত্তরে কিছু ব্যাখ্যা যোগ করতে পারেন?
slpan

আপনার যখন ব্যাকগ্রাউন্ডে কিছু কাজ রয়েছে তখন কেবলমাত্র দৃশ্যাবলী লক করার জন্য সেটলকস্ক্রিন ওরিয়েন্টেশন (সত্য) কল করুন এবং এটি পুনরায় তৈরি করার জন্য বর্তমান ক্রিয়াকলাপটি ধ্বংস করতে প্রতিরোধ করুন। আপনি যখন নিশ্চিত হন যে এই কাজগুলি শেষ হয়েছে, কল করুন setLockScreenOrientation (মিথ্যা) call
tdjprog

2
এটি সেরা উত্তর!
ফখের

7

এখানে একটি সমাধান যা প্রতিবার কাজ করে এবং বর্তমান ওরিয়েন্টেশন সংরক্ষণ করে ( Activity.Info.SCREEN_ORIENTATION_PORTRAITউদাহরণস্বরূপ সেটগুলিকে 0 to এ ব্যবহার করে তবে ব্যবহারকারীর বর্তমানের মতো 180 ° ওরিয়েন্টেশন থাকতে পারে)।

// Scope: Activity

private void _lockOrientation() {
    if (super.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT);
    } else {
        super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE);
    }
}

private void _unlockOrientation() {
    super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

2
উল্লেখ করার মতো মূল্য: কেবলমাত্র API 18+
দিমিত্রি জায়েটসেভ

1

ব্যবহার ActivityInfo.SCREEN_ORIENTATION_USERযদি আপনি ঘূর্ণন স্ক্রিন শুধুমাত্র যদি তার ডিভাইস সক্রিয় করতে চাই।


1

এটি আমার জন্য প্রিফেক্ট কাজ করে। এটি ট্যাবলেট / ফোনের বিভিন্ন "প্রাকৃতিক দৃষ্টিভঙ্গি" দিয়ে সমস্যার সমাধান করে;)

int rotation = getWindowManager().getDefaultDisplay().getRotation();

        Configuration config = getResources().getConfiguration();
        int naturalOrientation;

        if (((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) &&
                config.orientation == Configuration.ORIENTATION_LANDSCAPE)
                || ((rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) &&
                config.orientation == Configuration.ORIENTATION_PORTRAIT)) {
            naturalOrientation = Configuration.ORIENTATION_LANDSCAPE;
        } else {
            naturalOrientation = Configuration.ORIENTATION_PORTRAIT;
        }

        // because getRotation() gives "rotation from natural orientation" of device (different on phone and tablet)
        // we need to update rotation variable if natural orienation isn't 0 (mainly tablets)
        if (naturalOrientation == Configuration.ORIENTATION_LANDSCAPE)
            rotation = ++rotation % 4;

        switch (rotation) {
            case Surface.ROTATION_0: //0
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                break;
            case Surface.ROTATION_90: //1
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                break;
            case Surface.ROTATION_180: //2
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
                break;
            case Surface.ROTATION_270: //3
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
                break;
        }
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }

0

আমি একটি সমাধান নিয়ে এসেছি যা ডিসপ্লে রোটেশনের উপর নির্ভর করে এবং তারপরে ডিভাইসের অভিযোজন স্থির করে। ওরিয়েন্টেশনটি জানার থেকে আমরা ওরিয়েন্টেশনটি লক করতে পারি এবং প্রয়োজনে এটি পরে ছেড়ে দিতে পারি। এই সমাধানটি ডিভাইসটিকে বিপরীত ল্যান্ডস্কেপ মোডে নির্ধারণ করতে পারে ।

private void lockOrientation(){
    switch (((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation()) {


        // Portrait
        case Surface.ROTATION_0:
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;


        //Landscape     
        case Surface.ROTATION_90: 
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;


        // Reversed landscape
        case Surface.ROTATION_270:
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);             
            break;
    }
}

তারপরে যদি আমাদের ওরিয়েন্টেশন প্রকাশের প্রয়োজন হয় তবে আমরা এই পদ্ধতিটি কল করতে পারি:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

0

আমি মনে করি এই কোডটি পড়া সহজ।

private void keepOrientation() {

    int orientation = getResources().getConfiguration().orientation;
    int rotation = getWindowManager().getDefaultDisplay().getRotation();

    switch (rotation) {
        case Surface.ROTATION_0:
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
            break;
        case Surface.ROTATION_90:
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
            break;
        case Surface.ROTATION_180:
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
            break;
        default:
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
    }
}

0

আমি চারটি সম্ভাবনা কভার করার জন্য বিদ্যমান ঘূর্ণন / ওরিয়েন্টেশন মানগুলির সংমিশ্রণটি পেয়েছি; পোর্ট্রেট / ল্যান্ডস্কেপ মান এবং ডিভাইসের প্রাকৃতিক দৃষ্টিভঙ্গি রয়েছে। আসুন বলি যে স্ক্রিনটি "প্রাকৃতিক" প্রতিকৃতি বা ল্যান্ডস্কেপ অভিযোজনে থাকা অবস্থায় ডিভাইসগুলির প্রাকৃতিক ওরিয়েন্টেশনটির 0 ডিগ্রির ঘূর্ণন মান থাকবে। একইভাবে, ল্যান্ডস্কেপ বা প্রতিকৃতিতে যখন 90 ডিগ্রির একটি ঘূর্ণন মান থাকবে (লক্ষ্য করুন এটি ওরিয়েন্টেশন @ 0 ডিগ্রির বিপরীতে রয়েছে)। সুতরাং 0 বা 90 ডিগ্রি নয় এমন ঘূর্ণন মানগুলি "বিপরীত" অভিমুখকে বোঝায়। ঠিক আছে, এখানে কিছু কোড রয়েছে:

public enum eScreenOrientation 
{
PORTRAIT (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT),
LANDSCAPE (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE),
PORTRAIT_REVERSE (ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT),
LANDSCAPE_REVERSE (ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE),
UNSPECIFIED_ORIENTATION (ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

    public final int activityInfoValue;

    eScreenOrientation ( int orientation )
    {
        activityInfoValue = orientation;
    }
}



public eScreenOrientation currentScreenOrientation ( )
{
    final int rotation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();

    final int orientation = getResources().getConfiguration().orientation;
    switch ( orientation ) 
    {
    case Configuration.ORIENTATION_PORTRAIT:
        if ( rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90 )
            return eScreenOrientation.PORTRAIT;
        else
            return eScreenOrientation.PORTRAIT_REVERSE;
    case Configuration.ORIENTATION_LANDSCAPE:
        if ( rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90 )
            return eScreenOrientation.LANDSCAPE;
        else
            return eScreenOrientation.LANDSCAPE_REVERSE;
    default:
        return eScreenOrientation.UNSPECIFIED_ORIENTATION;
    }
}

public void lockScreenOrientation ( )
    throws UnsupportedDisplayException
{
    eScreenOrientation currentOrientation = currentScreenOrientation( );
    if ( currentOrientation == eScreenOrientation.UNSPECIFIED_ORIENTATION )
        throw new UnsupportedDisplayException("Unable to lock screen - unspecified orientation");
    else
        setRequestedOrientation( currentOrientation.activityInfoValue );
}

public void unlockScreenOrientation (  )
{
    setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED );
}

0

আমি এখানে বেশিরভাগ উত্তর পছন্দ করি না, যেহেতু আনলকটিতে তারা এটি পূর্বের রাজ্যের বিপরীতে UNSPECIFIED এ সেট করে। প্রকল্পজর্নিম্যান এটিকে আমলে নিয়েছিল, যা দুর্দান্ত ছিল, তবে আমি রায় দ্বারা লকিং কোডটি পছন্দ করেছি। সুতরাং, আমার সুপারিশটি এই দুটিয়ের মিশ্রণ হবে:

private int prevOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;

private void unlockOrientation() {
    setRequestedOrientation(prevOrientation);
}

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
private void lockOrientation() {
    prevOrientation = getRequestedOrientation();
    Display display = getWindowManager().getDefaultDisplay();
    int rotation = display.getRotation();
    int height;
    int width;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
        height = display.getHeight();
        width = display.getWidth();
    } else {
        Point size = new Point();
        display.getSize(size);
        height = size.y;
        width = size.x;
    }
    switch (rotation) {
        case Surface.ROTATION_90:
            if (width > height)
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            else
                setRequestedOrientation(9/* reversePortait */);
            break;
        case Surface.ROTATION_180:
            if (height > width)
                setRequestedOrientation(9/* reversePortait */);
            else
                setRequestedOrientation(8/* reverseLandscape */);
            break;
        case Surface.ROTATION_270:
            if (width > height)
                setRequestedOrientation(8/* reverseLandscape */);
            else
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
        default :
            if (height > width)
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            else
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}

0

তুমি ব্যবহার করতে পার

public void swapOrientaionLockState(){
    try{
        if (Settings.System.getInt(mContext.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION) == 1) {
            Display defaultDisplay = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
            Settings.System.putInt(mContext.getContentResolver(), Settings.System.USER_ROTATION, defaultDisplay.getRotation());
            Settings.System.putInt(mContext.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0);
        } else {
            Settings.System.putInt(mContext.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 1);
        }

        Settings.System.putInt(mContext.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, !orientationIsLocked() ? 1 : 0);

    } catch (Settings.SettingNotFoundException e){
        e.printStackTrace();
    }
}

public boolean orientationIsLocked(){
    if(canModifiSetting(mContext)){
        try {
            return Settings.System.getInt(mContext.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION) == 0;
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
    }
    return false;
}

public static boolean canModifiSetting(Context context){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return Settings.System.canWrite(context);
    } else {
        return true;
    }
}

-1

কোড লাইন ব্যবহার করুন

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  

আপনার ক্রিয়াকলাপ অনক্রিয়েট পদ্ধতিতে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.