Android: ปิดใช้งานการเปลี่ยนแปลงการวางแนวชั่วคราวในกิจกรรม


116

กิจกรรมหลักของฉันมีรหัสบางอย่างที่ทำให้การเปลี่ยนแปลงฐานข้อมูลบางอย่างไม่ควรหยุดชะงัก ฉันกำลังยกของหนักในอีกกระทู้และใช้กล่องโต้ตอบความคืบหน้าซึ่งฉันตั้งค่าเป็นไม่สามารถยกเลิกได้ อย่างไรก็ตามฉันสังเกตเห็นว่าถ้าฉันหมุนโทรศัพท์เครื่องจะรีสตาร์ทกิจกรรมซึ่งไม่ดีจริงๆสำหรับกระบวนการที่กำลังทำงานอยู่และฉันได้รับ Force Close

สิ่งที่ฉันต้องการทำคือปิดใช้งานการเปลี่ยนแปลงการวางแนวหน้าจอโดยทางโปรแกรมจนกว่ากระบวนการของฉันจะเสร็จสิ้นซึ่งในเวลานั้นการเปลี่ยนแปลงการวางแนวจะถูกเปิดใช้งาน


เนื่องจากไม่มีใครพูดถึงส่วนนี้คุณจึงต้องการนำเข้า android.content.pm.ActivityInfo เพื่อใช้ตัวระบุ ActivityInfo
zsalwasser


1
อ้างถึง: stackoverflow.com/a/32885911/2673792สำหรับทางออกที่ดีที่สุด
Sudhir Sinha

คำตอบ:


165

ตามที่คริสอธิบายในคำตอบด้วยตนเองโทร

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

แล้ว

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

ใช้งานได้จริงอย่างมีเสน่ห์ ... บนอุปกรณ์จริง!

อย่าคิดว่ามันเสียเมื่อทดสอบกับโปรแกรมจำลองทางลัด ctrl + F11 จะเปลี่ยนการวางแนวหน้าจอเสมอโดยไม่ต้องเลียนแบบเซ็นเซอร์

แก้ไข: นี่ไม่ใช่คำตอบที่ดีที่สุด ตามที่อธิบายไว้ในความคิดเห็นมีปัญหาเกี่ยวกับวิธีนี้ คำตอบที่แท้จริงอยู่ที่นี่


ฉันไม่พบค่าคงที่เหล่านั้น ขอบคุณสำหรับสิ่งนั้น
Christopher Perry

41
มีปัญหากับวิธีการเหล่านี้ ... ดูเหมือนว่าถ้าคุณเรียกใช้ setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); เมื่ออุปกรณ์ไม่ได้อยู่ในการใช้งานการวางแนวเริ่มต้นการวางแนวกิจกรรมจะเปลี่ยนทันที (ทำลายและสร้างขึ้นใหม่) เป็นการวางแนวเริ่มต้นของอุปกรณ์ ตัวอย่างเช่นในโทรศัพท์หากคุณถือโทรศัพท์ในแนวนอนกิจกรรมจะเปลี่ยนเป็นแนวตั้งและกลับเป็นแนวนอนเมื่อเปิดใช้งานเซ็นเซอร์อีกครั้ง ปัญหาตรงข้ามเดียวกันกับ Archos A5 IT: การใช้ในแนวตั้งทำให้กิจกรรมเปลี่ยนเป็นแนวนอนและกลับเป็นแนวตั้ง
Kevin Gaudin

1
คำตอบที่แท้จริงสำหรับคำถามเดิมอยู่ที่นั่น: stackoverflow.com/questions/3821423/…
Kevin Gaudin

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน สิ่งนี้ใช้งานได้: stackoverflow.com/a/10488012/1369016ฉันต้องเรียก setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); หรือ setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); ตามการวางแนวปัจจุบันที่ดึงมาจาก getResources (). getConfiguration ().
Tiago

ActivityInfo.SCREEN_ORIENTATION_SENSORไม่เคารพการล็อกการวางแนวดั้งเดิมของ Android การรีเซ็ตการวางแนวทางที่จะActivityInfo.SCREEN_ORIENTATION_UNSPECIFIEDไม่
tvkanters

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ไว้จะพลิกกลับด้าน ใน API 9 ActivityInfo แนะนำSCREEN_ORIENTATION_REVERSE_LANDSCAPEค่าคงที่ แต่ฉันไม่เห็นวิธีตรวจจับการวางแนวดังกล่าวผ่านConfigurationชั้นเรียน
Błażej Czapp

1
สิ่งนี้ได้ผล คำตอบสำหรับข้อกังวลข้างต้นอยู่ในคำตอบนี้ stackoverflow.com/a/10453034/1223436
Zack

ทำงานเหมือนมีเสน่ห์สำหรับความต้องการของฉันด้วยขอบคุณมาก
user2029541

39

นี่คือโซลูชันที่สมบูรณ์และทันสมัยยิ่งขึ้นซึ่งใช้ได้กับ API 8+ ทำงานในแนวตั้งและแนวนอนแบบย้อนกลับและทำงานบนแท็บ Galaxy ที่การวางแนว "ธรรมชาติ" เป็นแนวนอน (เรียก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

คำตอบเดียวที่ถูกต้องซึ่งใช้ได้กับอุปกรณ์ทุกประเภทสำหรับฉัน
amdev

ตอบโจทย์ที่สุดแน่นอน! คุณสามารถสร้างวิธีนี้staticและเพิ่มActivity activityเป็นพารามิเตอร์
caw

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/reference/android/R.attr.html#screenOrientation

ก่อนที่ฉันจะเตะด้ายของฉันฉันเรียกว่าsetRequestedOrientation(OFF)(OFF = nosensor) และเมื่อเธรดเสร็จแล้วฉันก็เรียกsetRequestedOrientation(ON)(ON = เซ็นเซอร์) ใช้งานได้เหมือนมีเสน่ห์


11

ขอบคุณทุกคน ฉันแก้ไขโซลูชันของ Pilot_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แม้ว่า

ลืมทำความสะอาดและเปลี่ยนเป็นสวิตช์หลังจากที่ฉันเพิ่มตัวเลือกที่สาม
ProjectJourneyman

ผมพบว่างานนี้ได้โดยไม่ต้องได้รับการกำหนดค่าปัจจุบันถ้าคุณไม่ได้มีการเข้าถึงวัตถุกิจกรรม แต่ ActivityInfo.SCREEN_ORIENTATION_NOSENSOR บริบท | ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
max4ever

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
}

คุณช่วยเพิ่มคำอธิบายในคำตอบของคุณได้ไหม
slfan

เมื่อคุณมีงานอยู่เบื้องหลังเพียงแค่เรียก setLockScreenOrientation (true) เพื่อล็อกการวางแนวและป้องกันไม่ให้ทำลายกิจกรรมปัจจุบันเพื่อสร้างใหม่ เมื่อคุณแน่ใจว่างานเหล่านี้เสร็จสิ้นแล้วให้เรียก setLockScreenOrientation (false)
tdjprog

2
นี่คือคำตอบที่ดีที่สุด!
Fakher

7

นี่คือวิธีแก้ปัญหาที่ใช้งานได้ทุกครั้งและรักษาการวางแนวปัจจุบัน (เช่นใช้การActivity.Info.SCREEN_ORIENTATION_PORTRAITตั้งค่าเป็น 0 ° แต่ผู้ใช้สามารถวางแนวได้ 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+ เท่านั้น
Dmitry Zaytsev


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 เมื่อเทียบกับสถานะก่อนหน้า ProjectJourneyman ได้คำนึงถึงสิ่งนี้ซึ่งดีมาก แต่ฉันชอบรหัสล็อคของ Roy ดังนั้นคำแนะนำของฉันจะเป็นการผสมผสานระหว่างสองสิ่งนี้:

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.