NFC 读取标签以启动 Google 带坐标的地图
NFC read tag to launch Google Maps with coordinates
我正在尝试通过以下方式编写带有坐标(纬度和经度)的 NFC 标签:
这是里面 onCreate()
:
btnWriteMap.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String latitude = lat.getText().toString();
String longitude = lon.getText().toString();
urlAddress = "geo:"+latitude+","+longitude;
TextView messageText = (TextView)findViewById(R.id.txtMessage);
messageText.setText("Touch NFC Tag to share GEO location\n"+
"Latitude: "+latitude+"\nLongitude: "+longitude);
}
});
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
mFilters = new IntentFilter[] {
ndef,
};
mTechLists = new String[][] { new String[] { Ndef.class.getName() },
new String[] { NdefFormatable.class.getName() }};
onNewIntent()
方法:
@Override
public void onNewIntent(Intent intent) {
Log.i("Foreground dispatch", "Discovered tag with intent: " + intent);
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String externalType = "nfclab.com:geoService";
NdefRecord extRecord = new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, externalType.getBytes(), new byte[0], urlAddress.getBytes());
NdefMessage newMessage = new NdefMessage(new NdefRecord[] { extRecord});
writeNdefMessageToTag(newMessage, tag);
}
代码是书中的示例。我已经测试过,标签确实是用 geo:lat,lon 写的,当然还有我在 EditTexts 中的坐标。
读取标签时出现问题。它只会显示(在默认 Android 标签应用程序上)以下消息:
vnd.android.nfc//ext/nfclab.com:geoService
我想要的是让标签应用程序识别这些是 Google 地图坐标并使用坐标启动地图。 externalType 字符串应该包含什么?
我需要在清单中使用 Intent 过滤器吗?
Tags 应用程序显示无法识别的 NFC 论坛外部类型 nfclab.com:geoService
(请注意,外部类型名称只能使用小写字母,请参阅 my answer here),因为您存储了该记录类型在你的标签上。该类型是由 nfclab.com 创建的自定义类型,绝不是标准化的。因此,标签应用程序不知道应该如何处理该记录。
在 NFC 标签上存储地理坐标的标准方法是 geo: URI 方案。因此,您通常会创建一个包含您的地理位置的 URI 记录:URI:
String geoUri = "geo:" + latitude + "," + longitude;
NdefRecord geoUriRecord = NdefRecord.createUri(geoUri);
Tags 应用程序将处理此类 URI,并允许您在注册了 geo: 方案(例如 Google 地图)的任何应用程序中打开 geo: URI。
我正在尝试通过以下方式编写带有坐标(纬度和经度)的 NFC 标签:
这是里面 onCreate()
:
btnWriteMap.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String latitude = lat.getText().toString();
String longitude = lon.getText().toString();
urlAddress = "geo:"+latitude+","+longitude;
TextView messageText = (TextView)findViewById(R.id.txtMessage);
messageText.setText("Touch NFC Tag to share GEO location\n"+
"Latitude: "+latitude+"\nLongitude: "+longitude);
}
});
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
mFilters = new IntentFilter[] {
ndef,
};
mTechLists = new String[][] { new String[] { Ndef.class.getName() },
new String[] { NdefFormatable.class.getName() }};
onNewIntent()
方法:
@Override
public void onNewIntent(Intent intent) {
Log.i("Foreground dispatch", "Discovered tag with intent: " + intent);
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String externalType = "nfclab.com:geoService";
NdefRecord extRecord = new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, externalType.getBytes(), new byte[0], urlAddress.getBytes());
NdefMessage newMessage = new NdefMessage(new NdefRecord[] { extRecord});
writeNdefMessageToTag(newMessage, tag);
}
代码是书中的示例。我已经测试过,标签确实是用 geo:lat,lon 写的,当然还有我在 EditTexts 中的坐标。
读取标签时出现问题。它只会显示(在默认 Android 标签应用程序上)以下消息:
vnd.android.nfc//ext/nfclab.com:geoService
我想要的是让标签应用程序识别这些是 Google 地图坐标并使用坐标启动地图。 externalType 字符串应该包含什么? 我需要在清单中使用 Intent 过滤器吗?
Tags 应用程序显示无法识别的 NFC 论坛外部类型 nfclab.com:geoService
(请注意,外部类型名称只能使用小写字母,请参阅 my answer here),因为您存储了该记录类型在你的标签上。该类型是由 nfclab.com 创建的自定义类型,绝不是标准化的。因此,标签应用程序不知道应该如何处理该记录。
在 NFC 标签上存储地理坐标的标准方法是 geo: URI 方案。因此,您通常会创建一个包含您的地理位置的 URI 记录:URI:
String geoUri = "geo:" + latitude + "," + longitude;
NdefRecord geoUriRecord = NdefRecord.createUri(geoUri);
Tags 应用程序将处理此类 URI,并允许您在注册了 geo: 方案(例如 Google 地图)的任何应用程序中打开 geo: URI。