J'essaie de modifier les paramètres NFC (activé/désactivé) par programme sur Android 2.3.3.
Sur le téléphone, sous "Paramètres réseau et sans fil",
vous pouvez choisir d’utiliser ou non NFC pour lire et échanger des tags ou non.
Je voudrais donc basculer ce paramètre dans mon application.
Mais je n'arrive pas à trouver une api pour ça.
Je cherche un code qui ressemblerait probablement à ceci:
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled( on/off );
Vous ne pouvez pas activer le on/off
manuellement, mais vous pouvez envoyer l'utilisateur aux préférences s'il s'agit de off
:
if (!nfcForegroundUtil.getNfc().isEnabled())
{
Toast.makeText(getApplicationContext(), "Please activate NFC and press Back to return to the application!", Toast.LENGTH_LONG).show();
startActivity(new Intent(Android.provider.Settings.ACTION_WIRELESS_SETTINGS));
}
La méthode getNfc()
renvoie simplement la nfcadapter
:
nfc = NfcAdapter.getDefaultAdapter (activity.getApplicationContext ());
Ce n'est pas possible par programme sans dispositif d'enracinement. Mais vous pouvez démarrer NFC Settings Activity
par une action intentionnelle Settings.ACTION_NFC_SETTINGS
pour les API de niveau 16 et supérieur. Pour les api <16, utilisez Settings.ACTION_WIRELESS_SETTINGS
La réponse précédemment sélectionnée suggère d'utiliser WIFI_SETTINGS
mais nous pouvons passer directement à NFC_SETTINGS
Voici l'exemple:
Android.nfc.NfcAdapter mNfcAdapter= Android.nfc.NfcAdapter.getDefaultAdapter(v.getContext());
if (!mNfcAdapter.isEnabled()) {
AlertDialog.Builder alertbox = new AlertDialog.Builder(v.getContext());
alertbox.setTitle("Info");
alertbox.setMessage(getString(R.string.msg_nfcon));
alertbox.setPositiveButton("Turn On", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
startActivity(intent);
} else {
Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS);
startActivity(intent);
}
}
});
alertbox.setNegativeButton("Close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alertbox.show();
}
si vous voulez le faire par programme, apparemment ce Q détient la réponse:
Comment activer le lecteur NFC via une API?
Modifier
il ne contenait pas la réponse, mais il contenait la clé de la réponse, sur laquelle j'ai basé mon code auquel j'ai répondu dans le Q.
Je vais le coller ici aussi au cas où quelqu'un serait intéressé.
Je l'ai obtenu en réfléchissant
Ce code fonctionne sur l'API 15, ne l'a pas encore comparé à d'autres versions
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
Cela nécessite cependant 2 autorisations, mettez-les dans le manifeste:
<!-- change NFC status toggle -->
<uses-permission Android:name="Android.permission.NFC" />
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />
L'état du bouton NFC change en conséquence lorsque le code est utilisé. Il n'y a donc aucun problème à le faire manuellement dans le menu de visualisation.
Pour clarifier: Ce code ne fonctionne pas sur les périphériques normaux. Il existe des solutions, mais au moins, il nécessite un root.
Veuillez cocher cette case ci-dessous. Tout est indiqué étape par étape.
http://ranjithdroid.blogspot.com/2015/11/turn-onoff-Android-nfc-by.html
Vous pouvez contrôler les transferts NFC et le reste. Mais pour l'instant l'activer et le désactiver n'est pas possible :(