在Android中扫描NFC标签时打开浏览器

Parth doshi

我正在尝试开发一个用例,以便当任何具有启用NFC功能的智能手机的用户点击NFC标签时,浏览器应使用标签中包含的URL打开。

目前,我正在使用Mifare Classic 1K标签,其中包含我在NFC标签中编写的URL http://www.google.com

现在,当我点击/扫描我的Google Nexus 7(2012)版本的标签时,可以检测到该标签,但浏览器未显示。同样在包括Samsung S3,S4在内的其他设备上,也根本没有检测到标签。为什么呢?

这是我编写和读取标签的代码,

   public class MainActivity extends Activity {

        @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);

              //check for nfc
          adapter = NfcAdapter.getDefaultAdapter(this);
          PendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
          IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
         tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
         writeTagFilters = new IntentFilter[] { tagDetected }; 

                 //write tag
                 write("http://www.google.com",tag);

   }


 private void write(String text, Tag tag) throws IOException, FormatException {

    NdefRecord[] records = { createRecord(text) };
    NdefMessage  message = new NdefMessage(records);
    // Get an instance of Ndef for the tag.
    Log.i("App","Tag:" +tag);
    Ndef ndef = Ndef.get(tag);
    // Enable I/O
    ndef.connect();
    // Write the message
    ndef.writeNdefMessage(message);
    // Close the connection
    ndef.close();
}



   private NdefRecord createRecord(String text) throws UnsupportedEncodingException {
    String lang       = "en";
    byte[] textBytes  = text.getBytes();
    byte[] langBytes  = lang.getBytes("US-ASCII");
    int    langLength = langBytes.length;
    int    textLength = textBytes.length;
    byte[] payload    = new byte[1 + langLength + textLength];

    // set status byte (see NDEF spec for actual bits)
    payload[0] = (byte) langLength;

    // copy langbytes and textbytes into payload
    System.arraycopy(langBytes, 0, payload, 1,              langLength);
    System.arraycopy(textBytes, 0, payload, 1 + langLength, textLength);

    NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,  NdefRecord.RTD_TEXT,  new byte[0], payload);

    return recordNFC;
}


@Override
protected void onNewIntent(Intent intent){
    if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){
        mytag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        new NdefReaderTask().execute(mytag);
        Toast.makeText(this, this.getString(R.string.ok_detection) + mytag.toString(), Toast.LENGTH_LONG ).show();
    }
}


    private class NdefReaderTask extends AsyncTask<Tag, Void, String> {

    @Override
    protected String doInBackground(Tag... params) {
        Tag tag = params[0];

        Ndef ndef = Ndef.get(tag);
        if (ndef == null) {
            // NDEF is not supported by this Tag. 
            return null;
        }

        NdefMessage ndefMessage = ndef.getCachedNdefMessage();

        NdefRecord[] records = ndefMessage.getRecords();
        for (NdefRecord ndefRecord : records) {
            if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
                try {
                    return readText(ndefRecord);
                } catch (UnsupportedEncodingException e) {
                    Log.e("App", "Unsupported Encoding", e);
                }
            }
        }

        return null;
    }

    private String readText(NdefRecord record) throws UnsupportedEncodingException {
        /*
         * See NFC forum specification for "Text Record Type Definition" at 3.2.1 
         * 
         * http://www.nfc-forum.org/specs/
         * 
         * bit_7 defines encoding
         * bit_6 reserved for future use, must be 0
         * bit_5..0 length of IANA language code
         */

        byte[] payload = record.getPayload();

        // Get the Text Encoding
        String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";

        // Get the Language Code
        int languageCodeLength = payload[0] & 0063;

        // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");
        // e.g. "en"

        // Get the Text
        return new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
    }

    @Override
    protected void onPostExecute(String result) {
        if (result != null) {

            Toast.makeText(getApplicationContext(), "Read content: " +result,Toast.LENGTH_LONG).show(); 
            webView = (WebView) findViewById(R.id.webView1);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.loadUrl(result);
        }
    }
}

Manifest.xml

      <uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name="com.framentos.hellonfc.MainActivity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

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

</application>
<uses-permission android:name="android.permission.NFC" />

另外,我是否需要在设备中始终存在一个应用程序才能调用浏览器。由于NFC是一项服务,因此并非每个NFC设备都应在标签点击时打开浏览器。

迈克尔·罗兰

这是因为您要在标签中写入带有文本“ http://www.google.com的文本记录NFC设备通常不知道如何解释标签上的文本(尽管它们可以只显示该文本-某些设备可以做到这一点)。

您要做的是基于NFC论坛的URI记录类型定义创建一条记录createRecord方法可能如下所示:

private NdefRecord createRecord(String uri) throws UnsupportedEncodingException {
    byte[] uriBytes = uri.getBytes("UTF-8");
    byte[] payload = new byte[1 + uriBytes.length];

    // set prefix byte (see URI RTD for possibile values, we just use 0 indicating no prefix for now)
    payload[0] = 0;

    // copy uriBytes into payload
    System.arraycopy(uriBytes, 0, payload, 1, uriBytes.length);

    return new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
                          NdefRecord.RTD_URI,
                          null,
                          payload);
}

或者,您可以只使用Android的内置方法:

record = NdefRecord.createUri("http://www.google.com");

关于在其他设备上的检测:应该可以在S3上使用MIFARE Classic标签。S4(以及任何其他基于Broadcom NFC芯片组的设备)根本不支持MIFARE Classic,因此您需要切换到另一种标签技术来支持这些设备。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有URL打开浏览器的Android NFC标签,而不是我的应用

来自分类Dev

通过意图在Android浏览器中打开和关闭浏览器标签?

来自分类Dev

通过意图在Android浏览器中打开和关闭浏览器标签?

来自分类Dev

按下“ Ctrl”键时,jQuery标签插件未在新的浏览器标签中打开

来自分类Dev

在AppleScript中打开多个Google Chrome浏览器窗口时,如何查找特定标签

来自分类Dev

在Google Chrome浏览器中打开新标签页时不显示缩略图

来自分类Dev

有没有办法在Android中自动打开浏览器标签?

来自分类Dev

在浏览器的新标签页中打开PDF

来自分类Dev

Android:如何在扫描NFC标签时禁止应用重新打开?

来自分类Dev

Android:如何在扫描NFC标签时禁止应用重新打开?

来自分类Dev

在浏览器中单击URL时如何打开android应用程序

来自分类Dev

单击android Webview中的链接时启动打开浏览器

来自分类Dev

在浏览器中单击URL时如何打开android应用程序

来自分类Dev

如何在Android中单击通知时打开浏览器?

来自分类Dev

在Testcafe中开发测试时保持浏览器打开

来自分类Dev

在浏览器中打开URL时OSI层的作用?

来自分类Dev

Android:通过操作打开和恢复(即扫描NFC标签)

来自分类Dev

如何在Android浏览器中打开pdf文件?

来自分类Dev

通过浏览器中的URL打开Android应用

来自分类Dev

android-使ListView项在浏览器中打开URL?

来自分类Dev

如何在android浏览器中打开pdf文件?

来自分类Dev

通过浏览器中的URL打开Android应用

来自分类Dev

在手机浏览器中打开时,如何通过html按钮打开android应用程序

来自分类Dev

打开时扫描并接收所有nfc标签,但关闭时不扫描并接收

来自分类Dev

窗口浏览器打开时冻结

来自分类Dev

打开浏览器时屏幕混乱

来自分类Dev

提交JSP表单时如何打开同一浏览器的新标签页

来自分类Dev

在Firefox / Chrome上打开新标签页或窗口时,如何获得新的浏览器会话?

来自分类Dev

当重新打开浏览器时,Chrome阻止更新所有标签页吗?

Related 相关文章

  1. 1

    带有URL打开浏览器的Android NFC标签,而不是我的应用

  2. 2

    通过意图在Android浏览器中打开和关闭浏览器标签?

  3. 3

    通过意图在Android浏览器中打开和关闭浏览器标签?

  4. 4

    按下“ Ctrl”键时,jQuery标签插件未在新的浏览器标签中打开

  5. 5

    在AppleScript中打开多个Google Chrome浏览器窗口时,如何查找特定标签

  6. 6

    在Google Chrome浏览器中打开新标签页时不显示缩略图

  7. 7

    有没有办法在Android中自动打开浏览器标签?

  8. 8

    在浏览器的新标签页中打开PDF

  9. 9

    Android:如何在扫描NFC标签时禁止应用重新打开?

  10. 10

    Android:如何在扫描NFC标签时禁止应用重新打开?

  11. 11

    在浏览器中单击URL时如何打开android应用程序

  12. 12

    单击android Webview中的链接时启动打开浏览器

  13. 13

    在浏览器中单击URL时如何打开android应用程序

  14. 14

    如何在Android中单击通知时打开浏览器?

  15. 15

    在Testcafe中开发测试时保持浏览器打开

  16. 16

    在浏览器中打开URL时OSI层的作用?

  17. 17

    Android:通过操作打开和恢复(即扫描NFC标签)

  18. 18

    如何在Android浏览器中打开pdf文件?

  19. 19

    通过浏览器中的URL打开Android应用

  20. 20

    android-使ListView项在浏览器中打开URL?

  21. 21

    如何在android浏览器中打开pdf文件?

  22. 22

    通过浏览器中的URL打开Android应用

  23. 23

    在手机浏览器中打开时,如何通过html按钮打开android应用程序

  24. 24

    打开时扫描并接收所有nfc标签,但关闭时不扫描并接收

  25. 25

    窗口浏览器打开时冻结

  26. 26

    打开浏览器时屏幕混乱

  27. 27

    提交JSP表单时如何打开同一浏览器的新标签页

  28. 28

    在Firefox / Chrome上打开新标签页或窗口时,如何获得新的浏览器会话?

  29. 29

    当重新打开浏览器时,Chrome阻止更新所有标签页吗?

热门标签

归档