| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- package com.example.uicceditor
- import android.os.Bundle
- import android.os.Handler
- import android.os.Looper
- import android.telephony.TelephonyManager
- import android.util.Log
- import android.widget.Toast
- import androidx.activity.enableEdgeToEdge
- import androidx.appcompat.app.AppCompatActivity
- import androidx.core.view.ViewCompat
- import androidx.core.view.WindowInsetsCompat
- import com.example.uicceditor.databinding.ActivityMainBinding
- class MainActivity : AppCompatActivity() {
- private val TAG = "APDU"
- private val handler = Handler(Looper.getMainLooper())
- val AID = "D07002CA44900101"
- private val binding: ActivityMainBinding by lazy {
- ActivityMainBinding.inflate(layoutInflater)
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- setContentView(binding.root)
- ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
- val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
- insets
- }
- val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
- binding.btnReadIccid.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- val iccid = apduChannel.readICCID()
- apduChannel.close()
- binding.etIccid.setText(iccid)
- }
- binding.btnWriteIccid.setOnClickListener {
- val iccid = binding.etIccid.text.toString()
- if (Regex("^[0-9]{20}$").matches(iccid)) {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.writeICCID(iccid)
- apduChannel.close()
- Toast.makeText(this, "ICCID written", Toast.LENGTH_SHORT).show()
- } else {
- Toast.makeText(this, "Invalid ICCID", Toast.LENGTH_SHORT).show()
- }
- }
- binding.btnReadImsi.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- val imsi = apduChannel.readIMSI()
- apduChannel.close()
- binding.etImsi.setText(imsi)
- }
- binding.btnWriteImsi.setOnClickListener {
- try {
- val imsi = binding.etImsi.text.toString()
- if (Regex("^[0-9]{15,18}$").matches(imsi)) {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.writeIMSI(imsi)
- apduChannel.close()
- Toast.makeText(this, "IMSI written", Toast.LENGTH_SHORT).show()
- } else {
- Toast.makeText(this, "Invalid IMSI", Toast.LENGTH_SHORT).show()
- }
- } catch (e: Exception) {
- Log.e(TAG, "Error writing IMSI", e)
- Toast.makeText(this, "Error writing IMSI", Toast.LENGTH_SHORT).show()
- }
- }
- binding.btnReadMsisdn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_TELECOM)
- apduChannel.select(SIMView.FID_EF_MSISDN)
- val msisdn = decMSISDN(apduChannel.readRecord(1, 28).substring(28)) ?: ""
- binding.etMsisdn.setText(msisdn)
- apduChannel.close()
- }
- binding.btnWriteMsisdn.setOnClickListener {
- val msisdn = binding.etMsisdn.text.toString()
- Log.i(TAG, "MSISDN: ${encMSISDN(msisdn)}")
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_TELECOM)
- apduChannel.select(SIMView.FID_EF_MSISDN)
- apduChannel.writeRecord(1, encMSISDN(msisdn).padStart(56, 'F'))
- apduChannel.close()
- }
- binding.btnReadPlmn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_PLMNSEL)
- binding.etPlmn.setText(decPLMN(apduChannel.readBinary(60)))
- apduChannel.close()
- }
- binding.btnReadEhplmn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_EHPLMN)
- binding.etEhplmn.setText(decPLMN(apduChannel.readBinary(12)))
- apduChannel.close()
- }
- binding.btnReadFplmn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_FPLMN)
- binding.etFplmn.setText(decPLMN(apduChannel.readBinary(30)))
- apduChannel.close()
- }
- binding.btnReadPlmnwact.setOnClickListener{
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_PLMNWACT)
- binding.etPlmnwact.setText(decPLMNwAcT(apduChannel.readBinary(120)))
- apduChannel.close()
- }
- binding.btnReadOplmnwact.setOnClickListener{
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_OPLMNWACT)
- binding.etOplmnwact.setText(decPLMNwAcT(apduChannel.readBinary(60)))
- apduChannel.close()
- }
- binding.btnReadHplmnwact.setOnClickListener{
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_HPLMNWACT)
- binding.etHplmnwact.setText(decPLMNwAcT(apduChannel.readBinary(20)))
- apduChannel.close()
- }
- binding.btnReset.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.reset()
- apduChannel.close()
- }
- }
- fun getRandomString(length: Int): String {
- val allowedChars = ('0'..'9')
- return (1..length)
- .map { allowedChars.random() }
- .joinToString("")
- }
- }
|