gpt4 book ai didi

安卓/NFC : Get Tag in onCreate() without new Intent

转载 作者:搜寻专家 更新时间:2023-11-01 08:53:13 25 4
gpt4 key购买 nike

我正在开发一个 NFC 应用程序。为了启动我的应用程序,我使用了一个 NDEF 标签,里面有一个 AAR 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");

所以我想要的是:当应用程序未启动时触摸标签使应用程序启动(已经工作)然后它应该直接读取标签而不需要将手机从标签上移开并再次触摸它。

最佳答案

如果您想在 Activity 开始时接收 NDEF 发现 Intent ,您需要添加一个 Intent 过滤器来触发标签的 NDEF 消息到您的应用程序 list :

<activity ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

我猜你已经有了上面的东西,所以你需要添加一个 NDEF Intent 过滤器:

    <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" />

或者,如果您想接收仅包含 AAR 的标签的 NDEF 发现 Intent (我必须承认我从未测试过它,所以我只假设它应该有效):

        <data android:scheme="vnd.android.nfc" android:host="ext"
android:pathPrefix="/android.com:pkg" />

但你必须使用其中之一。 (至少在大多数设备上你必须这样做。有些设备/Android 版本即使没有 data 元素也会接受 intent 过滤器。)

    </intent-filter>
</activity>

然后您可以在 onCreate()onStart()onResume() 或任何您想阅读它的地方使用getIntent() 方法。

请注意,如果您没有将 NDEF_DISCOVERED 的 Intent 过滤器添加到您的 list 中,带有 AAR 的 NDEF 消息将导致 Intent 操作 MAIN类别 LAUNCHER 将传递给您的第一个 Activity ,该 Activity 声明了这样一个 Intent 过滤器。在这种情况下,您将不会收到 NDEF 消息。因此,如果您想要接收 NDEF 消息,您必须NDEF_DISCOVERED 声明一个 Intent 过滤器。在这种情况下,您可以通过为特定 Activity 设置 NDEF_DISCOVERED Intent 过滤器来选择 AAR 启动哪个 Activity 。

关于安卓/NFC : Get Tag in onCreate() without new Intent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com