gpt4 book ai didi

android - 使用支持 NFC 的安卓智能手机作为 NFC 标签并使用 nfc 阅读器接收数据

转载 作者:行者123 更新时间:2023-11-29 19:16:30 28 4
gpt4 key购买 nike

我是 NFC 新手,我想将支持 NFC 的安卓手机作为 NFC 标签,并使用 NFC 阅读器读取其数据。如果您能建议我已经构建的用于发送数据的 NFC 应用程序或我应该使用哪种 NFC 读取器硬件,那就太好了。

最佳答案

这是我的 NFC 发送和接收代码。

MainActivity 发送文件

public class MainActivity extends AppCompatActivity {

NfcAdapter nfcAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mIntentFilters;
private String[][] mNFCTechLists;
private TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);

mTextView = (TextView)findViewById(R.id.recive_text);
PackageManager pm = this.getPackageManager();
// Check whether NFC is available on device
if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
// NFC is not available on the device.
Toast.makeText(this, "The device does not has NFC hardware.",
Toast.LENGTH_SHORT).show();
}
// Check whether device is running Android 4.1 or higher
else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
// Android Beam feature is not supported.
Toast.makeText(this, "Android Beam is not supported.",
Toast.LENGTH_SHORT).show();
}
else {
// NFC and Android Beam file transfer is supported.
Toast.makeText(this, "Android Beam is supported on your device.",
Toast.LENGTH_SHORT).show();
}


// create an intent with tag data and deliver to this activity
mPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

// set an intent filter for all MIME data
IntentFilter ndefIntent = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndefIntent.addDataType("*/*");
mIntentFilters = new IntentFilter[] { ndefIntent };
} catch (Exception e) {
Log.e("TagDispatch", e.toString());
}

mNFCTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}

public void sendFile(View view) {


// Check whether NFC is enabled on device
if(!nfcAdapter.isEnabled()){
// NFC is disabled, show the settings UI
// to enable NFC
Toast.makeText(this, "Please enable NFC.",
Toast.LENGTH_SHORT).show();
startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
}
// Check whether Android Beam feature is enabled on device
else if(!nfcAdapter.isNdefPushEnabled()) {
// Android Beam is disabled, show the settings UI
// to enable Android Beam
Toast.makeText(this, "Please enable Android Beam.",
Toast.LENGTH_SHORT).show();
startActivity(new Intent(Settings.ACTION_NFCSHARING_SETTINGS));
}
else {


Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("*/*");
chooseFile = Intent.createChooser(chooseFile, "Choose a file");
startActivityForResult(chooseFile, 1);
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data!=null) {
Uri uri = data.getData();
nfcAdapter.setBeamPushUris(new Uri[]{uri}, this);
} else {
Toast.makeText(this,"Please choose a file",Toast.LENGTH_SHORT).show();
}
}


public void nextScreen(View view){
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}

public void reciveScreen(View view){
startActivity(new Intent(MainActivity.this,RecieveScreen.class));
}


@Override
public void onNewIntent(Intent intent) {
String action = intent.getAction();
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

String s = action + "\n\n" + tag.toString();

// parse through all NDEF messages and their records and pick text type only
Parcelable[] data = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

if (data != null) {
try {
for (int i = 0; i < data.length; i++) {
NdefRecord[] recs = ((NdefMessage)data[i]).getRecords();
for (int j = 0; j < recs.length; j++) {
if (recs[j].getTnf() == NdefRecord.TNF_WELL_KNOWN &&
Arrays.equals(recs[j].getType(), NdefRecord.RTD_TEXT)) {

byte[] payload = recs[j].getPayload();
String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
int langCodeLen = payload[0] & 0077;

s += ("\n\nNdefMessage[" + i + "], NdefRecord[" + j + "]:\n\"" +
new String(payload, langCodeLen + 1,
payload.length - langCodeLen - 1, textEncoding) +
"\"");
}
}
}
} catch (Exception e) {
Log.e("TagDispatch", e.toString());
}

}

mTextView.setText(s);
}

@Override
public void onResume() {
super.onResume();

if (nfcAdapter != null)
nfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mNFCTechLists);
}

@Override
public void onPause() {
super.onPause();

if (nfcAdapter != null)
nfcAdapter.disableForegroundDispatch(this);
}

}

这是我的接收界面,可能有一些额外的代码,但你可以删除它

public class RecieveScreen extends AppCompatActivity {

private TextView mTextView;
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mIntentFilters;
private String[][] mNFCTechLists;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recieve_screen);
mTextView = (TextView)findViewById(R.id.recieve_tv);

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

if (mNfcAdapter != null) {
mTextView.setText("Read an NFC tag");
} else {
mTextView.setText("This phone is not NFC enabled.");
}

// create an intent with tag data and deliver to this activity
mPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

// set an intent filter for all MIME data
IntentFilter ndefIntent = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndefIntent.addDataType("*/*");
mIntentFilters = new IntentFilter[] { ndefIntent };
} catch (Exception e) {
Log.e("TagDispatch", e.toString());
}

mNFCTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}


@Override
public void onNewIntent(Intent intent) {
String action = intent.getAction();
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

String s = action + "\n\n" + tag.toString();

// parse through all NDEF messages and their records and pick text type only
Parcelable[] data = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

if (data != null) {
try {
for (int i = 0; i < data.length; i++) {
NdefRecord[] recs = ((NdefMessage)data[i]).getRecords();
for (int j = 0; j < recs.length; j++) {
if (recs[j].getTnf() == NdefRecord.TNF_WELL_KNOWN &&
Arrays.equals(recs[j].getType(), NdefRecord.RTD_TEXT)) {

byte[] payload = recs[j].getPayload();
String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
int langCodeLen = payload[0] & 0077;

s += ("\n\nNdefMessage[" + i + "], NdefRecord[" + j + "]:\n\"" +
new String(payload, langCodeLen + 1,
payload.length - langCodeLen - 1, textEncoding) +
"\"");
}
}
}
} catch (Exception e) {
Log.e("TagDispatch", e.toString());
}

}

mTextView.setText(s);
}

@Override
public void onResume() {
super.onResume();

if (mNfcAdapter != null)
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mNFCTechLists);
}

@Override
public void onPause() {
super.onPause();

if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
}
}

如果您遇到任何错误,请告诉我。

关于android - 使用支持 NFC 的安卓智能手机作为 NFC 标签并使用 nfc 阅读器接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366875/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com