首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 程式控制螢幕自動旋轉:Settings.System API 與權限

     編輯:程式設計綜合問答

問題現象

需在 App 內透過開關按鈕控制系統「自動旋轉螢幕」設定 (Settings > Display > Auto-rotate screen)。

核心 API


// 讀取當前狀態
int current = Settings.System.getInt(contentResolver, Settings.System.ACCELEROMETER_ROTATION, 0);

// 切換狀態
Settings.System.putInt(contentResolver, Settings.System.ACCELEROMETER_ROTATION, current == 1 ? 0 : 1);

必要條件

  1. 權限:<uses-permission android:name="android.permission.WRITE_SETTINGS" /> (API 23+ 屬於特殊權限,需引導用戶至設定頁授權)。
  2. Manifest 設定:android:configChanges="orientation|screenSize" + android:screenOrientation="user" 讓 Activity 跟隨系統旋轉設定。

完整實現範例


public class RotationControlActivity extends AppCompatActivity {
    private SwitchCompat autoRotateSwitch;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rotation);
        
        autoRotateSwitch = findViewById(R.id.autoRotateSwitch);
        updateSwitchState();
        
        autoRotateSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (hasWriteSettingsPermission()) {
                setAutoRotate(isChecked);
                updateSwitchState();
            } else {
                requestWriteSettingsPermission();
                buttonView.setChecked(!isChecked);  // 恢復原狀
            }
        });
    }
    
    private boolean hasWriteSettingsPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return Settings.System.canWrite(this);
        }
        return true; // API < 23 自動授權
    }
    
    private void requestWriteSettingsPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivity(intent);
        }
    }
    
    private void setAutoRotate(boolean enabled) {
        Settings.System.putInt(getContentResolver(), 
            Settings.System.ACCELEROMETER_ROTATION, enabled ? 1 : 0);
    }
    
    private void updateSwitchState() {
        int val = Settings.System.getInt(getContentResolver(), 
            Settings.System.ACCELEROMETER_ROTATION, 0);
        autoRotateSwitch.setChecked(val == 1);
    }
}

版本差異與注意點

API 級別WRITE_SETTINGS 權限備註
< 23 (M)安裝時自動授權直接生效
≥ 23 (M)特殊權限,需用戶手動開啟引導至 Settings.ACTION_MANAGE_WRITE_SETTINGS
≥ 29 (Q)更嚴格,部分廠商 ROM 禁止修改可能無效,需降級處理

最佳實踐

  • 檢查權限再寫入,無權限時引導用戶授權而非崩潰。
  • 讀取即時狀態同步 UI,避免開關狀態與系統實際設定不同步。
  • 提供 App 內旋轉鎖定選項:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT/SENSOR) 作為替代,不依賴系統設定權限。

系統設定修改屬於敏感操作,權限模型不斷收緊,設計時應提供「App 內旋轉控制」作為無權限時的降級方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved