6

NFC を使用するアプリケーションを構築しようとしています。目標は、設定に移動して手動で変更するためのボタン リンクを含む DialogFragment を表示し、機能が有効になっているときに DialogFragment を無効にすることです。

問題: ユーザーがプルダウン通知トレイのアイコンを使用して NFC を有効/無効にすると、onPause/onResume が呼び出されず、条件が完全に失われます。代わりに登録して、リアルタイムで適切に応答できる受信機があると確信しています。どんなアイデア、考え、または参照も大歓迎です!

次のコードは、状態が有効か無効かをチェックします。onResumeイベントでも適切に対応しています。

    NfcManager manager = (NfcManager) getSystemService(Context.NFC_SERVICE);
    NfcAdapter adapter = manager.getDefaultAdapter();

    if(adapter != null && adapter.isEnabled()) {
        detector = new NfcDetector(this);
        detector.setListener(this);
        onNfcFeatureFound();
    }
    else {
        onNfcFeatureNotFound();
    }

この投稿を見ている他の人のために、以下のコードはユーザーを設定に直接導き、NFC を有効/無効にします:

startActivity(new Intent(android.provider.Settings.ACTION_NFC_SETTINGS));
4

2 に答える 2

22

簡単に見つけることができなかったので、同じ問題を探している他の人に答えを投稿する必要があると思いました。

次のコードをアクティビティの onCreate() メソッドに追加します。

IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
this.registerReceiver(mReceiver, filter);

アクティビティ内 (または任意の場所) で宣言された内部プライベート クラス:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (action.equals(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)) {
            final int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE,
                                                 NfcAdapter.STATE_OFF);
            switch (state) {
            case NfcAdapter.STATE_OFF:
                break;
            case NfcAdapter.STATE_TURNING_OFF:
                break;
            case NfcAdapter.STATE_ON:
                break;
            case NfcAdapter.STATE_TURNING_ON:
                break;
            }
        }
    }
};

@Override
public void onDestroy() {
    super.onDestroy();

    // Remove the broadcast listener
    this.unregisterReceiver(mReceiver);
}

  // The following check needs to also be added to the onResume
@Override
protected void onResume() 
    super.onResume();
    // Check for available NFC Adapter
    NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);

    if(adapter != null && adapter.isEnabled()) {
        createNfcDetector();
        //NFC is available on device, but disabled
    }
    else {
        //NFC Is available and enabled
    }
}
于 2013-09-16T19:06:58.747 に答える
4

アダプターの状態が変化したときにブロードキャスト メッセージを受信するために使用できますACTION_ADAPTER_STATE_CHANGEDが、そのオプションは API 18 以降でのみ使用できます。ドキュメントについては、これを参照してください。

18 歳未満の場合、残念ながらこれを行う方法がわかりません。

また、余談ですが、 はandroid.provider.Settings.ACTION_NFC_SETTINGSAPI レベル 16 以降で動作します。以前のバージョンでは、NFC 設定は「ワイヤレス設定」の下にあります。このブログ投稿ensureSensorIsOnの下部にあるメソッドを参照して、API レベルをチェックし、正しい設定ペインにリダイレクトするコード サンプルを確認してください。

于 2013-09-11T15:33:05.197 に答える