Android NFC:只发送一个活动,接收一个活动
我希望我的ActivityNFCSender通过NFC向我的ActivityNFCrecever发送一个整数。下面的代码可以工作。但有一个问题:当建立连接时,两个活动都会显示发送提示!但是我只希望第一个能够发送(一个整数)并显示提示。怎么做 活动NFCSender:Android NFC:只发送一个活动,接收一个活动,android,nfc,nfc-p2p,android-beam,Android,Nfc,Nfc P2p,Android Beam,我希望我的ActivityNFCSender通过NFC向我的ActivityNFCrecever发送一个整数。下面的代码可以工作。但有一个问题:当建立连接时,两个活动都会显示发送提示!但是我只希望第一个能够发送(一个整数)并显示提示。怎么做 活动NFCSender: public class ActivityNFCSender extends ActivityBase { public static final String EXTRA_RES_ID = "res_id"; private
public class ActivityNFCSender extends ActivityBase {
public static final String EXTRA_RES_ID = "res_id";
private NfcAdapter mNfcAdapter;
private int mReservServerId;
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_nfc);
super.onCreate(savedInstanceState);
mReservServerId = getIntent().getIntExtra(EXTRA_RES_ID, 0);
}
public void onResume(){
super.onResume();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if(mNfcAdapter == null){
messageDialogQuit(R.string.error_no_nfc);
}
else if(!mNfcAdapter.isEnabled()){
new AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.error_nfc_off)
.setPositiveButton(R.string.turn_on, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
startActivity(settingsIntent);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
finish();
}
})
.create().show();
}
else{
//Set sending
mNfcAdapter.enableForegroundNdefPush(ActivityNFCSender.this, getIntAsNdef(mReservServerId));
}
}
public void onPause(){
if(mNfcAdapter != null && mNfcAdapter.isEnabled()){
mNfcAdapter.disableForegroundNdefPush(this);
}
super.onPause();
}
private NdefMessage getIntAsNdef(int pInt) {
byte[] textBytes = (pInt+"").getBytes(Charset.forName("UTF8"));
NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), new byte[] {}, textBytes);
return new NdefMessage(new NdefRecord[] {
textRecord
});
}
public class ActivityNFCReceiver extends ActivityBase {
private NfcAdapter mNfcAdapter;
private PendingIntent mNfcPendingIntent;
private IntentFilter[] mNdefExchangeFilters;
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_nfc);
super.onCreate(savedInstanceState);
((TextView) findViewById(R.id.nfcTVStatus)).setText(R.string.receiving);
}
public void onResume(){
super.onResume();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if(mNfcAdapter == null){
messageDialogQuit(R.string.error_no_nfc);
}
else if(!mNfcAdapter.isEnabled()){
new AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.error_nfc_off)
.setPositiveButton(R.string.turn_on, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
startActivity(settingsIntent);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
finish();
}
})
.create().show();
}
else{
mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// Intent filters for exchanging over p2p.
IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndefDetected.addDataType("text/plain");
}
catch (MalformedMimeTypeException e) {
e.printStackTrace();
}
mNdefExchangeFilters = new IntentFilter[] { ndefDetected };
//set receiving
mNfcAdapter.enableForegroundDispatch(ActivityNFCReceiver.this, mNfcPendingIntent, mNdefExchangeFilters, null);
}
}
public void onPause(){
if(mNfcAdapter != null && mNfcAdapter.isEnabled()){
mNfcAdapter.disableForegroundDispatch(ActivityNFCReceiver.this);
}
super.onPause();
}
@Override
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
NdefMessage[] msgs = getNdefMessages(intent);
if(msgs.length > 0){
try{
NdefRecord firstRecord = msgs[0].getRecords()[0];
byte[] payload = firstRecord.getPayload();
String str = new String(payload, Charset.forName("UTF8"));
int reservServerId = Integer.parseInt(str);
returnResult(reservServerId);
}
catch(Exception e){
messageDialog(R.string.error_during_NFC);
}
}
}
}
public void onCancelClicked(View pV){
finish();
}
private NdefMessage[] getNdefMessages(Intent intent) {
// Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
}
else {
// Unknown tag type
byte[] empty = new byte[] {};
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
NdefMessage msg = new NdefMessage(new NdefRecord[] { record });
msgs = new NdefMessage[] { msg };
}
}
else {
Log.d(TAG, "Unknown intent.");
finish();
}
return msgs;
}
private void returnResult(int pResServerId){
Intent result = new Intent();
result.putExtra(ActivityCompanySubMenu.EXTRA_RES_SERVER_ID, pResServerId);
setResult(RESULT_OK, result);
finish();
}
活动收信人:
public class ActivityNFCSender extends ActivityBase {
public static final String EXTRA_RES_ID = "res_id";
private NfcAdapter mNfcAdapter;
private int mReservServerId;
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_nfc);
super.onCreate(savedInstanceState);
mReservServerId = getIntent().getIntExtra(EXTRA_RES_ID, 0);
}
public void onResume(){
super.onResume();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if(mNfcAdapter == null){
messageDialogQuit(R.string.error_no_nfc);
}
else if(!mNfcAdapter.isEnabled()){
new AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.error_nfc_off)
.setPositiveButton(R.string.turn_on, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
startActivity(settingsIntent);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
finish();
}
})
.create().show();
}
else{
//Set sending
mNfcAdapter.enableForegroundNdefPush(ActivityNFCSender.this, getIntAsNdef(mReservServerId));
}
}
public void onPause(){
if(mNfcAdapter != null && mNfcAdapter.isEnabled()){
mNfcAdapter.disableForegroundNdefPush(this);
}
super.onPause();
}
private NdefMessage getIntAsNdef(int pInt) {
byte[] textBytes = (pInt+"").getBytes(Charset.forName("UTF8"));
NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), new byte[] {}, textBytes);
return new NdefMessage(new NdefRecord[] {
textRecord
});
}
public class ActivityNFCReceiver extends ActivityBase {
private NfcAdapter mNfcAdapter;
private PendingIntent mNfcPendingIntent;
private IntentFilter[] mNdefExchangeFilters;
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_nfc);
super.onCreate(savedInstanceState);
((TextView) findViewById(R.id.nfcTVStatus)).setText(R.string.receiving);
}
public void onResume(){
super.onResume();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if(mNfcAdapter == null){
messageDialogQuit(R.string.error_no_nfc);
}
else if(!mNfcAdapter.isEnabled()){
new AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.error_nfc_off)
.setPositiveButton(R.string.turn_on, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
startActivity(settingsIntent);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
finish();
}
})
.create().show();
}
else{
mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// Intent filters for exchanging over p2p.
IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndefDetected.addDataType("text/plain");
}
catch (MalformedMimeTypeException e) {
e.printStackTrace();
}
mNdefExchangeFilters = new IntentFilter[] { ndefDetected };
//set receiving
mNfcAdapter.enableForegroundDispatch(ActivityNFCReceiver.this, mNfcPendingIntent, mNdefExchangeFilters, null);
}
}
public void onPause(){
if(mNfcAdapter != null && mNfcAdapter.isEnabled()){
mNfcAdapter.disableForegroundDispatch(ActivityNFCReceiver.this);
}
super.onPause();
}
@Override
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
NdefMessage[] msgs = getNdefMessages(intent);
if(msgs.length > 0){
try{
NdefRecord firstRecord = msgs[0].getRecords()[0];
byte[] payload = firstRecord.getPayload();
String str = new String(payload, Charset.forName("UTF8"));
int reservServerId = Integer.parseInt(str);
returnResult(reservServerId);
}
catch(Exception e){
messageDialog(R.string.error_during_NFC);
}
}
}
}
public void onCancelClicked(View pV){
finish();
}
private NdefMessage[] getNdefMessages(Intent intent) {
// Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
}
else {
// Unknown tag type
byte[] empty = new byte[] {};
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
NdefMessage msg = new NdefMessage(new NdefRecord[] { record });
msgs = new NdefMessage[] { msg };
}
}
else {
Log.d(TAG, "Unknown intent.");
finish();
}
return msgs;
}
private void returnResult(int pResServerId){
Intent result = new Intent();
result.putExtra(ActivityCompanySubMenu.EXTRA_RES_SERVER_ID, pResServerId);
setResult(RESULT_OK, result);
finish();
}
公共类ActivityNFCReceiver扩展ActivityBase{
专用NfcAdapter mNfcAdapter;
私人挂件MNFCpendingent;
私有IntentFilter[]MNDEFExchangeFilter;
@凌驾
创建时的公共void(Bundle savedInstanceState){
setContentView(R.layout.activity\u nfc);
super.onCreate(savedInstanceState);
((TextView)findviewbyd(R.id.nfcTVStatus)).setText(R.string.receiving);
}
恢复时公开作废(){
super.onResume();
mNfcAdapter=NfcAdapter.getDefaultAdapter(此);
if(mNfcAdapter==null){
messageDialogQuit(R.string.error\u no\u nfc);
}
如果(!mNfcAdapter.isEnabled()),则为else{
新建AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.error\u nfc\u off)
.setPositiveButton(R.string.turn_打开,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
dialog.dismise();
意向设置Intent=新意向(设置、操作和设置);
启动触觉(设置输入);
}
})
.setNegativeButton(R.string.cancel,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
dialog.dismise();
完成();
}
})
.create().show();
}
否则{
mNfcPendingIntent=PendingIntent.getActivity(this,0,newintent(this,getClass()).addFlags(Intent.FLAG\u ACTIVITY\u SINGLE\u TOP),0);
//用于通过p2p交换的意图过滤器。
IntentFilter ndefDetected=新的IntentFilter(NfcAdapter.ACTION\u NDEF\u DISCOVERED);
试一试{
ndefDetected.addDataType(“文本/普通”);
}
捕获(格式错误的dmimetype异常){
e、 printStackTrace();
}
mNdefExchangeFilters=新的IntentFilter[]{ndefDetected};
//设置接收
mNfcAdapter.enableForegroundDispatch(ActivityNFCReceiver.this,mnfcpendingent,mndefchangefilters,null);
}
}
public void onPause(){
if(mNfcAdapter!=null&&mNfcAdapter.isEnabled()){
mNfcAdapter.disableForegroundDispatch(ActivityNFCReceiver.this);
}
super.onPause();
}
@凌驾
受保护的void onNewIntent(意图){
if(NfcAdapter.ACTION\u NDEF\u DISCOVERED.equals(intent.getAction())){
NdefMessage[]msgs=获取NDEFMessages(意图);
如果(msgs.length>0){
试一试{
NdefRecord firstRecord=msgs[0].getRecords()[0];
字节[]有效载荷=firstRecord.getPayload();
String str=新字符串(有效负载,Charset.forName(“UTF8”);
int reservServerId=Integer.parseInt(str);
returnResult(reservServerId);
}
捕获(例外e){
messageDialog(R.string.error\u在NFC期间);
}
}
}
}
单击“取消”后的公共无效(查看pV){
完成();
}
私有NdefMessage[]获取NDEFMessages(意图){
//解析意图
NdefMessage[]msgs=null;
String action=intent.getAction();
if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(ACTION)| NfcAdapter.ACTION_NDEF_DISCOVERED.equals(ACTION)){
Parcelable[]rawMsgs=intent.getParcelableArrayExtra(NfcAdapter.EXTRA\u NDEF\u消息);
if(rawMsgs!=null){
msgs=新的NdefMessage[rawMsgs.length];
对于(int i=0;i
}您可以使用
NfcAdapter.setNdefPushMessage
方法禁用特定活动(即您的活动nfcreceiver
)的Beam UI:
public void onCreate(Bundle savedInstanceState) {
[...]
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter != null) {
mNfcAdapter.setNdefPushMessage(null, this);
}
}
请注意,enableforegroundendefpush
方法自Android 4.0(API级别14)以来就被弃用,并且几乎所有支持NFC的Android设备都使用Android 4.0或更高版本
在禁用Beam UI时,这种方式适用于Nexus设备,并且是官方记录的方式(请参阅): 如果使用空NDEF消息[…]调用setNdefPushMessage(…),则指定活动的NDEF推送将被完全禁用。这也会禁用Android操作系统为这些活动以其他方式代表您发送的任何默认NDEF消息
不幸的是,这似乎不适用于某些Android设备的NFC实现。例如,它在运行Android 4.3的三星Galaxy S3上不起作用。我更改了代码并添加了mNfcAdapter.setNdefPushMessage(null,this);紧接着mNfcAdapter.enableForegroundDispatch(ActivityNFCReceiver.this、mnfcpendingent、mndefchangefilters、null);在receiver活动中,但结果相同:两个设备都显示发送提示。我可能错了,但是