Android nfc 从三星 nexus 读取卡
Posted
技术标签:
【中文标题】Android nfc 从三星 nexus 读取卡【英文标题】:Android nfc to read card from samsung nexus 【发布时间】:2011-07-01 07:35:21 【问题描述】:我想从三星 Nexus 手机读取卡片,但 android nfc api 没有提供足够的选项。我也尝试过使用第三方 api 名称“open nfc”,但它给出了不支持 api 的错误。谁能提供我从卡中读取数据的代码。我有读取标签但没有读取卡片的代码。这是下载open nfc api的链接。
http://sourceforge.net/projects/open-nfc/files/Open%20NFC%204.3%20beta%20%2810381%29/
感谢任何帮助。
这是我使用的代码。它给出了opennfc失败的错误......
public class NFCone extends Activity implements CardDetectionEventHandler, ReadCompletionEventHandler,NfcTagDetectionEventHandler
CardListenerRegistry i=null;
CardDetectionEventHandler hand=null;
NfcManager nfcMngr = null;
NfcTagManager mNfcTagManager=null;
NfcTagDetectionEventHandler tagHand=null;
ReadCompletionEventHandler readHand=null;
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
System.out.println("onCreate");
try
nfcMngr.start();
i.registerCardListener(NfcPriority.MAXIMUM, hand);
catch(Exception e)
protected void onResume()
// TODO Auto-generated method stub
super.onResume();
System.out.println("onResume");
Toast.makeText(this, "NDEF reader Starting ... ", Toast.LENGTH_SHORT)
.show();
try
if (mNfcTagManager != null)
mNfcTagManager.registerTagListener(NfcPriority.MAXIMUM, tagHand);
mNfcTagManager.registerMessageReader(NdefTypeNameFormat.WELL_KNOWN,
"U", NfcPriority.MINIMUM, this);
catch(Exception e)
protected void onPause()
super.onPause();
System.out.println("onPause");
mNfcTagManager.unregisterMessageReader(readHand);
mNfcTagManager.unregisterTagListener(tagHand);
protected void onDestroy()
super.onDestroy();
System.out.println("onDestroy");
i.unregisterCardListener(hand);
try
nfcMngr.stop();
catch(Exception e)
public void onCardDetected(Connection connection)
System.out.println("onCardDetected");
//ConnectionProperty[] con = connection.getProperties();
public void onCardDetectedError(NfcErrorCode what)
System.out.println("onCardDetectedError");
// TODO Auto-generated method stub
private void startBrowserOn(String url)
System.out.println("startBrowserOn");
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
public void onReadError(NfcErrorCode what)
System.out.println("onReadError");
public void onTagRead(NdefMessage message)
System.out.println("onTagRead");
if (message != null)
Vector<NdefRecord> records = message.getRecords();
for (int i = 0; i < records.size(); i++)
if (UriRecord.isUriRecord(records.elementAt(i)))
UriRecord uri;
try
try
uri = new UriRecord(records.elementAt(i));
startBrowserOn(uri.getUri().toString());
catch (NfcException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (URISyntaxException e)
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(this, "URISyntaxException! ",
Toast.LENGTH_SHORT).show();
break;
public void onTagDetected(NfcTagConnection connection)
System.out.println("onTagDetected");
public void onTagDetectedError(NfcErrorCode what)
System.out.println("onTagDetectedError");
【问题讨论】:
你读过这个:developer.android.com/guide/topics/nfc/index.html#ndef吗?您的问题有点模糊,您需要更具体地说明您要实现的目标。更好的是,发布您编写的代码,解释它的失败之处,我们可以尝试帮助您。 这个使用我上面提到的api。它给出了 opnenfc 失败的错误。 请从您的 logcat 中发布完整的错误,包括任何异常的堆栈跟踪。 我已经浏览了 developer.android.com,但我没有得到解决方案。我想要一个通用代码来从三星 nexus 手机中读取卡片。 这是错误:需要不可用的共享库 org.opennfc_library 失败 【参考方案1】:在使用 Open NFC 时,您无法使用 Nexus S 读取卡片。至少现在还没有。
Open NFC 堆栈独立于硬件并使用称为 HAL 的抽象层。 Open NFC 唯一可用的 HAL 用于 Inside Secure 硬件,而 Nexus S 使用 NXP 硬件。
你不写你想读什么样的卡,但可能通过使用 Android api 可以实现。其中,我能够读写 MIFARE 卡。
您需要过滤发现的技术
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
那么,在onNewIntent
方法中
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
MifareClassic clas = MifareClassic.get(tagFromIntent);
try
clas.connect();
if (!DefaultAuthenticate(clas))
throw new Exception("Unable to authenticate using default key");
String myData = new String(clas.readBlock(clas
.sectorToBlock(MY_DATA_SECTOR)), "US-ASCII");
clas.close();
catch (Exception ex)
ShowMessage(ex.getMessage());
DefaultAnthenticate 是我使用默认 MIFARE 密钥进行身份验证的方法:
private Boolean DefaultAuthenticate(MifareClassic clas) throws IOException
Boolean result = false;
result = clas.authenticateSectorWithKeyA(MY_DATA_SECTOR,
MifareClassic.KEY_DEFAULT);
result = result
&& clas.authenticateSectorWithKeyB(MY_DATA_SECTOR,
MifareClassic.KEY_DEFAULT);
return result;
代码可以使用一些重构并且有点被切碎,但我认为它显示了正在发生的事情。我希望它对您自己的搜索有所帮助 - 我建议访问http://developer.android.com/guide/topics/connectivity/nfc/advanced-nfc.html
【讨论】:
【参考方案2】:您需要将 opennfc 库添加到您的 Eclipse 项目中。
右键单击项目并选择Properties
,然后转到Java Build Path|Libraries
。单击Add external JARs
并选择您的opennfc 库。最后,单击Order and Export
选项卡并确保检查您的opennfc 库以进行导出。
【讨论】:
@Sheikh Aman 鉴于他正在使用来自 opennfc 库的导入,我假设他有一个 JAR。 是的,我有罐子,我添加了罐子,但我仍然得到同样的错误。 我也有一个来自我下载的 api 的示例代码。它一开始运行,但是当我单击它上面的一个项目时,它给出了这个错误:“java.lang.NoSuchMethodError: android.nfc.NfcAdapter.getDefaultAdapter” 您正在构建 Android API 级别 9+ 并在级别 9+ 设备/模拟器上运行它,我猜?可能值得检查您的 opennfc 库是否需要特定版本的 Android NFC 东西(9 级和 10 级 NFC API 之间存在差异)。【参考方案3】:sourceforg 上提供的 OpenNFC 堆栈 SDK 附加包带有一个自定义内核,可模拟 NFC 控制器(请参阅该包随附的 SDK 文档)。所以我怀疑你是否在不改变驱动程序(open_nfc_driver.ko)的情况下与实际硬件交谈。移植指南(也包含在包中)讨论了如何将驱动程序移植到真实硬件(第 4.5 节使移植适应真实硬件平台)。
【讨论】:
以上是关于Android nfc 从三星 nexus 读取卡的主要内容,如果未能解决你的问题,请参考以下文章