android - 如何从状态栏检测方向变化

标签 android android-intent orientation broadcastreceiver listener

在状态栏下,有五个按钮 - 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.
          }
       }
    }  
}

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

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

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

Settings.System.getInt(context.getContentResolver(), "accelerometer_rotation")

所以我知道有一种方法可以查询系统设置。是否存在捕获系统设置的 [orientation] 更改的 Intent?我浏览了 Android 文档,但找不到一个 - 可能是我找错了地方,或者没有 Intent。

有谁知道一种方法来捕获状态栏中“自动旋转”按钮的更改?

更新 1:我正在使用的设备有:Samsung Galaxy S3、Samsung Galaxy S2、Samsung Galaxy S 和 Samsung 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);
    }
}

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

最佳答案

我想您必须监听 Settings.System.ACCELEROMETER_ROTATION。 还没有尝试过,但这应该有效。

getContentResolver().registerContentObserver(Settings.System.getUriFor
(Settings.System.ACCELEROMETER_ROTATION),
true,contentObserver);

编辑: 就像BroadcastReceiver的Onrecieve有一个contentobserver的onchange。因此,无论何时单击按钮,您都会在此处收到回调。

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

关于android - 如何从状态栏检测方向变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12028742/

相关文章:

java - 如何消除因循环从网络摄像头下载图像而导致的 GC_FOR_ALLOC 消息

android - 不使用 startActivity() 清除 Activity 堆栈

java - 更改应用程序中的方向

android - 如何启用和禁用 Android 解析推送通知

android - RxJava - 使用 GroupedObservable

Android 应用内计费查询

android-intent - 将我的应用程序添加到 "Complete Action Using"列表中,用于 Gmail 中的附件

android - 在 Android 上以编程方式发送带有附件的电子邮件

ios - 设备方向在 iOS 中无法正常工作

iOS - UISupportedInterfaceOrientations 和 shouldAutorotateToInterfaceOrientation