Цель обычно проста: поместить тег nfc, сравнить uid с базой данных csv.
Mifare DESFire: ISO14443-4: Тип A, Isode Tag содержит защищенные сертификаты, поскольку карта используется в компании, и единственным открытым объектом является UID.
mainactivity.kt :
Код: Выделить всё
package com.example.simplicims
import android.nfc.NfcAdapter
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.nfc.Tag
import android.nfc.tech.NfcA
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.BufferedReader
import java.io.File
import java.io.FileInputStream
import java.io.FileReader
import java.io.IOException
import java.io.InputStream
import org.apache.poi.ss.usermodel.WorkbookFactory
class MainActivity : Activity() {
private lateinit var nfcAdapter: NfcAdapter
private lateinit var uidTextView: TextView
private lateinit var statusTextView: TextView
private lateinit var scanButton: Button
private val validUids = mutableListOf() // List to store valid UIDs from CSV
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
uidTextView = findViewById(R.id.uidTextView)
statusTextView = findViewById(R.id.statusTextView)
scanButton = findViewById(R.id.scanButton)
nfcAdapter = NfcAdapter.getDefaultAdapter(this)
// Check for permissions and load CSV file
checkPermissions()
scanButton.setOnClickListener {
// Trigger NFC scan manually if needed
// Optionally, start an activity for NFC scan manually
}
}
override fun onResume() {
super.onResume()
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
if (NfcAdapter.getDefaultAdapter(this) == null) {
statusTextView.text = "NFC non dispo"
return
} else {
if (nfcAdapter.isEnabled) {
Log.e("NFC", "NFC is disabled")
} else {
nfcAdapter.enableForegroundDispatch(this, null, null, null)
}
}
}
override fun onPause() {
super.onPause()
nfcAdapter.disableForegroundDispatch(this)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent?.action) {
val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)!!
val uid = tag.id.joinToString("") { it.toString(16).padStart(2, '0') }
uidTextView.text = "UID: $uid"
checkUidInDatabase(uid)
}
}
private fun loadCsvDatabase() {
try {
val csvFile = File("/storage/emulated/0/Download/database.csv") // CSV file path
if (!csvFile.exists()) {
statusTextView.text = "CSV file not found"
return
}
val reader = BufferedReader(FileReader(csvFile))
var line: String?
while (reader.readLine().also { line = it } != null) {
// Assuming each line contains a single UID
val uid = line?.trim() // Remove any unnecessary whitespace
if (!uid.isNullOrEmpty()) {
validUids.add(uid)
}
}
reader.close()
} catch (e: IOException) {
statusTextView.text = "Error reading CSV file"
}
}
private fun checkUidInDatabase(uid: String) {
if (validUids.contains(uid)) {
statusTextView.text = "Entrée autorisée"
statusTextView.setTextColor(getColor(android.R.color.holo_green_dark))
} else {
statusTextView.text = "Entrée non autorisée - voir CSB"
statusTextView.setTextColor(getColor(android.R.color.holo_red_dark))
}
}
// Check for permission to read external storage
private fun checkPermissions() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1)
} else {
// If permission is granted, load the CSV
loadCsvDatabase()
}
}
// Handle the result of permission request
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 1) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted, load the CSV
loadCsvDatabase()
} else {
// Permission denied, handle accordingly
statusTextView.text = "Permission denied to read external storage"
}
}
}
}
Код: Выделить всё
Ничего больше, но каждый раз у меня ничего не получалось.
Я использую ИИ, потому что я не разработчик, даже пытаюсь понять некоторые вещи.
Подробнее здесь: https://stackoverflow.com/questions/792 ... 443-4-type