Android11 完整代码实现门禁卡信息写入手机NFC芯片中
时间: 2024-02-16 21:05:02 浏览: 345
写入门禁卡信息到手机NFC芯片中需要使用NFC技术,并且需要获取到门禁卡的信息,包括卡号、姓名等。以下是一个简单的Android 11中使用NFC技术写入门禁卡信息的示例代码:
1. 在AndroidManifest.xml文件中添加如下权限:
```xml
<uses-permission android:name="android.permission.NFC" />
```
2. 在MainActivity.java中添加如下代码:
```java
public class MainActivity extends AppCompatActivity implements NfcAdapter.CreateNdefMessageCallback {
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mIntentFilters;
private String[][] mTechLists;
private TextView mTextView;
private EditText mEditText;
private String mCardNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.text_view);
mEditText = findViewById(R.id.edit_text);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
Toast.makeText(this, "该设备不支持NFC功能", Toast.LENGTH_SHORT).show();
finish();
return;
}
mPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*");
} catch (IntentFilter.MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
mIntentFilters = new IntentFilter[]{ndef,};
mTechLists = new String[][]{new String[]{Ndef.class.getName()}, new String[]{NfcA.class.getName()}};
}
@Override
protected void onResume() {
super.onResume();
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mTechLists);
mNfcAdapter.setNdefPushMessageCallback(this, this);
}
}
@Override
protected void onPause() {
super.onPause();
if (mNfcAdapter != null) {
mNfcAdapter.disableForegroundDispatch(this);
mNfcAdapter.setNdefPushMessageCallback(null, this);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.getAction() != null && intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage msg = (NdefMessage) rawMsgs[0];
NdefRecord cardNumberRecord = msg.getRecords()[0];
mCardNumber = new String(cardNumberRecord.getPayload());
mTextView.setText("门禁卡号:" + mCardNumber);
}
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
if (mCardNumber == null || mCardNumber.isEmpty()) {
Toast.makeText(this, "请先读取门禁卡号", Toast.LENGTH_SHORT).show();
return null;
}
String text = mEditText.getText().toString();
if (text.isEmpty()) {
Toast.makeText(this, "请输入要写入的信息", Toast.LENGTH_SHORT).show();
return null;
}
NdefRecord mimeRecord = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA,
"text/plain".getBytes(),
new byte[0],
text.getBytes(StandardCharsets.UTF_8));
NdefMessage msg = new NdefMessage(new NdefRecord[]{mimeRecord});
return msg;
}
}
```
这段代码中,我们首先获取NFC适配器,然后创建一个PendingIntent和IntentFilter,用于启动NFC消息的处理。在onResume()方法中,我们启用前台分发以便在应用程序处于前台时接收NFC消息。在onPause()方法中,我们禁用前台分发以便在应用程序不再处于前台时停止接收NFC消息。在onNewIntent()方法中,我们从NFC消息中获取门禁卡号,并在TextView中显示。在createNdefMessage()方法中,我们创建一个NDEF消息并将其写入NFC芯片中。
请注意,此示例仅用于演示目的。实际上,门禁卡的信息可能需要加密和安全保护,以确保不被其他人读取和修改。此外,门禁卡信息的写入需要特定的硬件支持。
阅读全文