2016-11-29 16 views
2

NFCタグを読み取っているxamarinアプリがあります。アプリが開いているときは正常に動作しますが、アプリがバックグラウンドであるか閉じている場合は、タグからデータを読み取ることができません。アプリの外部からNFCタグを読み取るとデータが返されない

私のインテントフィルタ:

[IntentFilter(
    new[] {"android.nfc.action.NDEF_DISCOVERED", "android.intent.action.VIEW", "android.intent.action.MAIN"}, 
    Categories = 
     new[] 
     { 
      "android.intent.category.DEFAULT", "android.intent.category.BROWSABLE", 
      "android.intent.category.LAUNCHER" 
     }, 
    DataScheme = "http", DataHost = "app.myDomain.com")] 

アプリ外からスキャンしたときに、私のOnNewIntentで、私のintent.Dataは常にnullとして戻って来ています。私の問題がどこにあるのか考えていますか?

OnResume:

nfcAdapter.EnableForegroundDispatch(this, nfcPendingIntent, nfcIntentFiltersArray, null); 

OnNewIntent:

protected override void OnNewIntent(Intent intent) 
{    
if (AndroidNFCHelper.isNfcIntent(intent)) 
{ 
    DisplayMessage("And it is an NFC intent"); 
} 

var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag; 

if (tag == null) 
{ 
    Debug.WriteLine("tag is null"); 
    return; 
} 

//rest of OnNewIntent code... 
} 

ので興味深い、アプリの外でスキャンしたときに、AndroidNFCHelper.isNfcIntentが戻っとして偽きます。同じNFCタグがアプリでスキャンされると、それは真実に戻ります。続けて、タグはnullとして終了し、return文にヒットします。アプリでスキャンされると、タグはnullではなく、引き続きオンになります。

PrepareForegroundNFCHandling - )(OnCreate関数で呼び出されます:

private void PrepareForegroundNFCHandling() 
{ 

var tagDetected = new IntentFilter(NfcAdapter.ActionTagDiscovered); 
var ndefDetected = new IntentFilter(NfcAdapter.ActionNdefDiscovered); 

nfcIntentFiltersArray = new[] { ndefDetected, tagDetected}; 

var intent = new Intent(this, GetType()).AddFlags(ActivityFlags.SingleTop | ActivityFlags.BroughtToFront); 
nfcPendingIntent = PendingIntent.GetActivity(this, 0, intent, 0); 

nfcAdapter = NfcAdapter.GetDefaultAdapter(Application.ApplicationContext);    
} 
+0

どのデータ(NDEFメッセージ)をタグに保存しましたか?あなたのアプリが閉じている間(またはバックグラウンドで)タグをタップすると、アクティビティが開かれますか? OnCreate()、OnStart()、OnResume()にはどのようなコードがありますか?あなたはOnNewIntent()で何を見ますか? –

+0

URLはhttp://app.myDomain.com/p/9のようなものです。アプリを閉じたままタップするとアプリが開かれますが、タグオブジェクトが最終的にnullに戻るため、何も起こりません。投稿を他のコードで更新します – Arthurdent510

+0

コードのどこからでもOnNewIntent()を呼び出しますか?あなたのタグにはURL付きのNDEFレコードが1つだけ含まれていて、あなたのアプリパッケージ名にはAndroidアプリケーションレコードが含まれていませんか? –

答えて

1

タグのNDEFメッセージで最初レコードのタイプについてNDEF_DISCOVERED目的のみフィルター。

あなたのアプリが意図アクションMAIN(AndroidNFCHelper.isNfcIntent(intent)はfalse)で開始され、目的のエキストラ(intent.GetParcelableExtra(NfcAdapter.ExtraTag)がnull)のいずれかのTagオブジェクトなしで、あなたのNDEFメッセージは、おそらくURL以外のAndroidアプリケーションのレコードが含まれています。と

NDEFメッセージ(「最初のレコード」と読みます)がインテントフィルタと一致しなくてもアプリが起動される理由は、ランチャーアイコンがクリックされたようにアプリを起動することになります。アクションMAIN、カテゴリLAUNCHER)。一致するNFCインテントフィルタがない場合。

だからあなたのNDEFメッセージは、おそらくこのようなものになります。このような

 
+----------------------------------------------+ 
| SOME RECORD         | 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 

それとも単に:最初のケースで

 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 

を、あなたの記録を一致させるためにインテントフィルタを変更する必要があります"いくつかの記録"。後者の場合は、あなたが外部のタイプ「アンドロイド:COM:PKGを」:合わせてインテントフィルタを変更する必要があります

DataScheme = "vnd.android.nfc", DataHost = "ext", DataPathPrefix = "/android.com:pkg" 

または、より良い、あなたはNDEFメッセージの先頭にあなたのURLを移動し、 NDEFメッセージの最後までのAAR:

 
+----------------------------------------------+ 
| WKT: URI | http://app.mydomain.com/p/9  | 
+----------------------------------------------+ 
| EXTERNAL: android.com:pkg | com.mydomain.app | 
+----------------------------------------------+ 
関連する問題