NFC读取标签以使用坐标启动Google地图

时间:2015-04-24 15:15:37

标签: android google-maps geolocation nfc ndef

我正在尝试以下列方式编写带坐标(纬度和经度)的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 Tags应用程序中)以下消息:

  

vnd.android.nfc // EXT / nfclab.com:geoService

我想要的是标签应用程序识别这些是Google地图坐标并使用坐标启动地图。 externalType字符串应包含什么? 我需要在清单中使用Intent过滤器吗?

1 个答案:

答案 0 :(得分:1)

“标签”应用会显示无法识别的NFC论坛外部类型public IEnumerable<string> GetDatasourceValue(Item targetItem) { List<string> uniqueDatasourceValues = new List<string>(); Sitecore.Layouts.RenderingReference[] renderings = GetListOfSublayouts(targetItem.ID.ToString(), targetItem); foreach (var rendering in renderings) { if (!uniqueDatasourceValues.Contains(rendering.Settings.DataSource)) uniqueDatasourceValues.Add(rendering.Settings.DataSource); } return uniqueDatasourceValues; } } (请注意,只有小写字母应用于外部类型名称,请参阅my answer here),因为您将该记录类型存储在标签。该类型是由nfclab.com创建的自定义类型,绝不是标准化的。因此,Tags应用程序不知道它应该对该记录做什么。

在NFC标签上存储地理坐标的标准方法是geo:URI方案。因此,您通常会创建一个包含geo:URI:

的URI记录
nfclab.com:geoService

Tags应用程序将处理此类URI,并允许您在为geo:scheme(例如Google Maps)注册的任何应用程序中打开geo:URI。