2017-05-12 15 views
2

初めて、プロジェクトWinPhoneとAndroid用のXamarin.FormsプラットフォームをクロスするNFCを実装したいと思います。NFC with Xamarin.Forms何も起こらない

私はAndroidでテストしていましたが、実際には何も起こりません。 ツールとして、Android用プログラムの再タグでテストしたVisa Pay Waveカードを使用しました。スキャンに成功しました。 私はこのGitHubのソリューションを使用しましたlink 私はエラーが0でしたし、アプリケーションも "動作"していましたが、私のビザカードを後ろの私の電話に追加すると何も得られません。

私の最初の質問はです:どのプロトコルがVisaカードを使用していますか? (TAG_DISCOVERED、TECH_DISCOVEREDまたはNDEF_DISCOVERED)。私はそれが "アイドル"状態の私のプログラムである理由だと思う。

私の2番目の質問はです:なぜ私はプログラムから何かイベントを得ることができないのですか? (スタートのためだけのUID番号を取得するには...)ここで

は私のAndroidManifest.xmlファイルです:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
android:installLocation="auto"> 
    <uses-sdk android:minSdkVersion="15" /> 
    <uses-permission android:name="android.permission.NFC" /> 
    <application android:label="NFCTest002.Android"></application> 
    <uses-feature 
    android:name="android.hardware.nfc" 
    android:required="true" /> 
<application> 
<activity 
    android:name="MainActivity" 
    android:label="@string/app_name" > 
    <intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="text/plain" /> 
    </intent-filter> 
    <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" /> 
    </activity> 
</application> 
</manifest> 

マイMainActivity.cs:

using Android.App; 
using Android.Content; 
using Android.Content.PM; 
using Android.Nfc; 
using Android.OS; 
using Poz1.NFCForms.Abstract; 
using Poz1.NFCForms.Droid; 
using System; 

namespace NFCTest002.Droid 
{ 
[Activity(Label = "NFCTest002", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 
[IntentFilter(new[] { NfcAdapter.ActionTechDiscovered })] 
[MetaData(NfcAdapter.ActionTechDiscovered, Resource = "@xml/nfc")] 
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{ 
    public NfcAdapter NFCdevice; 
    public NfcForms x; 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     global::Xamarin.Forms.Forms.Init(this, bundle); 

     NfcManager NfcManager = (NfcManager)Android.App.Application.Context.GetSystemService(Context.NfcService); 
     NFCdevice = NfcManager.DefaultAdapter; 

     Xamarin.Forms.DependencyService.Register<INfcForms, NfcForms>(); 
     x = Xamarin.Forms.DependencyService.Get<INfcForms>() as NfcForms; 

     LoadApplication(new NFCTest002.App()); 
    } 
    protected override void OnResume() 
    { 
     base.OnResume(); 
     if (NFCdevice != null) 
     { 
      var intent = new Intent(this, GetType()).AddFlags(ActivityFlags.SingleTop); 
      NFCdevice.EnableForegroundDispatch 
      (
       this, 
       PendingIntent.GetActivity(this, 0, intent, 0), 
       new[] { new IntentFilter(NfcAdapter.ActionTechDiscovered) }, 
       new String[][] {new string[] { 
         NFCTechs.Ndef, 
        }, 
        new string[] { 
         NFCTechs.MifareClassic, 
        }, 
       } 
      ); 
     } 
    } 

    protected override void OnPause() 
    { 
     base.OnPause(); 
     NFCdevice.DisableForegroundDispatch(this); 
    } 

    protected override void OnNewIntent(Intent intent) 
    { 
     base.OnNewIntent(intent); 
     x.OnNewIntent(this, intent); 
    } 
} 
} 

私はリソースフォルダに追加したとxmlフォルダにnfc.xmlファイルがある場合は、必要に応じて投稿します。

コンテンツページは、私が提供したリンクのGitHubと同じです。

+0

読み書きできる標準のNFCタグを使用してみましたか?これにより、Visaカードが使用する接続を絞り込むことができます。 –

+0

このウェブサイトもありますhttps://www.patrickvankleef.com/2017/01/08/xamarin-near-field-communication/ Androidプラットフォームの最近のNFCコードの例 –

+0

@AaronThompsonありがとうございます、私はAndroidを試してみますプラットフォーム、しかし私はxamarin.formsが必要です。 – Stefan0309

答えて

3

Visa payWaveカードは、EMV基準に基づいています。 RF通信プロトコルに関して、これらのカードはISO-DEP(ISO/IEC 14443-4)よりもISO/IEC 7816-4を使用しています。

Androidでは、適切なフィルタXMLファイルと組み合わせてTECH_DISCOVEREDインテントフィルタを使用して、これらのカードを選択できます。これらのカードのためにXMLファイルは次のように検討する必要があります:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 
    <tech-list> 
     <tech>android.nfc.tech.IsoDep</tech> 
    </tech-list> 
</resources> 

同様に、マニフェストベースのインテントフィルタのための上記の方法に、あなたはフォアグラウンド・ディスパッチベースのタグの検出を有効にするには、次の使用することができます

NFCdevice.EnableForegroundDispatch(
     this, 
     PendingIntent.GetActivity(this, 0, intent, 0), 
     new[] { new IntentFilter(NfcAdapter.ActionTechDiscovered) }, 
     new String[][] { 
      new string[] { 
       NFCTechs.IsoDep, 
      }, 
     } 
); 

NDEF_DISCOVEREDインテントフィルタは、NDEF構造化データを含まないため、EMVカードでは機能しません。

+1

これは正解とフラグが立てられます。私がopがカードをシミュレートしたいと思って以来、私の答えは誤解を招いていました。 – originx

関連する問題