本示例使用的发卡器:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="3dp"
tools:context=".EM4469Activity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="?attr/colorPrimary"
app:navigationIcon="@drawable/baseline_arrow_back_ios_24"
app:titleTextColor="@color/white"
tools:ignore="MissingConstraints"
tools:layout_editor_absoluteY="0dp">
<TextView
android:id="@+id/TextViewlabelDispleft"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="返回"
android:textColor="@color/white"
android:textSize="16sp"
android:gravity="center"
android:onClick="retmain" />
<TextView
android:id="@+id/TextViewlabelDisp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="EM4469卡测试页 "
android:textColor="@color/white"
android:textSize="16sp"
android:gravity="center_horizontal|right|center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/TextViewlabelDispleft"
app:layout_constraintTop_toTopOf="parent" />
</androidx.appcompat.widget.Toolbar>
<TextView
android:id="@+id/sample_text"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:padding="3dp"
android:text="操作结果"
android:textSize="12sp"
android:background="@drawable/shape4border"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
<ScrollView
android:id="@+id/scrollViewIC"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_marginBottom="5dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:layout_constraintBottom_toTopOf="@+id/sample_text"
android:scrollbars="horizontal"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
>
<CheckBox
android:id="@+id/chkPwdEM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="12sp"
android:checked="false"
android:text="带密码操作"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:id="@+id/editTextPwdEM4469"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="@drawable/shape4border"
android:digits="0123456789ABCDEFabcdef"
android:gravity="center"
android:inputType="textCapCharacters"
android:maxLength="8"
android:maxLines="1"
android:text="00000000"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@+id/chkPwdEM4469"
app:layout_constraintLeft_toRightOf="@+id/chkPwdEM4469"
app:layout_constraintTop_toTopOf="@+id/chkPwdEM4469"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(十六进制)"
android:textSize="12sp"
android:layout_marginLeft="10dp"
app:layout_constraintLeft_toRightOf="@+id/editTextPwdEM4469"
app:layout_constraintTop_toTopOf="@+id/chkPwdEM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkPwdEM4469"/>
<CheckBox
android:id="@+id/chkUidNeedEM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="12sp"
android:checked="false"
android:text="仅操作指定卡号的卡"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/chkPwdEM4469"/>
<EditText
android:id="@+id/editTextUidEM4469"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="@drawable/shape4border"
android:digits="0123456789ABCDEFabcdef"
android:gravity="center"
android:inputType="textCapCharacters"
android:maxLength="8"
android:maxLines="1"
android:text="00000000"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@+id/chkUidNeedEM4469"
app:layout_constraintLeft_toRightOf="@+id/chkUidNeedEM4469"
app:layout_constraintTop_toTopOf="@+id/chkUidNeedEM4469"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(十六进制)"
android:textSize="12sp"
android:layout_marginLeft="10dp"
app:layout_constraintLeft_toRightOf="@+id/editTextUidEM4469"
app:layout_constraintTop_toTopOf="@+id/chkUidNeedEM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkUidNeedEM4469"/>
<TextView
android:id="@+id/TextViewlabel15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回数据:"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toTopOf="@+id/TextViewRetDataEM4469"/>
<TextView
android:id="@+id/TextViewRetDataEM4469"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:text=""
android:textSize="12sp"
android:background="@drawable/shape4border"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnRetDataClrEM4469"
/>
<Button
android:id="@+id/btnRetDataClrEM4469"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:onClick="textclear4469"
android:text="清空数据"
android:textSize="11sp"
app:layout_constraintTop_toBottomOf="@+id/editTextUidEM4469"
app:layout_constraintRight_toRightOf="parent" />
<Button
android:id="@+id/btnPwdChangeEM4469"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:onClick="changepwd4469"
android:text="修改卡密码"
android:textSize="11sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/TextViewRetDataEM4469" />
<TextView
android:id="@+id/TextViewlabel16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="新密码:"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="@+id/btnPwdChangeEM4469"
app:layout_constraintBottom_toBottomOf="@+id/btnPwdChangeEM4469"
/>
<EditText
android:id="@+id/editTextPwdNewEM4469"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="@drawable/shape4border"
android:digits="0123456789ABCDEFabcdef"
android:gravity="center"
android:inputType="textCapCharacters"
android:maxLength="8"
android:maxLines="1"
android:text="00000000"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="@+id/btnPwdChangeEM4469"
app:layout_constraintLeft_toRightOf="@+id/TextViewlabel16"
app:layout_constraintTop_toTopOf="@+id/btnPwdChangeEM4469" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(十六进制)"
android:textSize="12sp"
android:layout_marginLeft="10dp"
app:layout_constraintLeft_toRightOf="@+id/editTextPwdNewEM4469"
app:layout_constraintTop_toTopOf="@+id/editTextPwdNewEM4469"
app:layout_constraintBottom_toBottomOf="@+id/editTextPwdNewEM4469"/>
<CheckBox
android:id="@+id/chkB0EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="11sp"
android:checked="false"
android:text="块0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnPwdChangeEM4469"/>
<CheckBox
android:id="@+id/chkB1EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="11sp"
android:checked="false"
android:text="块1(UID)"
app:layout_constraintLeft_toRightOf="@+id/chkB0EM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkB0EM4469"/>
<CheckBox
android:id="@+id/chkB3EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="11sp"
android:checked="false"
android:text="块3"
app:layout_constraintLeft_toRightOf="@+id/chkB1EM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkB0EM4469"/>
<CheckBox
android:id="@+id/chkB4EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="12sp"
android:checked="false"
android:text="块4(配置)"
app:layout_constraintLeft_toRightOf="@+id/chkB3EM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkB0EM4469"/>
<CheckBox
android:id="@+id/chkB5EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="12sp"
android:checked="false"
android:text="块5"
app:layout_constraintLeft_toRightOf="@+id/chkB4EM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkB0EM4469"/>
<CheckBox
android:id="@+id/chkB6EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块6"
android:textSize="11sp"
app:layout_constraintLeft_toRightOf="@+id/chkB5EM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkB0EM4469"/>
<CheckBox
android:id="@+id/chkB7EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:textSize="12sp"
android:checked="false"
android:text="块7"
app:layout_constraintTop_toBottomOf="@+id/chkB0EM4469"
app:layout_constraintLeft_toLeftOf="parent"/>
<CheckBox
android:id="@+id/chkB8EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块8"
android:textSize="11sp"
app:layout_constraintLeft_toRightOf="@+id/chkB7EM4469"
app:layout_constraintBottom_toBottomOf="@+id/chkB7EM4469" />
<CheckBox
android:id="@+id/chkB9EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块9"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/chkB8EM4469"
app:layout_constraintLeft_toRightOf="@+id/chkB8EM4469" />
<CheckBox
android:id="@+id/chkB10EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块10"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/chkB8EM4469"
app:layout_constraintLeft_toRightOf="@+id/chkB9EM4469" />
<CheckBox
android:id="@+id/chkB11EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块11"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/chkB8EM4469"
app:layout_constraintLeft_toRightOf="@+id/chkB10EM4469" />
<CheckBox
android:id="@+id/chkB12EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块12"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/chkB8EM4469"
app:layout_constraintLeft_toRightOf="@+id/chkB11EM4469" />
<CheckBox
android:id="@+id/chkB13EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块13"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/chkB8EM4469"
app:layout_constraintLeft_toRightOf="@+id/chkB12EM4469" />
<CheckBox
android:id="@+id/chkB14EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块14"
android:textSize="11sp"
app:layout_constraintTop_toBottomOf="@+id/chkB8EM4469"
app:layout_constraintLeft_toLeftOf="parent" />
<CheckBox
android:id="@+id/chkB15EM4469"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="2dp"
android:checked="false"
android:text="块15"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/chkB14EM4469"
app:layout_constraintLeft_toRightOf="@+id/chkB14EM4469" />
<TextView
android:id="@+id/TextViewlabel17"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写入数据:"
android:textSize="12sp"
app:layout_constraintTop_toBottomOf="@+id/chkB14EM4469"
app:layout_constraintLeft_toLeftOf="parent" />
<EditText
android:id="@+id/editTextDataEM4469"
android:layout_width="0dp"
android:layout_height="40dp"
android:background="@drawable/shape4border"
android:digits="0123456789ABCDEFabcdef"
android:gravity="left"
android:inputType="textCapCharacters"
android:maxLength="128"
android:text="11111111"
android:padding="3dp"
android:textSize="12sp"
app:layout_constraintLeft_toLeftOf="@+id/TextViewRetDataEM4469"
app:layout_constraintRight_toRightOf="@+id/TextViewRetDataEM4469"
app:layout_constraintTop_toBottomOf="@+id/TextViewlabel17" />
<Button
android:id="@+id/btnReadEM4469"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginRight="20dp"
android:onClick="read4469"
android:text="读卡"
android:textSize="11sp"
app:layout_constraintRight_toLeftOf="@+id/btnWriteEM4469"
app:layout_constraintBottom_toBottomOf="@+id/btnWriteEM4469" />
<Button
android:id="@+id/btnWriteEM4469"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:onClick="write4469"
android:text="写卡"
android:textSize="11sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/editTextDataEM4469" />
<TextView
android:id="@+id/TextViewlabel18"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数据速率:"
android:textSize="12sp"
app:layout_constraintTop_toTopOf="@+id/SpinnerDateRateEM4469"
app:layout_constraintBottom_toBottomOf="@+id/SpinnerDateRateEM4469"
app:layout_constraintLeft_toLeftOf="parent" />
<Spinner
android:id="@+id/SpinnerDateRateEM4469"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/datarateEM4469"
android:theme="@style/my_spinner_style"
android:spinnerMode="dropdown"
app:layout_constraintLeft_toRightOf="@+id/TextViewlabel18"
app:layout_constraintTop_toBottomOf="@+id/editTextDataEM4469">
</Spinner>
<TextView
android:id="@+id/TextViewlabel19"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调制模式:"
android:textSize="12sp"
app:layout_constraintTop_toTopOf="@+id/SpinnerDateRateEM4469"
app:layout_constraintBottom_toBottomOf="@+id/SpinnerDateRateEM4469"
app:layout_constraintRight_toLeftOf="@+id/SpinnerEncoderEM4469" />
<Spinner
android:id="@+id/SpinnerEncoderEM4469"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/EncoderEM4469"
android:theme="@style/my_spinner_style"
android:spinnerMode="dropdown"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="@+id/SpinnerDateRateEM4469">
</Spinner>
<Spinner
android:id="@+id/SpinnerLoginModeEM4469"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:entries="@array/loginmodeEM4469"
android:theme="@style/my_spinner_style"
android:spinnerMode="dropdown"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/SpinnerEncoderEM4469">
</Spinner>
<TextView
android:id="@+id/TextViewlabel20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自动发送最大块:"
android:textSize="12sp"
app:layout_constraintTop_toTopOf="@+id/editTextMaxBlockEM4469"
app:layout_constraintBottom_toBottomOf="@+id/editTextMaxBlockEM4469"
app:layout_constraintLeft_toLeftOf="parent" />
<EditText
android:id="@+id/editTextMaxBlockEM4469"
android:layout_width="20dp"
android:layout_height="wrap_content"
android:background="@drawable/shape4border"
android:digits="0123456789"
android:gravity="left"
android:inputType="textCapCharacters"
android:maxLength="2"
android:text="6"
android:paddingLeft="3dp"
android:textSize="12sp"
app:layout_constraintLeft_toRightOf="@+id/TextViewlabel20"
app:layout_constraintTop_toBottomOf="@+id/SpinnerLoginModeEM4469" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="范围:5-15块,时序从5块至最大块"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@+id/editTextMaxBlockEM4469"
app:layout_constraintLeft_toRightOf="@+id/editTextMaxBlockEM4469"
app:layout_constraintTop_toTopOf="@+id/editTextMaxBlockEM4469" />
<TextView
android:id="@+id/TextViewlabel21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="配置值:"
android:textSize="12sp"
app:layout_constraintTop_toTopOf="@+id/editTextConfigWordEM4469"
app:layout_constraintBottom_toBottomOf="@+id/editTextConfigWordEM4469"
app:layout_constraintLeft_toLeftOf="parent" />
<EditText
android:id="@+id/editTextConfigWordEM4469"
android:layout_width="68dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/shape4border"
android:digits="0123456789ABCDEFabcdef"
android:gravity="left"
android:inputType="textCapCharacters"
android:maxLength="8"
android:text="45800100"
android:paddingLeft="3dp"
android:textSize="12sp"
app:layout_constraintLeft_toRightOf="@+id/TextViewlabel21"
app:layout_constraintTop_toBottomOf="@+id/editTextMaxBlockEM4469" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(十六进制)"
android:textSize="12sp"
android:layout_marginLeft="10dp"
app:layout_constraintLeft_toRightOf="@+id/editTextConfigWordEM4469"
app:layout_constraintTop_toTopOf="@+id/editTextConfigWordEM4469"
app:layout_constraintBottom_toBottomOf="@+id/editTextConfigWordEM4469"/>
<Button
android:id="@+id/btnDefalutEM4469"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginRight="20dp"
android:onClick="default4469"
android:text="← 默认值"
android:textSize="11sp"
app:layout_constraintRight_toLeftOf="@+id/btnInitEM4469"
app:layout_constraintBottom_toBottomOf="@+id/btnInitEM4469" />
<Button
android:id="@+id/btnInitEM4469"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:onClick="init4469"
android:text="设定配置"
android:textSize="12sp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextConfigWordEM4469"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
package com.usbreadertest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.reader.ouridr;
import com.reader.ourmifare;
public class EM4469Activity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_em4469);
androidx.appcompat.widget.Toolbar toolbar=findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
tv = findViewById(R.id.sample_text);
tv.setText("操作结果");
//增加输入监听事件
//EM4469
((EditText)findViewById(R.id.editTextMaxBlockEM4469)).setOnFocusChangeListener(new View.OnFocusChangeListener(){
@Override
public void onFocusChange(View v,boolean FocusState) {
if(FocusState){//进入焦点
}
else{//离开焦点
updateset4469();
}
}
});
Spinner spls;
spls = findViewById(R.id.SpinnerDateRateEM4469);//数据速率
spls.setSelection(1);
spls.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateset4469();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
spls = findViewById(R.id.SpinnerEncoderEM4469);//调制模式
spls.setSelection(1);
spls.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateset4469();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//加密模式
((Spinner)findViewById(R.id.SpinnerLoginModeEM4469)).setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateset4469();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home){
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
public void retmain(View view)
{
finish();
}
public void textclear4469(View view)
{
TextView tvls;
tvls = findViewById(R.id.TextViewRetDataEM4469);
tvls.setText("");
}
public void changepwd4469(View view)
{
byte i;
byte j;
byte status;//存放返回值
byte myctrlword;//控制字
byte[] oldpicckey = new byte[4];//旧密码
byte[] mypiccserial = new byte[4];//卡序列号
byte[] newpicckey = new byte[4];//新密码
myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能
String strls;
CheckBox cbls;
EditText etls;
cbls = findViewById(R.id.chkPwdEM4469);
if(!cbls.isChecked()) {//本次操作需要密码验证
tv.setText("EM4469卡修改卡密码必须带密码操作");
return;
}
etls = findViewById(R.id.editTextPwdEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("旧密码长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDKEY;
cbls = findViewById(R.id.chkUidNeedEM4469);
if(cbls.isChecked()) {//仅操作指定卡号的卡
etls = findViewById(R.id.editTextUidEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("卡号长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDSERIAL;
}
etls = findViewById(R.id.editTextPwdNewEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("新密码长度不足8位!");
return;
}
for (i = 0; i < 4; i++) {
newpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
status = ouridr.em4305changekey(myctrlword,mypiccserial,oldpicckey,newpicckey);
if(status == 0)
{
strls = "卡号[";
strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);
strls += "]";
TextView tvls = findViewById(R.id.TextViewRetDataEM4469);
tvls.setText(strls);
strls = "EM4469卡修改卡密码成功";
ouridr.beep(38);
}
else
{
if(status == 8)
{
strls = "请将卡放在感应区";
}
else if(status == 23)
{
strls = "错误代码:23,读卡器未插入";
}
else if(status == 1)
{
strls = "错误代码:1,卡放得远 或 需要密码才能写卡";
}
else if(status == 12)
{
strls = "错误代码:12,卡放得远 或 密码错误";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
public void read4469(View view)
{
byte i;
byte status;//存放返回值
byte myctrlword;//控制字
byte[] oldpicckey = new byte[4];//密码
byte[] mypiccserial = new byte[4];//卡序列号
byte[] mypiccdata = new byte[64];//读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12块的数据
byte[] mypiccblockflag = new byte[2];//指定读哪一块
myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能
String strls;
CheckBox cbls;
EditText etls;
cbls = findViewById(R.id.chkPwdEM4469);
if(cbls.isChecked()) {//本次操作需要密码验证
etls = findViewById(R.id.editTextPwdEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("密码长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDKEY;
}
cbls = findViewById(R.id.chkUidNeedEM4469);
if(cbls.isChecked()) {//仅操作指定卡号的卡
etls = findViewById(R.id.editTextUidEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("卡号长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDSERIAL;
}
//操作块标志
mypiccblockflag[0] = 0;
cbls = findViewById(R.id.chkB0EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 1;
}
cbls = findViewById(R.id.chkB1EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 2;
}
cbls = findViewById(R.id.chkB3EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 8;
}
cbls = findViewById(R.id.chkB4EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 16;
}
cbls = findViewById(R.id.chkB5EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 32;
}
cbls = findViewById(R.id.chkB6EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 64;
}
cbls = findViewById(R.id.chkB7EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 128;
}
mypiccblockflag[1] = 0;
cbls = findViewById(R.id.chkB8EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 1;
}
cbls = findViewById(R.id.chkB9EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 2;
}
cbls = findViewById(R.id.chkB10EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 4;
}
cbls = findViewById(R.id.chkB11EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 8;
}
cbls = findViewById(R.id.chkB12EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 16;
}
cbls = findViewById(R.id.chkB13EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 32;
}
cbls = findViewById(R.id.chkB14EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 64;
}
cbls = findViewById(R.id.chkB15EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 128;
}
status = ouridr.em4305read(myctrlword,mypiccserial,oldpicckey,mypiccblockflag,mypiccdata);
if(status == 0)
{
strls = "卡无线转输分频比[" + Integer.toString(mypiccdata[0]) + "],卡号[";
strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);
strls += "],卡数据[";
for (i = 0; i < mypiccdata[1]; i++) {
strls += String.format("%02X",mypiccdata[i+2]);
}
strls += "]";
TextView tvls = findViewById(R.id.TextViewRetDataEM4469);
tvls.setText(strls);
strls = "读EM4469卡成功";
ouridr.beep(38);
}
else
{
if(status == 8)
{
strls = "请将卡放在感应区";
}
else if(status == 23)
{
strls = "错误代码:23,读卡器未插入";
}
else if(status == 4)
{
strls = "错误代码:4,卡放得远 或 需要密码才能读卡";
}
else if(status == 12)
{
strls = "错误代码:12,卡放得远 或 密码错误";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
public void write4469(View view)
{
byte i;
byte j;
byte status;//存放返回值
byte myctrlword;//控制字
byte[] oldpicckey = new byte[4];//密码
byte[] mypiccserial = new byte[4];//卡序列号
byte[] mypiccdata = new byte[64];//读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),最多12块的数据
byte[] mypiccblockflag = new byte[2];//指定读哪一块
myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能
String strls;
CheckBox cbls;
EditText etls;
cbls = findViewById(R.id.chkPwdEM4469);
if(cbls.isChecked()) {//本次操作需要密码验证
etls = findViewById(R.id.editTextPwdEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("密码长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDKEY;
}
cbls = findViewById(R.id.chkUidNeedEM4469);
if(cbls.isChecked()) {//仅操作指定卡号的卡
etls = findViewById(R.id.editTextUidEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("卡号长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDSERIAL;
}
//操作块标志
j = 0;
mypiccblockflag[0] = 0;
cbls = findViewById(R.id.chkB0EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 1;
j++;
}
cbls = findViewById(R.id.chkB1EM4469);
if(cbls.isChecked()) {
tv.setText("块1为只读,不允许写");
return;
}
cbls = findViewById(R.id.chkB3EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 8;
j++;
}
cbls = findViewById(R.id.chkB4EM4469);
if(cbls.isChecked()) {
tv.setText("块4为配置区,只能在初始化函数中操作");
return;
}
cbls = findViewById(R.id.chkB5EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 32;
j++;
}
cbls = findViewById(R.id.chkB6EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 64;
j++;
}
cbls = findViewById(R.id.chkB7EM4469);
if(cbls.isChecked()) {
mypiccblockflag[0] += 128;
j++;
}
mypiccblockflag[1] = 0;
cbls = findViewById(R.id.chkB8EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 1;
j++;
}
cbls = findViewById(R.id.chkB9EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 2;
j++;
}
cbls = findViewById(R.id.chkB10EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 4;
j++;
}
cbls = findViewById(R.id.chkB11EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 8;
j++;
}
cbls = findViewById(R.id.chkB12EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 16;
j++;
}
cbls = findViewById(R.id.chkB13EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 32;
j++;
}
cbls = findViewById(R.id.chkB14EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 64;
j++;
}
cbls = findViewById(R.id.chkB15EM4469);
if(cbls.isChecked()) {
mypiccblockflag[1] += 128;
j++;
}
//写卡数据准备
if(j == 0)
{
tv.setText("请先选择需要写入的块");
return;
}
etls = findViewById(R.id.editTextDataEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < (j*8))
{
tv.setText("写入数据长度不足,请补足数据!");
return;
}
for (i = 0; i < (j*4); i++) {
mypiccdata[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
status = ouridr.em4305write(myctrlword,mypiccserial,oldpicckey,mypiccblockflag,mypiccdata);
if(status == 0)
{
strls = "卡号[";
strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);
strls += "]";
TextView tvls = findViewById(R.id.TextViewRetDataEM4469);
tvls.setText(strls);
strls = "写EM4469卡成功";
ouridr.beep(38);
}
else
{
if(status == 8)
{
strls = "请将卡放在感应区";
}
else if(status == 23)
{
strls = "错误代码:23,读卡器未插入";
}
else if(status == 1)
{
strls = "错误代码:1,卡放得远 或 需要密码才能写卡";
}
else if(status == 12)
{
strls = "错误代码:12,卡放得远 或 密码错误";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
public void default4469(View view)
{
EditText etls;
Spinner spls;
etls = findViewById(R.id.editTextConfigWordEM4469);
etls.setText("45800100");
etls = findViewById(R.id.editTextMaxBlockEM4469);
etls.setText("6");
spls = findViewById(R.id.SpinnerDateRateEM4469);//数据速率
spls.setSelection(1);
spls = findViewById(R.id.SpinnerEncoderEM4469);//调制模式
spls.setSelection(1);
spls = findViewById(R.id.SpinnerLoginModeEM4469);//加密模式
spls.setSelection(0);
}
public void updateset4469()
{
EditText etls;
EditText etMaxBlock;
Spinner spls;
String strls;
byte i;
byte[] Configdata = new byte[4];//配置值
etls = findViewById(R.id.editTextConfigWordEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8){
strls = "45800100";
Configdata[0] = 0x45;
Configdata[1] = (byte)0x80;
Configdata[2] = 0x01;
Configdata[3] = 0x00;
}
else {
for (i = 2; i < 4; i++) {
Configdata[i] = (byte)Integer.parseInt(strls.substring(i * 2, i * 2 + 2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
}
spls = findViewById(R.id.SpinnerDateRateEM4469);//数据速率
i = (byte)(spls.getSelectedItemId());
Configdata[0] = 0x00;
Configdata[1] = 0x00;
if(i == 0){//RF/32
Configdata[0] |= 0x04;
}
else if(i == 2) {//RF/128
Configdata[0] |= 0x06;
}
else {//RF/64或其他
Configdata[0] |= 0x05;
}
spls = findViewById(R.id.SpinnerEncoderEM4469);//调制模式
i = (byte)(spls.getSelectedItemId());
if(i == 0){//NRZ码
}
else if(i == 2) {//Biphase码
Configdata[0] |= 0x80;
}
else if(i == 3) {//Miller码
Configdata[0] |= 0xC0;
}
else if(i == 4) {//PSK2码
Configdata[0] |= 0x40;
Configdata[1] |= 0x01;
}
else if(i == 5) {//PSK3码
Configdata[0] |= 0x80;
Configdata[1] |= 0x01;
}
else if(i == 6) {//FSK码
Configdata[1] |= 0x02;
}
else {//其他
Configdata[0] |= 0x40;
}
Configdata[2] = 0x00;
//自动发送最大块
etMaxBlock = findViewById(R.id.editTextMaxBlockEM4469);
strls = etMaxBlock.getText().toString().trim();
if(strls.length() < 1){
i = 6;
etMaxBlock.setText("6");
}
else {
i = (byte)Integer.parseInt(strls,10);
if((i < 5) || (i > 15)){
i = 6;
etMaxBlock.setText("6");
}
}
Configdata[1] |= ((i % 4) * 64);
Configdata[2] |= ((i / 4) % 4);
spls = findViewById(R.id.SpinnerLoginModeEM4469);//密码规则(也就是读登陆或写登陆)
i = (byte)(spls.getSelectedItemId());
if(i == 1){//0-1块任意读,3-15块需密码读,0-13块任意写,14-15块需密码写
i = 0x01;
}
else if(i == 2) {//0-15任意读,0-15块需密码写
i = 0x04;
}
else if(i == 3) {//0-1块任意读,3-15块需密码读,0-15块需密码写
i = 0x05;
}
else {//0-15块任意读.0-13块任意写,14-15块需密码写
i = 0x00;
}
Configdata[2] |= (i * 4);
Configdata[3] = 0;
etls.setText(String.format("%02X%02X%02X%02X",Configdata[0],Configdata[1],Configdata[2],Configdata[3]));
}
public void init4469(View view)
{
byte i;
byte status;//存放返回值
byte myctrlword;//控制字
byte[] oldpicckey = new byte[4];//密码
byte[] mypiccserial = new byte[4];//卡序列号
byte[] mypiccdata = new byte[4];//写入数据缓冲
myctrlword = 0; //NEEDSERIAL:需要只对指定系列号的卡操作,NEEDKEY:需要用密码认证,LOCKBIT:锁定块,KEYENABLE:启用本卡的密码功能
String strls;
CheckBox cbls;
EditText etls;
updateset4469();
cbls = findViewById(R.id.chkPwdEM4469);
if(cbls.isChecked()) {//本次操作需要密码验证
etls = findViewById(R.id.editTextPwdEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("密码长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
oldpicckey[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDKEY;
}
cbls = findViewById(R.id.chkUidNeedEM4469);
if(cbls.isChecked()) {//仅操作指定卡号的卡
etls = findViewById(R.id.editTextUidEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("卡号长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
mypiccserial[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
myctrlword += ouridr.NEEDSERIAL;
}
//配置值:
etls = findViewById(R.id.editTextConfigWordEM4469);
strls = etls.getText().toString().trim();
if(strls.length() < 8)
{
tv.setText("配置值输入长度不足8位");
return;
}
for (i = 0; i < 4; i++) {
mypiccdata[i] = (byte)Integer.parseInt(strls.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
}
status = ouridr.em4469init(myctrlword,mypiccserial,oldpicckey,mypiccdata);
if(status == 0)
{
strls = "卡号[";
strls += String.format("%02X%02X%02X%02X",mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);
strls += "]";
TextView tvls = findViewById(R.id.TextViewRetDataEM4469);
tvls.setText(strls);
strls = "配置EM4469卡成功";
ouridr.beep(38);
}
else
{
if(status == 8)
{
strls = "卡不在感应区 或 密码不正确";
}
else if(status == 23)
{
strls = "错误代码:23,读卡器未插入";
}
else if(status == 1)
{
strls = "错误代码:1,卡放得远 或 需要密码才能写卡";
}
else if(status == 12)
{
strls = "错误代码:12,卡放得远 或 密码错误";
}
else
{
strls = "错误代码:" + Integer.toString(status);
}
}
tv.setText(strls);
}
}
源码下载:AndroidstudioRFIDNFC读写源码资源-CSDN文库