8

APIを使用してAndroidNFCリーダーを有効にする方法はありますか?

4

4 に答える 4

6

したがって、Googleがソースコード内で有効にしている場合でも、APIからNFCを有効にする方法はないようです(以下を参照)。

NfcAdapter.isEnabled()のAPIからの行を見ると:

このNFCアダプタで機能が有効になっている場合はtrueを返します。

アプリケーションはこれをヘルパーとして使用して、ユーザーが[設定]でNFCをオンにする必要があることを提案する場合があります。

このメソッドがfalseを返す場合、NFCハードウェアはNFCトランザクションを生成または応答しないことが保証されます。

API内でそれを行う方法がないようです。残念。最善の策は、設定で有効にする必要があることをユーザーに通知し、おそらく設定インテントを起動するためのダイアログです。

編集: 以下はソースからのものですが、ユーザーがAPIでメソッドを実装することを許可しなかったようです(これについては混乱しています)。

アダプターを有効または無効にするのに役立つAndroidソースコードからこれを見つけました。

関連する情報源:

public boolean onPreferenceChange(Preference preference,
        Object value) {
    // Turn NFC on/off

    final boolean desiredState = (Boolean) value;
    mCheckbox.setEnabled(false);

    // Start async update of the NFC adapter state, as the API is
    // unfortunately blocking...
    new Thread("toggleNFC") {
        public void run() {
            Log.d(TAG, "Setting NFC enabled state to: "
                    + desiredState);
            boolean success = false;
            if (desiredState) {
                success = mNfcAdapter.enable();
            } else {
                success = mNfcAdapter.disable();
            }
            if (success) {
                Log.d(TAG,
                        "Successfully changed NFC enabled state to "
                                + desiredState);
                mHandler.post(new Runnable() {
                    public void run() {
                        handleNfcStateChanged(desiredState);
                    }
                });
            } else {
                Log.w(TAG, "Error setting NFC enabled state to "
                        + desiredState);
                mHandler.post(new Runnable() {
                    public void run() {
                        mCheckbox.setEnabled(true);
                        mCheckbox
                                .setSummary(R.string.nfc_toggle_error);
                    }
                });
            }
        }
    }.start();
    return false;
}
于 2011-06-28T16:07:51.100 に答える
3

私はそれを反射を通して機能させました

このコードはAPI15で動作し、他のバージョンとの照合はまだ行っていません

public boolean changeNfcEnabled(Context context, boolean enabled) {
    // Turn NFC on/off
    final boolean desiredState = enabled;
    mNfcAdapter = NfcAdapter.getDefaultAdapter(context);

    if (mNfcAdapter == null) {
        // NFC is not supported
        return false;
    }

    new Thread("toggleNFC") {
        public void run() {
            Log.d(TAG, "Setting NFC enabled state to: " + desiredState);
            boolean success = false;
            Class<?> NfcManagerClass;
            Method setNfcEnabled, setNfcDisabled;
            boolean Nfc;
            if (desiredState) {
                try {
                    NfcManagerClass = Class.forName(mNfcAdapter.getClass().getName());
                    setNfcEnabled   = NfcManagerClass.getDeclaredMethod("enable");
                    setNfcEnabled.setAccessible(true);
                    Nfc             = (Boolean) setNfcEnabled.invoke(mNfcAdapter);
                    success         = Nfc;
                } catch (ClassNotFoundException e) {
                } catch (NoSuchMethodException e) {
                } catch (IllegalArgumentException e) {
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {
                }
            } else {
                try {
                    NfcManagerClass = Class.forName(mNfcAdapter.getClass().getName());
                    setNfcDisabled  = NfcManagerClass.getDeclaredMethod("disable");
                    setNfcDisabled.setAccessible(true);
                    Nfc             = (Boolean) setNfcDisabled.invoke(mNfcAdapter);
                    success         = Nfc;
                } catch (ClassNotFoundException e) {
                } catch (NoSuchMethodException e) {
                } catch (IllegalArgumentException e) {
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {
                }
            }
            if (success) {
                Log.d(TAG, "Successfully changed NFC enabled state to "+ desiredState);
            } else {
                Log.w(TAG, "Error setting NFC enabled state to "+ desiredState);
            }
        }
    }.start();
    return false;
}//end method

ただし、これには2つの権限が必要ですが、マニフェストに入れてください。

 <!-- change NFC status toggle -->
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

コードを使用すると、それに応じてNFCボタンの状態が切り替わるため、シーティングメニューで手動で行う場合でも問題はありません。

于 2012-07-01T23:34:33.417 に答える
1

NfcServiceアプリケーションのソースコードが表示されている場合は、インターフェイスファイルINfcAdapter.aidlがあります。このファイルには、「boolean enable()」と「booleandisable()」という2つのAPIがあります。このAPIを直接使用して、Androidアプリケーションを介してNfcServiceを有効または無効にすることができます。ただし、ここでの秘訣は、Androidが提供するSDKを使用してコードをコンパイルできないことです。makefileを使用してアプリケーションをコンパイルする必要があります。アプリケーションの構築に成功しました。

于 2014-06-05T16:28:07.550 に答える
0

このフォーラムが、この問題を解決し、NFCの電源オン/オフAPIバリーについて明確に理解するのに役立つことを願っています。

http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html

于 2015-11-04T08:21:17.167 に答える