2016-07-16 34 views
1

Ich bin in C# mit Xamarin codiert. Ich habe versucht, Daten über NFC von einem Gerät zum anderen zu teilen.onNewIntent wird nicht aufgerufen, nachdem auf ein anderes NFC-fähiges Gerät geklopft wurde

Browser öffnen -> Optionen -> Weiterleiten -> App4 zu MainActivity

Meine beiden Geräte sind die gleiche Anwendung laufen und ich mein Gerät an das andere Gerät tippen, aber nichts passiert.

Ich denke, es kann nicht erreichen onNewIntent().

Habe ich etwas verpasst? Ich war verwirrt und suche eine Woche lang weiter.

Hier ist mein Code:

using System; 
using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 
using Android.Nfc; 
using System.Collections.Generic; 
using System.Text; 
using Xamarin.Forms; 

namespace App4 
{ 
    [Activity(Label = "App4", MainLauncher = false, Icon = "@drawable/icon",LaunchMode = Android.Content.PM.LaunchMode.SingleTop)] 
    [IntentFilter(new[] { Intent.ActionSend , NfcAdapter.ActionNdefDiscovered }, Categories = new[] { 
    Intent.CategoryDefault, 
    Intent.CategoryBrowsable 
    }, DataMimeType = "text/plain")] 
    public class MainActivity : Activity 
    { 
     string share; 
     PendingIntent mPendingIntent; 
     IntentFilter ndefDetected; 
     IntentFilter[] intentF; 
     TextView testTV; 
     protected override void OnCreate(Bundle bundle) 
     { 

      base.OnCreate(bundle); 
      SetContentView(Resource.Layout.Main); 

      Intent Myintent = new Intent(this, GetType()); 
      Myintent.SetFlags(ActivityFlags.SingleTop); 
      mPendingIntent = PendingIntent.GetActivity(this, 0, Myintent, 0); 
      ndefDetected = new IntentFilter(NfcAdapter.ActionNdefDiscovered); 
      try 
      { 
       ndefDetected.AddDataType("text/plain"); 
       ndefDetected.AddCategory(Intent.CategoryDefault); 
      } 
      catch { }; 

      intentF = new IntentFilter[] { ndefDetected }; 
      NfcAdapter NA = NfcAdapter.GetDefaultAdapter(this); 

      if (NA!=null && NA.IsEnabled) 
      { 
       Toast.MakeText(this, "Nfc Found", ToastLength.Long).Show(); 
      }else 
      { 
       Toast.MakeText(this, "Nfc Not Found", ToastLength.Long).Show(); 
      } 
      testTV = FindViewById<TextView>(Resource.Id.text_view); 
      share = Intent.GetStringExtra(Intent.ExtraText); 
      testTV.Text = share; 
    } 

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

      NfcManager manager = (NfcManager)GetSystemService(NfcService); 
      NfcAdapter adapter = manager.DefaultAdapter; 
      adapter.DisableForegroundNdefPush(this); 
      adapter.DisableForegroundDispatch(this); 
     } 

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


      var result2 = new byte[NdefRecord.RtdText.Count]; 
      NdefRecord.RtdUri.CopyTo(result2, 0); 

      NfcManager manager = (NfcManager)GetSystemService(NfcService); 
      NdefRecord record = new NdefRecord(NdefRecord.TnfAbsoluteUri,new byte[0], new byte[0], System.Text.Encoding.Default.GetBytes(share)); 
      manager.DefaultAdapter.EnableForegroundNdefPush(this, new NdefMessage(record)); 
      manager.DefaultAdapter.EnableForegroundDispatch(this, mPendingIntent, intentF, null); 
     } 

     protected override void OnNewIntent(Intent intent) 
     { 

      base.OnNewIntent(intent); 
      testTV.Text = "onNewIntent";   
     } 
    } 
} 

und hier ist mein AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="App4.App4" android:versionCode="1" android:versionName="1.0" android:installLocation="auto"> 
    <uses-sdk android:minSdkVersion="10" /> 
    <uses-permission android:name="android.permission.NFC"></uses-permission> 
    <application android:label="App4"></application> 
</manifest> 

Antwort

0

Ja, Sie sind etwas fehlt: Sie registriert den Vordergrund Versand für NDEF Nachrichten von der hören Geben Sie "text/plain" ein, was bedeutet, dass Sie entweder einen Text-Datensatz oder einen Datensatz mit dem MIME-Typ text/plain erwarten.

ndefDetected = new IntentFilter(NfcAdapter.ActionNdefDiscovered); 
ndefDetected.AddDataType("text/plain"); 
ndefDetected.AddCategory(Intent.CategoryDefault); 
intentF = new IntentFilter[] { ndefDetected }; 
manager.DefaultAdapter.EnableForegroundDispatch(this, mPendingIntent, intentF, null); 

Ihre App sendet jedoch einen absoluten URI-Datensatz mit einem ungültigen (leeren!) Typnamen.

NdefRecord record = new NdefRecord(NdefRecord.TnfAbsoluteUri,new byte[0], new byte[0], System.Text.Encoding.Default.GetBytes(share)); 
manager.DefaultAdapter.EnableForegroundNdefPush(this, new NdefMessage(record)); 

Um die Intent-Filter anzupassen, müssen Sie stattdessen einen Text Datensatz drücken:

byte[] text = System.Text.Encoding.UTF8.GetBytes(share); 
byte[] language = System.Text.Encoding.ASCII.GetBytes("en"); 
byte[] payload = new byte[1 + language.Count + text.Count]; 
payload[0] = (byte)language.Count; 
System.Array.Copy(language, 0, payload, 1, language.Count); 
System.Array.Copy(text, 0, payload, 1 + language.Count, text.Count); 
NdefRecord record = new NdefRecord(NdefRecord.TnfWellKnown, new List<byte>(NdefRecord.RtdText).ToArray(), new byte[0], payload); 
manager.DefaultAdapter.EnableForegroundNdefPush(this, new NdefMessage(record)); 
+0

Ich werde es später versuchen. Vielen Dank für Ihre Hilfe! – wuken

+0

Es funktioniert !!!!! Vielen Dank! Du bist mein Retter! – wuken

+0

BTW, wie NedfRecord.RtdText wie Ihren Code zu verwenden? Ich verwende jetzt NdefRecord.CreateTextRecord ("en", share). Weil ein Fehler vorliegt: "Konnte nicht von 'System.Collections.Generic.IList ' in'byte [] '" konvertieren . Ich versuche, es in ein neues Byte []: result2 zu kopieren. Wird es funktionieren? – wuken