4

ステータスバーの下には、Wi-Fi、Bluetooth、GPS、サイレントモード、自動回転の5つのボタンがあります。ユーザーが[自動回転]ボタンをクリックしたことを検出する方法はまだわかりません。

私がやったことは、次のような向きの変化をリッスンするサービスを持っていることです。

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")

したがって、システム設定を調べる方法があることを私は知っています。システム設定の[向き]の変更をトラップするインテントはありますか?Androidドキュメントを確認しましたが、見つかりません。おそらく、間違った場所を探しているか、その意図がありません。

ステータスバーの[自動回転]ボタンへの変更をトラップする方法を知っている人はいますか?

更新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);
    }
}

selfChangeただし、メソッド内の変数はonChange常にを返すことがわかりましたfalse

4

1 に答える 1

13

私はあなたが聞く必要があると思いますSettings.System.ACCELEROMETER_ROTATION。Haventは試しましたが、これは機能するはずです。

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

編集:BroadcastReceiverのOnrecieveと同様に、contentobserverの変更があります。したがって、ボタンがクリックされるたびに、ここでコールバックが発生します。

private ContentObserver contentObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
           // show a toast here
        }
};
于 2012-08-19T18:49:57.737 に答える