如何从状态栏检测方向更改

Chu*_*ham 3 android listener orientation broadcastreceiver android-intent

在状态栏下,有五个按钮 - Wifi,蓝牙,GPS,静音模式和自动旋转.我还没有找到一种方法来检测用户何时单击"自动旋转"按钮.

我所做的是有一个服务,倾听方向的变化,如:

public class MyService extends Service {

    @Override
    public void onCreate() {
       super.onCreate();
       IntentFilter intentFilter = new IntentFilter();
       intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
       this.registerReceiver(myReceiver, intentFilter);     
    }

    public BroadcastReceiver myReceiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
          if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
             // Show a message about orientation changes.
             // This method is only called when the phone is physically rotated.
          }
       }
    }  
}
Run Code Online (Sandbox Code Playgroud)

上述BroadcastReceiver仅在手机旋转时才有效,但如果单击"自动旋转"按钮而没有手机的任何物理旋转,则永远不会调用BroadcastReceiver方法.

我也尝试过OrientationEventListener - 但是与BroadcastReceiver方法的行为相同.

要设置方向,我使用以下方法:

Settings.System.getInt(context.getContentResolver(), "accelerometer_rotation")
Run Code Online (Sandbox Code Playgroud)

所以我知道有一种询问系统设置的方法.是否存在陷阱系统设置的[方向]更改?我已经浏览了Android文档,但找不到一个 - 也许,我正在寻找错误的地方,或者没有意图.

有没有人知道如何捕获状态栏中自动旋转按钮的更改?

更新1:我正在使用的设备是:三星Galaxy S3,三星Galaxy S2,三星Galaxy S和三星Galaxy Ace等等.所有这些设备都运行库存ROM并在状态栏下有自动旋转按钮.

更新2:有建议建议使用ContentObserver来监听系统设置的更改,例如:

public class SettingsContentObserver extends ContentObserver {
    public SettingsContentObserver(Handler handler) {
       super(handler);
    }

    @Override
    public boolean deliverSelfNotifications() {
       return super.deliverSelfNotifications(); 
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Logging.writeDebug("Settings change detected: " + selfChange);
    }

    public void registerContentObserver(Context context) {
        context.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION), true, this);
    }

    public void unregisterContentObserver(Context context) {
       context.getContentResolver().unregisterContentObserver(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我发现方法中的selfChange变量onChange总是返回false.

nan*_*esh 10

我想你必须听Settings.System.ACCELEROMETER_ROTATION.没有尝试但这应该工作.

getContentResolver().registerContentObserver(Settings.System.getUriFor
(Settings.System.ACCELEROMETER_ROTATION),
true,contentObserver);
Run Code Online (Sandbox Code Playgroud)

编辑:就像BroadcastReceiver的Onrecieve一样,有一个contentobserver的onchange.因此,只要点击按钮,您就会收到回调.

private ContentObserver contentObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
           // show a toast here
        }
};
Run Code Online (Sandbox Code Playgroud)

  • 是的做这个Settings.System.getInt(context.getContentResolver(),Settings.System.ACCELEROMETER_ROTATION),来获取当前值 (2认同)