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。