簡體   English   中英

getParcelableExtra返回空NFC標簽

[英]getParcelableExtra return null NFC Tag

我知道這是StackOverflow上的一個多余問題,但是我嘗試了很多發現的答案,但都沒有用。 我想在按下按鈕時發送消息,但是在Fragment中調用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*/
}

由於存在幾種可能的情況,因此尚未描述您希望應用程序如何處理NFC卡。

  1. 當應用程序未啟動且您刷NFC卡時,應用程序將啟動。 如果這是您想要的,您將在活動的onCreate()方法中收到適當的意圖。

根據您提供的信息,您可能還應該偵聽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" />

另外,請參閱以獲取示例技術列表(即您的應用程序應處理哪種類型的NFC技術)。

  1. 當您掃描NFC標簽時,您的應用程序已經在前台運行。 在這種情況下,您應該在活動中覆蓋onNewIntent()方法,以便接收正確的意圖,然后在此處處理您的操作。

_

@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());
        ...
    }

另外,請注意,您可以使用前台調度系統來直接從您的活動代碼注冊/注銷監聽NFC意圖,而不是在AndroidManifest.xml中設置配置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM