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" /> + + + + + + + + + + + + + + + + + +