APIを使用してAndroidNFCリーダーを有効にする方法はありますか?
4 に答える
したがって、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;
}
私はそれを反射を通して機能させました
このコードは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ボタンの状態が切り替わるため、シーティングメニューで手動で行う場合でも問題はありません。
NfcServiceアプリケーションのソースコードが表示されている場合は、インターフェイスファイルINfcAdapter.aidlがあります。このファイルには、「boolean enable()」と「booleandisable()」という2つのAPIがあります。このAPIを直接使用して、Androidアプリケーションを介してNfcServiceを有効または無効にすることができます。ただし、ここでの秘訣は、Androidが提供するSDKを使用してコードをコンパイルできないことです。makefileを使用してアプリケーションをコンパイルする必要があります。アプリケーションの構築に成功しました。
このフォーラムが、この問題を解決し、NFCの電源オン/オフAPIバリーについて明確に理解するのに役立つことを願っています。
http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html