Xamarin Android如何在启动应用程序时从意图中读取NFC标签信息?

时间:2018-11-19 07:07:01

标签: android xamarin android-intent nfc

早上好

我在xamarin跨平台应用程序开发中遇到问题。 对于Android应用程序,我需要在扫描标签后打开该应用程序,并且需要阅读此标签中写入的所有信息。

我已经实现了 MainActivity.cs 的这种实现,并且在启动应用程序时可以很好地工作,但是在首次启动应用程序时,我无法读取标签信息。

[Activity(Label = "Kibelis", Icon = "@drawable/icon", Theme = "@style/MainTheme", LaunchMode = LaunchMode.SingleTop, MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{

    private NfcAdapter _nfcAdapter;


    public object NFCUtil { get; private set; }


    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
        CachedImageRenderer.Init(true);
        base.OnCreate(savedInstanceState);
        CrossCurrentActivity.Current.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);


        _nfcAdapter = NfcAdapter.GetDefaultAdapter(this);
        System.Diagnostics.Debug.WriteLine("CREATE");


        // is attached.
        LoadApplication(new App());
    }

    protected override void OnResume()
    {
        base.OnResume();

        if (_nfcAdapter == null)
        {
            System.Diagnostics.Debug.WriteLine("NFC UNAVIABLE");
        }
        else
        {
            var tagDetected = new IntentFilter(NfcAdapter.ActionTagDiscovered);
            var filters = new[] { tagDetected };

            var intent = new Intent(this, this.GetType()).AddFlags(ActivityFlags.SingleTop);

            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0);

            _nfcAdapter.EnableForegroundDispatch(this, pendingIntent, filters, null);

            System.Diagnostics.Debug.WriteLine("FOREGRAUND DISPATCH");
        }
    }


    protected override void OnPause()
    {
        base.OnPause();
    }

    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);

        System.Diagnostics.Debug.WriteLine("NEW INTENT");

        //For start reading
        if (intent.Action == NfcAdapter.ActionTagDiscovered || intent.Action == NfcAdapter.ActionNdefDiscovered || intent.Action == NfcAdapter.ActionAdapterStateChanged
            || intent.Action == NfcAdapter.ActionTransactionDetected || intent.Action == NfcAdapter.ExtraNdefMessages || intent.Action == NfcAdapter.ExtraNdefMessages)
        {
            System.Diagnostics.Debug.WriteLine("DISCOVERD");
            var tag = intent.GetParcelableExtra(NfcAdapter.ExtraTag) as Tag;
            if (tag != null)
            {
                System.Diagnostics.Debug.WriteLine("TAG");
                // First get all the NdefMessage
                var rawMessages = intent.GetParcelableArrayExtra(NfcAdapter.ExtraNdefMessages);
                if (rawMessages != null)
                {
                    var msg = (NdefMessage)rawMessages[0];
                    System.Diagnostics.Debug.WriteLine("MESSAGE: "+msg);
                    // Get NdefRecord which contains the actual data
                    var record = msg.GetRecords()[0];
                    if (record != null)
                    {
                        if (record.Tnf == NdefRecord.TnfWellKnown)
                        {
                            // Get the transfered data
                            var data = Encoding.ASCII.GetString(record.GetPayload());
                            System.Diagnostics.Debug.WriteLine("RECORD: "+data);
                        }
                    }
                }
            }
        }
    }

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
    {
        PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

同时,我已经实现了 AndroidManifest.xml 的实现,并且我认为我错过了一些东西(特别是 IntentFilter 或其他东西)启动应用程序后一切正常...

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.kibelis.Kibelis">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.BIND_NFC_SERVICE" />
    <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.NFC_TRANSACTION_EVENT" />
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    <application android:label="Kibelis.Android" android:icon="@drawable/icona">
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
        </provider>
    </application>
</manifest>

我的标签类型为 ISO 14443-3A NXP MIFARE Ultralight ,其中我为要在应用程序中读取的信息以及打开请求应用程序的应用程序字段写了一个字符串。 / p>

你能帮我吗?对不起,我的英语不好,但是我希望我已经告诉您所有必要的信息。

谢谢!

0 个答案:

没有答案