getParcelableExtra返回null NFC标记

时间:2014-12-13 21:39:08

标签: java android nfc

我知道这是StackOverflow上的一个多余问题,但我尝试了很多我找到的答案,但没有一个能够奏效。我想在按下按钮时发送消息,但是当我在片段中调用我的nfc写入功能时,我将NDEF_Discovered放在AndroidManifest.xml中。 intent.getParcelableExtra( NfcAdapter.EXTRA_TAG )返回null,我找不到原因。这是我的代码:

的AndroidManifest.xml

<activity
    android:name="com.iiil.cccdm.ebar.gui.activity.MainActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

    </intent-filter>
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <action android:name="android.nfc.action.TAG_DISCOVERED"/>

        <category android:name="android.intent.category.DEFAULT"/>

        <data android:mimeType="text/*"/>
    </intent-filter>

</activity>

ConsommerFragment(在onCreateView()中)

View rootView = inflater.inflate( R.layout.consommer_fragment, container, false );
ImageButton btn = (ImageButton) rootView.findViewById( R.id.drinkButton );
btn.setOnClickListener( new View.OnClickListener() {
    @Override
    public void onClick( View v ) {
        Toast.makeText( getActivity(), "in listener", Toast.LENGTH_LONG );
                // Recupération de l'id
                UserData userData = new UserData( getActivity() );
                Integer idUser = userData.getId();

                Intent intent = this.getActivity().getIntent();
                if ( intent == null ) {
                    Log.e( this.getClass().getSimpleName(), "INTENT NULL" );
                }

                NFCTransfer nfcTransfer = NFCTransfer.getInstance( getActivity() );
                // TODO : Test avec Yohan et améliorer.
                nfcTransfer.writeToDevice( idUser.toString(), intent );
    }
} );

NFCTransfer

public void writeToDevice( String msgToWrite, Intent intent ) {
    Tag tag = intent.getParcelableExtra( NfcAdapter.EXTRA_TAG );
    if ( tag == null ) {
        Log.e(this.getClass().getSimpleName(), "tag == null");
        Toast.makeText( context, "No Tag. Waiting...", Toast.LENGTH_LONG )
             .show();
        return;
    }

    Ndef ndefref = Ndef.get( tag );
    /* ... the rest of the function is useless since tag is null*/
}

1 个答案:

答案 0 :(得分:1)

您还没有描述您希望应用程序如何处理NFC卡,因为有几种可能的情况:

  1. 当应用程序未启动并刷您的NFC卡时,应用程序将启动。 如果这是您想要的,您将在活动的onCreate()方法中获得正确的意图。
  2. 根据您提供的信息,您可能还应该监听TECH_DISCOVERED意图并将技术列表元数据块添加到AndroidManifest.xml中,如下所示:

    <intent-filter>
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
    </intent-filter>
    <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/nfc_tech_filter" />
    

    另外,请参阅this获取示例技术列表(即您的应用应处理哪种类型的NFC技术)。

    1. 扫描NFC标签时,您的应用已在前台运行。 在这种情况下,您应该覆盖活动中的onNewIntent()方法,以便获得正确的意图,然后在那里处理您的操作。
    2. _

      @Override
      protected void onNewIntent(Intent intent) {
          Tag nfcTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
          if (nfcTag == null) {
              Log.w(LOG_TAG, "Unable to obtain NFC tag from intent!");
          } else {
              String tagId = bytesToHex(nfcTag.getId());
              ...
          }
      

      另请注意,您可以使用foreground dispatch system直接从活动代码注册/取消注册NFC意图,而不是在AndroidManifest.xml中设置配置