需在 App 內透過開關按鈕控制系統「自動旋轉螢幕」設定 (Settings > Display > Auto-rotate screen)。
// 讀取當前狀態
int current = Settings.System.getInt(contentResolver, Settings.System.ACCELEROMETER_ROTATION, 0);
// 切換狀態
Settings.System.putInt(contentResolver, Settings.System.ACCELEROMETER_ROTATION, current == 1 ? 0 : 1);
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> (API 23+ 屬於特殊權限,需引導用戶至設定頁授權)。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 禁止修改 | 可能無效,需降級處理 |
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT/SENSOR) 作為替代,不依賴系統設定權限。系統設定修改屬於敏感操作,權限模型不斷收緊,設計時應提供「App 內旋轉控制」作為無權限時的降級方案。