我正在开发NFC应用程序。要启动我的应用,我正在使用带有AAR NDEF记录的NDEF标签。
这很好。但是现在我想直接使用该应用读取标签内容。我怎样才能做到这一点?
(当我从手机上删除标签并再次触摸它时,它已经可以工作了,但是我想取消此步骤。)
更新:更多细节好了,为了更加清楚,这是我当前代码的某些部分。
private NfcAdapter nfcAdapter;
private static final int PENDING_INTENT_TECH_DISCOVERED = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_l);
text_output = (TextView) findViewById(R.id.textView2);
NfcAdapter adapter = ((NfcManager) getSystemService(Context.NFC_SERVICE))
.getDefaultAdapter();
}
@Override
public void onResume() {
super.onResume();
nfcAdapter = ((NfcManager) this.getSystemService(Context.NFC_SERVICE))
.getDefaultAdapter();
PendingIntent pi = createPendingResult(PENDING_INTENT_TECH_DISCOVERED,
new Intent(), 0);
nfcAdapter.enableForegroundDispatch(this, pi,
new IntentFilter[] { new IntentFilter(
NfcAdapter.ACTION_TECH_DISCOVERED) }, new String[][] {
new String[] { "android.nfc.tech.NdefFormatable" },
new String[] { "android.nfc.tech.Ndef" } });
}
@Override
public void onPause() {
super.onPause();
nfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
final Intent data) {
switch (requestCode) {
case PENDING_INTENT_TECH_DISCOVERED:
Runnable runnable = new Runnable() {
@Override
public void run() {
doTagOperation(data);
}
};
new Thread(runnable).start();
break;
}
}
private void doTagOperation(Intent data) {
try {
String action = data.getAction();
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
Tag tag = data.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndefTag = Ndef.get(tag);
}
} catch (Exception ex) {
...
}
}
要启动该应用程序,我在标签上使用AAR-NDEF-Record,可以通过这种方式创建该标签:NdefRecord ndr = NdefRecord.createApplicationRecord(“ com.example.something”);
因此,我想要的是:未启动应用程序时触摸标签即可启动应用程序(已经运行),然后它应直接读取标签,而无需将手机从标签移开并再次触摸。
如果要在活动开始时接收NDEF发现意图,则需要添加一个意图过滤器,该过滤器会在标记的NDEF消息上触发到应用程序清单:
<activity ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
我想您已经具备了上述条件,因此您需要添加NDEF意图过滤器:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
您可以使用基于URI的触发器:
<data android:scheme="http" android:host="mroland.at" android:pathPrefix="/test" />
或基于MIME的方案:
<data android:mimeType="application/vnd.mroland.test" />
或者,如果您想接收NDEF发现的仅包含AAR的标签的意图(我必须承认我从未测试过,所以我仅假设这应该可行):
<data android:scheme="vnd.android.nfc" android:host="ext"
android:pathPrefix="/android.com:pkg" />
但是您必须使用其中之一。(至少必须在大多数设备上使用。某些设备/ Android版本即使没有data
元素也会接受意图过滤器。)
</intent-filter>
</activity>
然后,您可以得到意向的onCreate()
,onStart()
,onResume()
或任何你想要使用读它getIntent()
的方法。
请注意,如果您没有为NDEF_DISCOVERED
清单添加意图过滤器,则带有针对您的应用程序的AAR的NDEF消息将导致MAIN
具有类别的意图操作LAUNCHER
传递到声明此类意图过滤器的第一个活动。在这种情况下,您将不会收到NDEF消息。因此,如果您想接收NDEF消息,则必须为声明一个意图过滤器NDEF_DISCOVERED
。在这种情况下,您可以通过NDEF_DISCOVERED
为特定活动设置意图过滤器来选择由AAR启动的活动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句