【问题标题】:NFC. Start a activity when scanning NDEF messageNFC。扫描 NDEF 消息时启动活动
【发布时间】:2013-10-01 20:20:24
【问题描述】:

当我的智能手机扫描 NDEF 消息时,我正尝试开始一项活动。这是我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidbeam"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="17" />

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

    <uses-feature android:name="android.hardware.nfc" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.androidbeam.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.androidbeam.SendTextActivity" >

        </activity>
        <activity android:name="com.example.androidbeam.ReceiverNDEFActivity" >
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data
                    android:host="ext"
                    android:pathPrefix="/com.example:externalType"
                    android:scheme="vnd.android.nfc" />
            </intent-filter>
        </activity>
    </application>

</manifest>

每当我扫描我的 NDEF 消息时,我的主要活动都会启动,但我希望我的 ReceiverNDEFActivity 启动。我不确定为什么会这样。

这是我的 NdefMessage:

@Override
public NdefMessage createNdefMessage(NfcEvent event) {
    byte[] payload= new String("Hello");
    String domain = "com.example";
    String type = "externalType"; 
    NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);

    NdefMessage msg = new NdefMessage(new NdefRecord[] { extRecord });
    return msg;
}

【问题讨论】:

    标签: android android-intent nfc intentfilter ndef


    【解决方案1】:

    诀窍在于 NFC 论坛外部类型名称不区分大小写。但是,Android 的意图过滤系统是 case-SENSITIVE。因此,您必须始终在您的意图过滤器中使用 ALL 小写 外部类型名称:

    <activity android:name="com.example.androidbeam.ReceiverNDEFActivity" >
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
            <data
                android:scheme="vnd.android.nfc"
                android:host="ext"
                android:pathPrefix="/com.example:externaltype" />
        </intent-filter>
    </activity>
    

    请注意,NdefRecord.createExternal(...) 方法会自动将所有类型名称转换为小写。

    【讨论】:

      【解决方案2】:

      我认为清单看起来还不错。也许你可以尝试添加

      android:exported="true"

      到应该接收 NFC 扫描意图的 Activity。

          <activity android:name="com.example.androidbeam.ReceiverNDEFActivity" >
              <intent-filter>
                  <action android:name="android.nfc.action.NDEF_DISCOVERED"
                  android:exported="true"
                  />
                  <category android:name="android.intent.category.DEFAULT" />
                  <data
                      android:host="ext"
                      android:pathPrefix="/com.example:externalType"
                      android:scheme="vnd.android.nfc" />
              </intent-filter>
          </activity>
      

      您是否使用 NFC 标签进行扫描?

      【讨论】:

      • android:exported="true" 不工作。我需要在 android 驱动和非 android 驱动的设备之间进行点对点数据交换。我应该使用哪些记录,TNF_MIME_MEDIA 还是 TNF_EXTERNAL_TYPE ?
      • android:exported="true" 属于 标签而不是 标签。但是,意图过滤器的存在会自动将其设置为 true,因此无需指定。由于您的清单看起来不错,我认为您的代码中还有其他问题......
      • 关于记录格式的问题,我建议您使用外部类型(尽管特别是 WP8 似乎只允许基于 URI 和特定于 MS 的记录自动启动应用程序)。另请注意,外部类型的类型名称只能是小写字母,因为外部类型不区分大小写(只有 Android 不以不区分大小写的方式实现其意图过滤器)。
      • 感谢 Michael,查看 NdefRecord.createExternal 源代码,您可以看到它将类型更改为小写。但在清单中并非全部为小写(“externalType”)。
      • 那么将清单中的 pathPrefix 更改为全部小写是否解决了您最初的问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2016-01-08
      相关资源
      最近更新 更多