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