在点击另一个支持 NFC 的设备后未调用 onNewIntent
onNewIntent not called after tapping to another NFC enabled device
我正在使用 Xamarin 使用 C# 编写代码。我尝试通过 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>
是的,您遗漏了一些东西:您注册了前台调度以侦听 "text/plain" 类型的 NDEF 消息,这意味着您需要文本记录或 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));
为了匹配 intent 过滤器,您需要改为推送文本记录:
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));
我正在使用 Xamarin 使用 C# 编写代码。我尝试通过 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>
是的,您遗漏了一些东西:您注册了前台调度以侦听 "text/plain" 类型的 NDEF 消息,这意味着您需要文本记录或 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));
为了匹配 intent 过滤器,您需要改为推送文本记录:
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));