正文  网络通信 > 近场通信/NFC >

android访问NFC的SE

android访问NFC的SE所有文档都在这里。可惜的是,目前只能访问内部SE,对于外部sim或SD的SE,几乎所有的手机都不支持,原因:支持SIM卡的SE,还没有AT命令;支持SD卡的SE...

android访问NFC的SE所有文档都在这里。
可惜的是,目前只能访问内部SE,对于外部sim或SD的SE,几乎所有的手机都不支持,原因:支持SIM卡的SE,还没有AT命令;支持SD卡的SE,还没有API接口。为什么会这样,很简单,因为它们不是google,没有开源的精神!所以我们现在只能访问内部SE,就是存在NFC芯片的SE。
访问SE使用的是SEService/Smartcard Service。手机上必须要安装SEService/Smartcard Service,这个由手机研发实现。
创建
[html]  
seService = new SEService(this, this);  
继承
[html]  
implements SEService.CallBack  
实现接口
[html]  
public void serviceConnected(SEService service)   
{  
  
}  
就可以访问SE了,代码如下:
[html]  
public class MainActivity extends Activity implements SEService.CallBack {  
  
    private SEService seService;  
    NfcAdapter mNfc;  
    TextView mTextView;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        mNfc = NfcAdapter.getDefaultAdapter(this);  
        // do layout and UI stuff  
        setContentView(R.layout.main);        
        mTextView = (TextView) this.findViewById(R.id.text);  
          
        try {  
            // 访问SEService  
            seService = new SEService(this, this);  
          
        } catch (SecurityException e) {  
            mTextView.append("Binding not allowed, uses-permission SMARTCARD?");  
        } catch (Exception e) {  
            mTextView.append("Exception: " + e.getMessage());  
        }  
    }  
  
    @Override  
    protected void onDestroy() {  
        if (seService != null && seService.isConnected()) {  
            seService.shutdown();  
        }  
        super.onDestroy();  
    }  
    //连接上SEService  
    public void serviceConnected(SEService service)   
    {  
        Session session = null;  
        Channel basicChannel = null;  
          
        try {  
            mTextView.append("Getting available readers...\n");  
            Reader[] readers = seService.getReaders();  
            //readers[1]就是内部SE  
            session = readers[1].openSession();  
            //选择card manager aid     
            byte[] aid = {(byte) 0xA0,0x00,0x00,0x00,0x03,0x00,0x00,0x00};  
            basicChannel = session.openBasicChannel(aid);  
            //readers[1]获取card prodution life cycle 数据      
            byte[] CPLC = {(byte) 0x80,(byte) 0xca,(byte) 0x9f,0x7f,0x00};  
            byte[] response1 = basicChannel.transmit(CPLC);                                 
            if(response1.length>=20)  
            {  
                mTextView.append(String.format("SerialID: %02x%02x%02x%02x\n",   
                      response1[15],response1[16],response1[17],response1[18]));      
            }  
        } catch (Exception e) {  
            mTextView.append("Error occured: "+e.getMessage()+"\n");  
        }  
        if(basicChannel!=null)  
             basicChannel.close();  
        if(session!=null)  
          session.close();  
    }  
}