攻到另一个我在C#与Xamarin编码支持NFC的装置

问题描述:

后onNewIntent不叫。我试图通过NFC从一台设备到另一台设备共享数据。攻到另一个我在C#与Xamarin编码支持NFC的装置

打开浏览器 - >选项 - >分享 - > APP4到MainActivity

我的两个设备都运行相同的应用程序,我在我的窃听设备到另一台设备,但没有任何反应。

我认为它不能达到onNewIntent()

我错过了什么吗?我一直困惑,并继续寻找一个星期。

这里是我的代码:

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";   
     } 
    } 
} 

这里是我的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> 

是的,你缺少的东西:您注册的前景调度监听的NDEF消息键入“text/plain”,这意味着您要么使用Text记录,要么使用MIME类型为text/plain的记录。

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

但是,您的应用会使用无效(空!)类型的名称推送绝对URI记录。

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)); 

为了匹配意图过滤器,你需要推文字记录来代替:

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

我会稍后再尝试。非常感谢您的帮助! – wuken

+0

It works !!!!!非常感谢你!你是我的救世主! – wuken

+0

顺便说一句,如何使用NedfRecord.RtdText像你的代码?我现在正在使用NdefRecord.CreateTextRecord(“en”,分享)。因为有一个错误:“无法从'System.Collections.Generic.IList''to'byte []'” 转换。我尝试将它复制到一个新的字节[]:result2。它会起作用吗? – wuken