利用Java反射机制控制Nfc开关
2017-03-20 18:04
134 查看
利用Java反射机制控制Nfc开关
Nfc状态广播说明
/** * Used as an int extra field in {@link #ACTION_ADAPTER_STATE_CHANGED} * intents to request the current power state. Possible values are: * {@link #STATE_OFF}, * {@link #STATE_TURNING_ON}, * {@link #STATE_ON}, * {@link #STATE_TURNING_OFF}, */ public static final String EXTRA_ADAPTER_STATE = "android.nfc.extra.ADAPTER_STATE"; public static final int STATE_OFF = 1; public static final int STATE_TURNING_ON = 2; public static final int STATE_ON = 3; public static final int STATE_TURNING_OFF = 4; /** * Flag for use with {@link #enableReaderMode(Activity, ReaderCallback, int, Bundle)}. * <p> * Setting this flag enables polling for Nfc-A technology. */
Nfc状态广播action为“android.nfc.action.ADAPTER_STATE_CHANGED”,在这里他会传递四种int类型的状态值,其中STATE_OFF为关闭完成状态,STATE_ON为准备就绪状态,STATE_TURNING_ON为启动Nfc,STATE_TURNING_OFF为准备关闭状态。
编写BroadcastReceiver来接收Nfc状态
mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "接收成功"); String action = intent.getAction(); if (NfcAdapter.ACTION_ADAPTER_STATE_CHANGED.equals(action)) { getStatus(intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF)); } } private void getStatus(int intExtra) { switch (intExtra) { case NfcAdapter.STATE_OFF: Message msg_off = new Message(); msg_off.obj = "close"; mHandler.sendMessage(msg_off); break; case NfcAdapter.STATE_ON: Message msg_on = new Message(); msg_on.obj = "open"; mHandler.sendMessage(msg_on); break; case NfcAdapter.STATE_TURNING_OFF: Message msg_turning_off = new Message(); msg_turning_off.obj = "turning off"; mHandler.sendMessage(msg_turning_off); break; case NfcAdapter.STATE_TURNING_ON: Message msg_turning_on = new Message(); msg_turning_on.obj = "turning on"; mHandler.sendMessage(msg_turning_on); break; } String a = intExtra + ""; Log.d(TAG, a); } }; IntentFilter intentFilter = new IntentFilter("android.nfc.action.ADAPTER_STATE_CHANGED"); registerReceiver(mReceiver, intentFilter);
接收成功后,通知handler来更新ui界面,把Nfc状态显示出来。
利用Java反射机制控制Nfc开关
控制Nfc开关的方法是android.nfc.NfcAdapter里面的enable()和disable();在Android API中代码如下:/** * Enable NFC hardware. * * <p>This call is asynchronous. Listen for * {@link #ACTION_ADAPTER_STATE_CHANGED} broadcasts to find out when the * operation is complete. * * <p>If this returns true, then either NFC is already on, or * a {@link #ACTION_ADAPTER_STATE_CHANGED} broadcast will be sent * to indicate a state transition. If this returns false, then * there is some problem that prevents an attempt to turn * NFC on (for example we are in airplane mode and NFC is not * toggleable in airplane mode on this platform). * * @hide */ @SystemApi public boolean enable() { try { return sService.enable(); } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; } } /** * Disable NFC hardware. * * <p>No NFC features will work after this call, and the hardware * will not perform or respond to any NFC communication. * * <p>This call is asynchronous. Listen for * {@link #ACTION_ADAPTER_STATE_CHANGED} broadcasts to find out when the * operation is complete. * * <p>If this returns true, then either NFC is already off, or * a {@link #ACTION_ADAPTER_STATE_CHANGED} broadcast will be sent * to indicate a state transition. If this r 4000 eturns false, then * there is some problem that prevents an attempt to turn * NFC off. * * @hide */ @SystemApi public boolean disable() { try { return sService.disable(true); } catch (RemoteException e) { attemptDeadServiceRecovery(e); return false; } }
因为在方法注释上面有@hide,说明这两个方法是API隐藏起来的,如果想要调用这两个方法控制Nfc开关就要用到Java反射,代码如下:
private void nfcEnable() { try { Class clazz = Class.forName("android.nfc.NfcAdapter"); Method enable = clazz.getMethod("enable"); // enable.setAccessible(true); enable.invoke(adapter); Log.d(TAG, "调用enable方法成功"); } catch (Exception e) { e.printStackTrace(); } } private void nfcDisable() { try { Class clazz = Class.forName("android.nfc.NfcAdapter"); Method enable = clazz.getMethod("disable", boolean.class); // enable.setAccessible(true); enable.invoke(adapter, false); Log.d(TAG, "调用disable方法成功"); } catch (Exception e) { e.printStackTrace(); } }
在支持Nfc的手机上调用这两个方法,可以观察手机Nfc设置中的Nfc开关,会随之而改变,需求实现!
相关文章推荐
- WPF-利用Blend写的平面控制闸门开关动画
- Nodemcu freertos 学习之路 -- 利用中断 控制led开关
- 利用HTML5实现使用按钮控制背景音乐开关
- 利用电脑串口控制外部设备开关.
- Spring AOP - 引入增强 - 利用一个开关控制是否进行性能监控
- java网络编程--解析通过web.xml文件控制利用过滤器实现编码格式步骤
- 利用css里expression来实现界面对象的批量控制
- c#中利用new和override来控制virtual方法的版本
- 利用标签Loop实现对循环的控制
- 利用Kinect实现用指尖隔空控制鼠标(源码放出)
- 利用java反射机制,实现对类的私有变量和私有方法的访问
- [转贴]利用CSS控制打印
- 利用MCI命令进行 播放录制音乐,以及弹出光驱,音量控制获得播放进度等等操作。。。开发必备。
- 利用java反射机制,将数据库结果集封装成对象
- 利用NPOI开源的读写Excel、WORD等微软OLE2组件读写execl,控制样式或单元格
- 利用TC进行流量控制
- 如何用普通电脑控制电灯泡开关灯
- kinect手势识别后,利用识别效果控制鼠标
- 利用正则表达式, 验证控制文本框的输入字符类型 (转自ben)
- 利用互斥控制程序只有一个运行实例