diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0fcb45a..0046903 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -144,6 +144,9 @@
+
popToBack());
+ add.setOnClickListener(v -> checkCameraPermission());
+ }
+
+ private void setupSignatureView() {
+ // 初始化签名按钮点击事件
+ signatureImage.setOnClickListener(v -> showSignatureDialog());
+
+ // 初始化上传按钮点击事件
+ btnUpload.setOnClickListener(v -> {
+ if (hasSignature) {
+ uploadSignature();
+ } else {
+ XToastUtils.error("请先完成签名");
+ }
+ });
+
+ // 检查是否有已保存的签名
+ checkExistingSignature();
+ }
+
+ private void checkExistingSignature() {
+ File signatureFile = new File(signaturePath + signatureName);
+ if (signatureFile.exists()) {
+ loadSignatureImage(signatureFile.getAbsolutePath());
+ hasSignature = true;
+ }
+ }
+
+ private void showSignatureDialog() {
+ View view = LayoutInflater.from(getActivity()).inflate(R.layout.activity_sign_aotograp, null);
+ AlertDialog dialog = new AlertDialog.Builder(getActivity()).create();
+ SignatureView signatureView = view.findViewById(R.id.signature);
+
+ // 确保签名目录存在
+ File dir = new File(signaturePath);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+
+ // 自动清除签名板
+ view.post(signatureView::clear);
+
+ // 设置按钮点击事件
+ view.findViewById(R.id.clear).setOnClickListener(v -> signatureView.clear());
+ view.findViewById(R.id.next_btn).setOnClickListener(v -> saveSignature(signatureView, dialog));
+
+ dialog.setView(view);
+ dialog.show();
+ }
+
+ private void saveSignature(SignatureView signatureView, AlertDialog dialog) {
+ if (!signatureView.getSigstatus()) {
+ XToastUtils.error("请在签名区域填写签名!");
+ return;
+ }
+
+ String path = signaturePath + signatureName;
+ try {
+ if (signatureView.save(path)) {
+ signatureView.clear();
+ XToastUtils.success("签名保存成功");
+ loadSignatureImage(path);
+ hasSignature = true;
+ dialog.dismiss();
+ } else {
+ dialog.dismiss();
+ XToastUtils.error("签名保存失败");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ XToastUtils.error("保存出错: " + e.getMessage());
+ }
+ }
+
+ private void loadSignatureImage(String path) {
+ if (path.startsWith("http")) {
+ GlideUtil.GlideWithPlaceHolder(getActivity(), path).into(signatureImage);
+ } else {
+ Bitmap bitmap = BitmapFactory.decodeFile(path);
+ if (bitmap != null) {
+ signatureImage.setImageBitmap(bitmap);
+ } else {
+ signatureImage.setImageResource(R.drawable.add_ic);
+ }
+ }
+ }
+
+ /**
+ * 上传
+ */
+ private void uploadSignature() {
+ try {
+ String uploadUrl = WorkConfig.getGzramaUrl() + "personAtt/transferAutograph";
+ if ("".equals(key)){
+ XToastUtils.warning("请先扫描二维码获取信息");
+ return;
+ }
+ if (hasSignature) {
+ File signatureFile = new File(signaturePath + signatureName);
+ if (signatureFile.exists()) {
+ XToastUtils.success("开始上传签名...");
+ // 这里添加实际上传代码
+ String url = uploadFileNew(signaturePath+signatureName,"grap");
+ System.err.println("签名地址:"+url);
+ if (!"".equals(url)){
+ FormBody body = new FormBody.Builder()
+ .add("key",strIsEmty(key,1))
+ .add("value1",strIsEmty(url,1))
+ .build();
+ String result = service.httpPost(uploadUrl,body);
+ System.out.println(result);
+ if(!StringHelper.isEmptyAndNull(result)){
+ org.json.JSONObject jsonObject = new org.json.JSONObject(result);
+ int res = jsonObject.getInt("res");
+ if (res == 1){
+ XToastUtils.success("上传成功");
+ popToBack();
+ } else {
+ XToastUtils.error("上传失败,请重试");
+ }
+ }
+ } else {
+ XToastUtils.error("签名上传失败,请重试");
+ }
+ } else {
+ XToastUtils.error("签名文件不存在");
+ hasSignature = false;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ XToastUtils.error("上传失败,请重试");
+ }
+
+ }
+
+ private void checkCameraPermission() {
+ if (ContextCompat.checkSelfPermission(
+ requireContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
+ startQrScanner();
+ } else {
+ requestPermissions(new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ startQrScanner();
+ } else {
+ XToastUtils.error("需要相机权限才能扫描二维码");
+ }
+ }
+ }
+
+ private void startQrScanner() {
+ try {
+ IntentIntegrator integrator = IntentIntegrator.forSupportFragment(this)
+ .setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)
+ .setPrompt("将二维码放入框内扫描")
+ .setCameraId(0)
+ .setBeepEnabled(false)
+ .setBarcodeImageEnabled(false)
+ .setOrientationLocked(true)
+ .setCaptureActivity(CustomScannerActivity.class);
+ integrator.initiateScan();
+ } catch (Exception e) {
+ XToastUtils.error("启动扫描失败: " + e.getMessage());
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
+ if (result != null) {
+ if (result.getContents() == null) {
+ key="";
+ XToastUtils.info("扫描已取消");
+ } else {
+ key=result.getContents();
+ System.out.println("二维码内容:"+key);
+ XToastUtils.success("获取成功");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/bonus/gzvis/app/util/AppPageConfig.java b/app/src/main/java/com/bonus/gzvis/app/util/AppPageConfig.java
index 246670a..441b46b 100644
--- a/app/src/main/java/com/bonus/gzvis/app/util/AppPageConfig.java
+++ b/app/src/main/java/com/bonus/gzvis/app/util/AppPageConfig.java
@@ -100,6 +100,7 @@ public class AppPageConfig {
FaceComponents.add(new PageInfo("考勤打卡", "", "attendance", CoreAnim.slide, 2));
FaceComponents.add(new PageInfo("考勤统计", "", "attendance_statistics", CoreAnim.slide, 2));
FaceComponents.add(new PageInfo("上班与休息", "", "rest", CoreAnim.slide, 2));
+ FaceComponents.add(new PageInfo("扫码签名", "", "rest", CoreAnim.slide, 2));
} else {
//首页
mComponents.add(new PageInfo("分包商入场", "", "ein_sub", CoreAnim.slide, 2));
@@ -146,6 +147,7 @@ public class AppPageConfig {
FaceComponents.add(new PageInfo("考勤打卡", "", "attendance", CoreAnim.slide, 2));
FaceComponents.add(new PageInfo("考勤统计", "", "attendance_statistics", CoreAnim.slide, 2));
FaceComponents.add(new PageInfo("上班与休息", "", "rest", CoreAnim.slide, 2));
+ FaceComponents.add(new PageInfo("扫码签名", "", "rest", CoreAnim.slide, 2));
} else {
//首页
mComponents.add(new PageInfo("分包商入场", "", "ein_sub", CoreAnim.slide, 2));
diff --git a/app/src/main/java/com/bonus/gzvis/app/util/CustomScannerActivity.java b/app/src/main/java/com/bonus/gzvis/app/util/CustomScannerActivity.java
new file mode 100644
index 0000000..b3a6f0a
--- /dev/null
+++ b/app/src/main/java/com/bonus/gzvis/app/util/CustomScannerActivity.java
@@ -0,0 +1,45 @@
+package com.bonus.gzvis.app.util;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.google.zxing.client.android.Intents;
+import com.journeyapps.barcodescanner.DecoratedBarcodeView;
+
+import org.easydarwin.easypusher.R;
+
+public class CustomScannerActivity extends AppCompatActivity {
+ private DecoratedBarcodeView barcodeView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_custom_scanner);
+ // 强制竖屏
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+
+ barcodeView = findViewById(R.id.zxing_barcode_scanner);
+ barcodeView.initializeFromIntent(getIntent());
+ barcodeView.decodeSingle(result -> {
+ Intent resultIntent = new Intent();
+ resultIntent.putExtra(Intents.Scan.RESULT, result.getText());
+ setResult(RESULT_OK, resultIntent);
+ finish();
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ barcodeView.resume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ barcodeView.pause();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/scan.png b/app/src/main/res/drawable/scan.png
new file mode 100644
index 0000000..a7944f3
Binary files /dev/null and b/app/src/main/res/drawable/scan.png differ
diff --git a/app/src/main/res/layout/activity_custom_scanner.xml b/app/src/main/res/layout/activity_custom_scanner.xml
new file mode 100644
index 0000000..27a6bd0
--- /dev/null
+++ b/app/src/main/res/layout/activity_custom_scanner.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_scan.xml b/app/src/main/res/layout/activity_scan.xml
new file mode 100644
index 0000000..98eed97
--- /dev/null
+++ b/app/src/main/res/layout/activity_scan.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file