diff --git a/app/build.gradle b/app/build.gradle
index 86a745c..2e69608 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -48,10 +48,12 @@ dependencies {
implementation files('libs\\reader(1).jar')
implementation files('libs\\UHF67_v3.6.jar')
implementation 'androidx.preference:preference:1.2.0'
+ implementation files('libs\\jxl-2.6.12.jar')
+// implementation files('libs\\uhfr_v1.8.jar')
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
-
+ implementation 'org.litepal.android:java:3.0.0'
implementation 'com.tonystark.android:socket:4.1.0'
//如果您需要使用 OkSocketServer 功能在客户端或者Java程序,您还需要依赖下面的Server插件包和上面的一起依赖.
implementation 'com.tonystark.android:socket-server:4.1.0'
diff --git a/app/libs/jxl-2.6.12.jar b/app/libs/jxl-2.6.12.jar
new file mode 100644
index 0000000..4a1fc64
Binary files /dev/null and b/app/libs/jxl-2.6.12.jar differ
diff --git a/app/libs/uhfr_v1.8.jar b/app/libs/uhfr_v1.8.jar
new file mode 100644
index 0000000..44c1a70
Binary files /dev/null and b/app/libs/uhfr_v1.8.jar differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f8b81d8..dc1e5f6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,9 @@
+
+
+
+
+
+
+ android:label="读写EPC区">
@@ -44,18 +53,16 @@
-
-
-
-
+
+
+
+
-
-
+ android:label="轮胎信息追溯">
@@ -82,12 +89,12 @@
-
-
-
-
-
+ android:exported="true"
+ android:label="扫描EPC">
+
+
+
+
-->
-
-
diff --git a/app/src/main/assets/litepal.xml b/app/src/main/assets/litepal.xml
new file mode 100644
index 0000000..1b9621d
--- /dev/null
+++ b/app/src/main/assets/litepal.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/writeepc/MainActivity.java b/app/src/main/java/com/example/writeepc/MainActivity.java
index 7a4a84d..8af9ada 100644
--- a/app/src/main/java/com/example/writeepc/MainActivity.java
+++ b/app/src/main/java/com/example/writeepc/MainActivity.java
@@ -10,12 +10,12 @@ import android.util.Log;
import android.view.View;
import android.widget.Toast;
+import com.example.writeepc.been.InfoData;
import com.example.writeepc.databinding.ActivityMainBinding;
+import com.example.writeepc.utils.ASCIIUtil;
import com.handheld.uhfr.UHFRManager;
import com.uhf.api.cls.Reader;
-import java.util.List;
-
import cn.pda.serialport.Tools;
public class MainActivity extends AppCompatActivity {
@@ -67,6 +67,13 @@ public class MainActivity extends AppCompatActivity {
public void readTid(View view) {
byte[] rdata = new byte[12];
Reader.READER_ERR readerErr = uhfrManager.getTagData(2, 0, 6, rdata, accesspwd, timeOut);
+ uhfrManager.setGen2session(0);
+ //taget
+ uhfrManager.setTarget(0);
+ //q value
+ uhfrManager.setQvaule(0);
+ //FastId
+ uhfrManager.setFastID(false);
Log.e("TAG", "readTid:" + readerErr.name());
if (readerErr == Reader.READER_ERR.MT_OK_ERR) {
infoData.setReadTId(Tools.Bytes2HexString(rdata, 12));
diff --git a/app/src/main/java/com/example/writeepc/MoreActivity.java b/app/src/main/java/com/example/writeepc/MoreActivity.java
index 4abed63..c01b259 100644
--- a/app/src/main/java/com/example/writeepc/MoreActivity.java
+++ b/app/src/main/java/com/example/writeepc/MoreActivity.java
@@ -4,6 +4,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
@@ -11,6 +12,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import com.example.writeepc.databinding.ActivityMoreBinding;
+import com.example.writeepc.utils.ASCIIUtil;
import com.handheld.uhfr.UHFRManager;
import com.uhf.api.cls.Reader;
@@ -26,6 +28,7 @@ public class MoreActivity extends AppCompatActivity {
private boolean aBoolean;
private ActivityMoreBinding binding;
private MyAdapter adapter;
+ public MediaPlayer music;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -35,6 +38,7 @@ public class MoreActivity extends AppCompatActivity {
adapter = new MyAdapter(this);
binding.setAdapter(adapter);
uhfrManager = UHFRManager.getInstance();
+ music = MediaPlayer.create(this, com.example.writeepc.R.raw.msg);
registerReceiver();
}
@@ -88,7 +92,7 @@ public class MoreActivity extends AppCompatActivity {
if (strings == null || strings.isEmpty()) {
return;
}
-
+ music.start();
List list = new ArrayList<>(strings.size());
strings.forEach(taginfo -> {
diff --git a/app/src/main/java/com/example/writeepc/UserXuanchuanActivity.java b/app/src/main/java/com/example/writeepc/UserXuanchuanActivity.java
new file mode 100644
index 0000000..89f7774
--- /dev/null
+++ b/app/src/main/java/com/example/writeepc/UserXuanchuanActivity.java
@@ -0,0 +1,108 @@
+package com.example.writeepc;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Toast;
+
+import androidx.databinding.DataBindingUtil;
+
+import com.example.writeepc.base.BaseActivity;
+import com.example.writeepc.databinding.ActivityUserXuanchuanBinding;
+import com.example.writeepc.utils.ASCIIUtil;
+
+import java.util.Locale;
+
+public class UserXuanchuanActivity extends BaseActivity {
+ private ActivityUserXuanchuanBinding binding;
+ private int flag = 0;
+ private byte[] rdata;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ binding = DataBindingUtil.setContentView(this, R.layout.activity_user_xuanchuan);
+ Locale locale = new Locale("es");
+ Locale.setDefault(locale);
+ Configuration config = new Configuration();
+ config.locale = locale;
+ getBaseContext().getResources().updateConfiguration(config,
+ getBaseContext().getResources().getDisplayMetrics());
+
+ initReceiver();
+ initUHFRManager(33);
+ }
+
+ public void readTid(View view) {
+ flag = 1;
+ readTid();
+ }
+
+ public void writeUser(View view) {
+ String trim = binding.writeInfo.getText().toString().trim();
+ if (rdata == null) {
+ Toast.makeText(this, "请先读取TID", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ if (trim.isEmpty()) {
+ Toast.makeText(this, "请输入要写入的用户信息", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ int length = trim.length();
+ // 32,128
+ if (length > 32 ) {
+ Toast.makeText(this, "长度不能超过32个字符", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ String writeData = ASCIIUtil.str4Hex(trim);
+ int writeLenth = writeData.length();
+ Log.e("TAG", "数据长度:" + length + " ," + writeLenth);
+ if (writeLenth < 128) {
+ writeData = writeData+String.format("%0"+(128-writeLenth)+"d", 0);
+ }
+
+ Log.e("TAG", "写入数据:" + writeData+" ,长度:" + writeData.length());
+ writeUserDataByTid(writeData, rdata);
+ }
+
+ public void readUser(View view) {
+ flag = 2;
+ readUser(64);
+ }
+
+ @Override
+ public void receiverSan() {
+ super.receiverSan();
+ readUser(null);
+ }
+
+ @Override
+ protected void readTidReault(boolean readState, String result, byte[] rdata) {
+ super.readTidReault(readState, result, rdata);
+ if (readState) {
+ if (flag == 1) {
+ binding.tidCode.setText(result);
+ this.rdata = rdata;
+ } else {
+ Log.e("TAG", "readTidReault:" + result);
+ String text = ASCIIUtil.hexTo4ZN(result);
+ binding.readInfo.setText(text);
+ }
+ }
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (uhfrManager != null) {
+ uhfrManager.close();
+ uhfrManager = null;
+ }
+ if (myReceiver != null) {
+ unregisterReceiver(myReceiver);
+ myReceiver = null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/writeepc/WriteUserActivity.java b/app/src/main/java/com/example/writeepc/WriteUserActivity.java
index 786a885..9eefe11 100644
--- a/app/src/main/java/com/example/writeepc/WriteUserActivity.java
+++ b/app/src/main/java/com/example/writeepc/WriteUserActivity.java
@@ -1,5 +1,9 @@
package com.example.writeepc;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
@@ -8,55 +12,93 @@ import android.widget.Toast;
import androidx.databinding.DataBindingUtil;
import com.example.writeepc.base.BaseActivity;
+import com.example.writeepc.been.InfoData;
+import com.example.writeepc.been.WriteInfo;
import com.example.writeepc.databinding.ActivityWriteUserBinding;
+import com.example.writeepc.utils.SharedPreferencesUtils;
+import com.example.writeepc.utils.WriteExportExcelUtil;
+import com.uhf.api.cls.Reader;
+
+import org.litepal.LitePal;
+
+import java.io.File;
+import java.util.Date;
public class WriteUserActivity extends BaseActivity {
private ActivityWriteUserBinding binding;
private InfoData infoData;
-
+ private boolean isReadUser = false;
+ private WriteExportExcelUtil writeExportExcelUtil;
+ private MyKeyReceiver keyReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_write_user);
infoData = new InfoData();
binding.setData(infoData);
- initUHFRManager(5);
- initReceiver();
+ int power = SharedPreferencesUtils.getInt("power", 30);
+ binding.selectPower.setSelection(power-5);
+ initUHFRManager(power);
+ writeExportExcelUtil = new WriteExportExcelUtil(this);
+ keyReceiver = new MyKeyReceiver();
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction("android.rfid.FUN_KEY");
+ registerReceiver(keyReceiver, intentFilter);
+
}
@Override
protected void readTidReault(boolean readState, String result, byte[] rdata) {
Log.e("TAG", "readTidReault:" + result);
- infoData.setReadUser(ASCIIUtil.hex2Str(result));
+ if (isReadUser) {
+ infoData.setTidBytes(rdata);
+ infoData.setReadTId(result);
+ return;
+ }
+ infoData.setReadUser(result);
}
public void writeUser(View view) {
+ String readTId = infoData.getReadTId();
+ if (readTId == null || readTId.isEmpty()) {
+ Toast.makeText(this, "请先读取TID", Toast.LENGTH_SHORT).show();
+ return;
+ }
String writeData = infoData.getWriteUser();
if (writeData == null || writeData.isEmpty()) {
Toast.makeText(this, "请输入要写入的数据", Toast.LENGTH_SHORT).show();
return;
}
- int length = writeData.length();
- String tag="";
- if (writeData.length() % 4 != 0) {
- tag=String.format("%0" + (length % 4)*2 + "d", 0);
+ try {
+ WriteInfo writeInfo = new WriteInfo(readTId, writeData, sdf.format(new Date()));
+ // boolean b = writeUserDataByTid(writeData + "0000000000", infoData.getTidBytes());
+ boolean b = writeEPCDataByTid("00"+writeData , infoData.getTidBytes());
+ if (b) {
+ writeInfo.save();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ Toast.makeText(this, "写入用户数据失败,请检查胎号是否正确", Toast.LENGTH_SHORT).show();
}
- String s = ASCIIUtil.str2Hex(writeData)+tag;
- Log.e("TAG", "writeUser:" + s);
- Log.e("TAG", "writeUser:" + s.length());
- writeUserData(s);
+
}
public void readUser(View view) {
- int lenth = Integer.parseInt(binding.userReadLenth.getSelectedItem().toString());
- readUser(lenth);
+ isReadUser = false;
+ // readUser(6);
+ readEPC(6);
}
public void userClearView(View view) {
- infoData.setWriteUser(null);
- infoData.setReadUser(null);
+ // infoData.setWriteUser(null);
+ // infoData.setReadUser(null);
+ infoData.clear();
}
+ public void writeUserReadTid(View view) {
+ isReadUser = true;
+ readTid();
+ }
@Override
public void receiverSan() {
@@ -70,9 +112,71 @@ public class WriteUserActivity extends BaseActivity {
uhfrManager.close();
uhfrManager = null;
}
- if (myReceiver != null) {
- unregisterReceiver(myReceiver);
+ // if (myReceiver != null) {
+ // unregisterReceiver(myReceiver);
+ // }
+ if (keyReceiver != null) {
+ unregisterReceiver(keyReceiver);
}
}
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ exportExcel(null);
+ }
+
+ public void exportExcel(View view) {
+ // File file= writeExportExcelUtil.getFilePath("RFID写入记录.xls");
+ // if (file.exists()) {
+ // file.delete();
+ // }
+ // writeExportExcelUtil.export(LitePal.findAll(WriteInfo.class), "RFID写入记录.xls");
+
+
+
+ }
+// 点击两次返回结束程序
+ private long exitTime = 0;
+ @Override
+ public void onBackPressed() {
+ if (System.currentTimeMillis() - exitTime > 2000) {
+ Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
+ exitTime = System.currentTimeMillis();
+ } else {
+ finish();
+ }
+ }
+
+ public class MyKeyReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+
+ var keydown = intent.getBooleanExtra("keydown", false);
+ var keyCode = intent.getIntExtra("keyCode", 0);
+ Log.e("TAG", "onReceive:" + keyCode);
+ if (!keydown) {
+ if (keyCode == 135) {
+ writeUserReadTid(null);
+ }else if (keyCode ==136){
+ writeUser(null);
+ }
+
+ }
+ }
+ }
+
+ public void setPower(View view) {
+ String powerString = binding.selectPower.getSelectedItem().toString();
+ int power = Integer.parseInt(powerString);
+ SharedPreferencesUtils.putInt("power", power);
+ Reader.READER_ERR readerErr = uhfrManager.setPower(power, power);
+ Log.e("TAG", "setPower:" + readerErr.toString());
+ }
+
+
+
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/writeepc/base/BaseActivity.java b/app/src/main/java/com/example/writeepc/base/BaseActivity.java
index 4118514..3b48980 100644
--- a/app/src/main/java/com/example/writeepc/base/BaseActivity.java
+++ b/app/src/main/java/com/example/writeepc/base/BaseActivity.java
@@ -19,6 +19,8 @@ import com.google.gson.Gson;
import com.handheld.uhfr.UHFRManager;
import com.uhf.api.cls.Reader;
+import java.text.SimpleDateFormat;
+
import cn.pda.serialport.Tools;
import okhttp3.MediaType;
@@ -32,6 +34,8 @@ public class BaseActivity extends AppCompatActivity {
public MediaType mediaType = MediaType.parse("text/xml; charset=utf-8");
public Gson gson;
public MyReceiver myReceiver;
+ public SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化时间
+ public SimpleDateFormat fileNameDate = new SimpleDateFormat("yyyy-MM-dd HH_mm_ss");// 格式化时间
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -100,7 +104,7 @@ public class BaseActivity extends AppCompatActivity {
public void readEPC(int lenth) {
byte[] rdata = new byte[lenth];
Reader.READER_ERR readerErr =
- uhfrManager.getTagData(1, 2, lenth / 2, rdata, accesspwd, timeOut);
+ uhfrManager.getTagData(1, 5, lenth / 2, rdata, accesspwd, timeOut);
Log.e("TAG", "readTid:" + readerErr.name());
if (readerErr == Reader.READER_ERR.MT_OK_ERR) {
music.start();
@@ -141,6 +145,73 @@ public class BaseActivity extends AppCompatActivity {
}
}
+ public boolean writeUserDataByTid(String writeData, byte[] rdata) {
+ byte[] bytes = Tools.HexString2Bytes(writeData);
+ Reader.READER_ERR readerErr = uhfrManager.writeTagDataByFilter
+ ((char) 3, 0,
+ bytes, bytes.length, accesspwd, timeOut,
+ rdata, 2, 0, true);
+ Log.e("TAG", "写入状态:" + readerErr.name());
+ boolean b = readerErr == Reader.READER_ERR.MT_OK_ERR;
+ if (b) {
+ music.start();
+ Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
+
+ } else {
+ Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();
+
+ }
+ return b;
+ }
+
+
+ public boolean writeEPCDataByTid(String writeData, byte[] rdata) {
+ byte[] bytes = Tools.HexString2Bytes(writeData);
+ Reader.READER_ERR readerErr = uhfrManager.writeTagDataByFilter
+ ((char) 1, 5,
+ bytes, bytes.length, accesspwd, timeOut,
+ rdata, 2, 0, true);
+ Log.e("TAG", "写入状态:" + readerErr.name());
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ Log.e("TAG", "Sleep interrupted", e);
+ }
+ Reader.READER_ERR readerErr2 = Reader.READER_ERR.MT_CMD_FAILED_ERR;
+ if (readerErr == Reader.READER_ERR.MT_OK_ERR) {
+ // 写入成功
+ byte[] suessTagEpc = new byte[12];
+ Reader.READER_ERR readerErrReed =
+ uhfrManager.getTagData(1, 2, 6, suessTagEpc, accesspwd, timeOut);
+ Log.e("TAG", "read读取全部EPC:" + readerErrReed.name());
+
+ if ( readerErrReed == Reader.READER_ERR.MT_OK_ERR) {
+ readerErr2 = uhfrManager.lockTagByFilter(
+ Reader.Lock_Obj.LOCK_OBJECT_BANK1,
+ Reader.Lock_Type.BANK1_PERM_LOCK,
+ // Reader.Lock_Type.BANK1_LOCK,
+ accesspwd,
+ timeOut,
+ suessTagEpc, 1, 2, true);
+ }
+
+ }
+
+
+ Log.e("TAG", "锁定状态:" + readerErr2.name());
+ boolean b = readerErr2 == Reader.READER_ERR.MT_OK_ERR;
+ if (b) {
+ music.start();
+ Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show();
+
+ } else {
+ Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();
+
+ }
+ return b;
+ }
+
protected void readTidReault(boolean readState, String result, byte[] rdata) {
}
diff --git a/app/src/main/java/com/example/writeepc/base/MyApplication.java b/app/src/main/java/com/example/writeepc/base/MyApplication.java
index 3096f14..810a759 100644
--- a/app/src/main/java/com/example/writeepc/base/MyApplication.java
+++ b/app/src/main/java/com/example/writeepc/base/MyApplication.java
@@ -13,6 +13,8 @@ import com.lzy.okgo.https.HttpsUtils;
import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
import com.lzy.okgo.model.HttpHeaders;
+import org.litepal.LitePal;
+
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
@@ -48,6 +50,7 @@ public class MyApplication extends Application {
application = this;
SharedPreferencesUtils.init(getApplicationContext(), "myapp");
okGoBase();
+ LitePal.initialize(this);
}
// OKGO 初始化
diff --git a/app/src/main/java/com/example/writeepc/InfoData.java b/app/src/main/java/com/example/writeepc/been/InfoData.java
similarity index 87%
rename from app/src/main/java/com/example/writeepc/InfoData.java
rename to app/src/main/java/com/example/writeepc/been/InfoData.java
index 9c0b43c..d4f0889 100644
--- a/app/src/main/java/com/example/writeepc/InfoData.java
+++ b/app/src/main/java/com/example/writeepc/been/InfoData.java
@@ -1,7 +1,9 @@
-package com.example.writeepc;
+package com.example.writeepc.been;
import androidx.databinding.BaseObservable;
+import java.util.Arrays;
+
public class InfoData extends BaseObservable {
private int power;
private String epc;
@@ -113,4 +115,18 @@ public class InfoData extends BaseObservable {
this.state = state;
notifyChange();
}
+
+
+ public void clear() {
+ epc = null;
+ writeEpc = null;
+ readEpc = null;
+ readAscii = null;
+ readTId = null;
+ tidBytes = null;
+ writeUser = null;
+ readUser = null;
+ notifyChange();
+ }
+
}
diff --git a/app/src/main/java/com/example/writeepc/been/WriteInfo.java b/app/src/main/java/com/example/writeepc/been/WriteInfo.java
new file mode 100644
index 0000000..45bc2b6
--- /dev/null
+++ b/app/src/main/java/com/example/writeepc/been/WriteInfo.java
@@ -0,0 +1,51 @@
+package com.example.writeepc.been;
+
+import org.litepal.crud.LitePalSupport;
+
+public class WriteInfo extends LitePalSupport {
+ private int id;
+ private String tid;
+ private String writeInfo;
+ private String dateTime;
+
+ public WriteInfo() {
+ }
+
+ public WriteInfo(String tid, String writeInfo, String dateTime) {
+ this.tid = tid;
+ this.writeInfo = writeInfo;
+ this.dateTime = dateTime;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getTid() {
+ return tid;
+ }
+
+ public void setTid(String tid) {
+ this.tid = tid;
+ }
+
+ public String getWriteInfo() {
+ return writeInfo;
+ }
+
+ public void setWriteInfo(String writeInfo) {
+ this.writeInfo = writeInfo;
+ }
+
+ public String getDateTime() {
+ return dateTime;
+ }
+
+ public void setDateTime(String dateTime) {
+ this.dateTime = dateTime;
+ }
+}
diff --git a/app/src/main/java/com/example/writeepc/ASCIIUtil.java b/app/src/main/java/com/example/writeepc/utils/ASCIIUtil.java
similarity index 87%
rename from app/src/main/java/com/example/writeepc/ASCIIUtil.java
rename to app/src/main/java/com/example/writeepc/utils/ASCIIUtil.java
index 0de6a55..9493df2 100644
--- a/app/src/main/java/com/example/writeepc/ASCIIUtil.java
+++ b/app/src/main/java/com/example/writeepc/utils/ASCIIUtil.java
@@ -1,4 +1,6 @@
-package com.example.writeepc;
+package com.example.writeepc.utils;
+
+import android.util.Log;
/**
* @author: wangh
@@ -31,12 +33,15 @@ public class ASCIIUtil {
return sb.toString();
}
- public static String hexTo4ZN(String hex) throws Exception {
+ public static String hexTo4ZN(String hex) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hex.length() - 1; i += 4) {
String h = hex.substring(i, (i + 4));
+ Log.e("TAG", "hexTo4ZN:" + h);
+ if (!h.equals("0000")) {
+ sb.append((char) Integer.parseInt(h, 16));
+ }
- sb.append((char) Integer.parseInt(h, 16));
}
return sb.toString();
diff --git a/app/src/main/java/com/example/writeepc/utils/WriteExportExcelUtil.java b/app/src/main/java/com/example/writeepc/utils/WriteExportExcelUtil.java
new file mode 100644
index 0000000..e128e8d
--- /dev/null
+++ b/app/src/main/java/com/example/writeepc/utils/WriteExportExcelUtil.java
@@ -0,0 +1,98 @@
+package com.example.writeepc.utils;
+
+import android.content.Context;
+import android.os.Environment;
+import android.widget.Toast;
+
+import com.example.writeepc.been.WriteInfo;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+import jxl.Workbook;
+import jxl.write.Label;
+import jxl.write.WritableSheet;
+import jxl.write.WritableWorkbook;
+import jxl.write.WriteException;
+
+/**
+ * 使用 jxl-2.6.12 导出 Excel(适配 Android 5.1)
+ */
+public class WriteExportExcelUtil {
+ private Context mContext;
+
+ public WriteExportExcelUtil(Context context) {
+ this.mContext = context;
+ }
+
+ /**
+ * 导出 RFID 数据到 .xls 文件
+ */
+ public void export(List dataList, String fileName) {
+ // 确保文件名以 .xls 结尾
+ if (!fileName.endsWith(".xls")) {
+ fileName += ".xls";
+ }
+ WritableWorkbook workbook = null;
+ try {
+ File file = getFilePath(fileName);
+ FileOutputStream fos = new FileOutputStream(file);
+ workbook = Workbook.createWorkbook(fos);
+ WritableSheet sheet = workbook.createSheet("RFID写入记录", 0); // 索引0表示第一个表
+ sheet.setColumnView(0, 10);
+ sheet.setColumnView(1, 20);
+ sheet.setColumnView(2, 20);
+ sheet.setColumnView(3, 20);
+ // 4. 写入表头(第一行)
+ String[] headers = {"序号", "TID", "写入胎号", "写入时间"};
+ for (int i = 0; i < headers.length; i++) {
+ // Label(列索引, 行索引, 内容)
+ Label headerLabel = new Label(i, 0, headers[i]);
+ sheet.addCell(headerLabel);
+ }
+
+ // 5. 写入数据(从第二行开始,行索引1)
+ for (int i = 0; i < dataList.size(); i++) {
+ WriteInfo data = dataList.get(i);
+ int rowIndex = i + 1;
+
+ // 序号(id)
+ sheet.addCell(new Label(0, rowIndex, String.valueOf(data.getId())));
+ sheet.addCell(new Label(1, rowIndex, data.getTid() == null ? "" : data.getTid()));
+ sheet.addCell(new Label(2, rowIndex, data.getWriteInfo() == null ? "" : data.getWriteInfo()));
+ sheet.addCell(new Label(3, rowIndex, data.getDateTime() == null ? "" : data.getDateTime()));
+ }
+
+ // 6. 写入文件并关闭工作簿
+ workbook.write();
+ // Toast.makeText(mContext, "导出成功:" + file.getAbsolutePath(), Toast.LENGTH_LONG).show();
+
+ } catch (IOException | WriteException e) {
+ e.printStackTrace();
+ // Toast.makeText(mContext, "导出失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
+ } finally {
+ // 7. 释放资源
+ if (workbook != null) {
+ try {
+ workbook.close();
+ } catch (IOException | WriteException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * 获取 Android 5.1 兼容的文件路径
+ */
+ public File getFilePath(String fileName) {
+ File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+ if (!downloadDir.exists()) {
+ downloadDir.mkdirs();
+ }
+
+ return new File(downloadDir, fileName);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/info_text_bg.xml b/app/src/main/res/drawable/info_text_bg.xml
new file mode 100644
index 0000000..9d3f332
--- /dev/null
+++ b/app/src/main/res/drawable/info_text_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 2463b83..390a54c 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -7,7 +7,7 @@
+ type="com.example.writeepc.been.InfoData" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_write_user.xml b/app/src/main/res/layout/activity_write_user.xml
index 3331092..b637a7a 100644
--- a/app/src/main/res/layout/activity_write_user.xml
+++ b/app/src/main/res/layout/activity_write_user.xml
@@ -1,12 +1,12 @@
+
+ type="com.example.writeepc.been.InfoData" />
+
+ android:orientation="horizontal"
+ android:visibility="gone">
+
+
+
+
+
+
+
+ />
+
+
+
+
+
+
+
+
+
-
+ android:text="EPC:" />
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-xxxhdpi/test1.png b/app/src/main/res/mipmap-xxxhdpi/test1.png
new file mode 100644
index 0000000..b0e7d5e
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/test1.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 7d27dac..84a5d5d 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -3,4 +3,5 @@
#FF000000
#FFFFFFFF
#304FFE
+ #034580
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 27669ee..f623d81 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -44,6 +44,16 @@
- @drawable/san_text_bg
- 8dp
+
+
+
+