From 58fc5cf7a3eeb49d7ac92f4c1d07f941d0d665d9 Mon Sep 17 00:00:00 2001 From: mxdabc Date: Mon, 13 Apr 2026 23:56:09 +0800 Subject: [PATCH] Upload Code --- README.md | 1 + app/build.gradle | 36 ++++++++ app/proguard-rules.pro | 2 + app/src/main/AndroidManifest.xml | 58 +++++++++++++ .../java/com/mxdyeah/tools/AdActivity.java | 85 +++++++++++++++++++ .../com/mxdyeah/tools/GenerateActivity.java | 73 ++++++++++++++++ .../java/com/mxdyeah/tools/MainActivity.java | 61 +++++++++++++ .../java/com/mxdyeah/tools/ScanActivity.java | 66 ++++++++++++++ .../res/drawable/ic_launcher_background.xml | 10 +++ app/src/main/res/layout/activity_ad.xml | 24 ++++++ app/src/main/res/layout/activity_generate.xml | 31 +++++++ app/src/main/res/layout/activity_main.xml | 52 ++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 ++ .../ic_launcher_foreground.xml | 28 ++++++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 ++ app/src/main/res/mipmap-hdpi/ic_launcher.xml | 28 ++++++ .../res/mipmap-hdpi/ic_launcher_round.xml | 28 ++++++ app/src/main/res/mipmap-mdpi/ic_launcher.xml | 28 ++++++ .../res/mipmap-mdpi/ic_launcher_round.xml | 28 ++++++ app/src/main/res/mipmap-xhdpi/ic_launcher.xml | 28 ++++++ .../res/mipmap-xhdpi/ic_launcher_round.xml | 28 ++++++ .../main/res/mipmap-xxhdpi/ic_launcher.xml | 28 ++++++ .../res/mipmap-xxhdpi/ic_launcher_round.xml | 28 ++++++ .../main/res/mipmap-xxxhdpi/ic_launcher.xml | 28 ++++++ .../res/mipmap-xxxhdpi/ic_launcher_round.xml | 28 ++++++ app/src/main/res/values/colors.xml | 10 +++ app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/themes.xml | 12 +++ build.gradle | 3 + gradle.properties | 4 + gradle/wrapper/gradle-wrapper.properties | 6 ++ local.properties | 8 ++ settings.gradle | 27 ++++++ 33 files changed, 891 insertions(+) create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/mxdyeah/tools/AdActivity.java create mode 100644 app/src/main/java/com/mxdyeah/tools/GenerateActivity.java create mode 100644 app/src/main/java/com/mxdyeah/tools/MainActivity.java create mode 100644 app/src/main/java/com/mxdyeah/tools/ScanActivity.java create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_ad.xml create mode 100644 app/src/main/res/layout/activity_generate.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_foreground.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 local.properties create mode 100644 settings.gradle diff --git a/README.md b/README.md index b410c0f..ea63069 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # Tools +Draft. diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..54b989c --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.mxdyeah.tools' + compileSdk 31 + + defaultConfig { + applicationId "com.mxdyeah.tools" + minSdk 21 + targetSdk 31 + versionCode 1 + versionName "1.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.journeyapps:zxing-android-embedded:4.3.0' + implementation 'com.google.zxing:core:3.5.3' + implementation 'com.google.android.gms:play-services-ads:20.6.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..3564070 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,2 @@ +-keep class com.google.android.gms.** { *; } +-keep class com.google.ads.** { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c3df1c8 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/mxdyeah/tools/AdActivity.java b/app/src/main/java/com/mxdyeah/tools/AdActivity.java new file mode 100644 index 0000000..d96a360 --- /dev/null +++ b/app/src/main/java/com/mxdyeah/tools/AdActivity.java @@ -0,0 +1,85 @@ +package com.mxdyeah.tools; + +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; +import android.widget.ProgressBar; +import androidx.appcompat.app.AppCompatActivity; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.AdView; +import com.google.android.gms.ads.MobileAds; +import com.google.android.gms.ads.initialization.InitializationStatus; +import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.LoadAdError; + +public class AdActivity extends AppCompatActivity { + + private WebView webView; + private ProgressBar progressBar; + private AdView adView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_ad); + + MobileAds.initialize(this, new OnInitializationCompleteListener() { + @Override + public void onInitializationComplete(InitializationStatus status) { + Log.d("AdActivity", "Mobile Ads initialized"); + } + }); + + webView = findViewById(R.id.webView); + progressBar = findViewById(R.id.progressBar); + + webView.setWebViewClient(new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) { + progressBar.setVisibility(View.GONE); + } + }); + + webView.getSettings().setJavaScriptEnabled(true); + webView.loadUrl("https://www.mxdyeah.com"); + + FrameLayout adContainer = findViewById(R.id.adContainer); + adView = new AdView(this); + //adView.setAdUnitId("ca-app-pub-7916126561134304/3815879702"); + //use google admob test id + adView.setAdUnitId("ca-app-pub-3940256099942544/6300978111"); + adView.setAdSize(AdSize.BANNER); + adContainer.addView(adView); + + AdRequest adRequest = new AdRequest.Builder().build(); + adView.loadAd(adRequest); + + adView.setAdListener(new AdListener() { + @Override + public void onAdLoaded() { + Log.d("AdMob", "Ad loaded"); + } + + @Override + public void onAdFailedToLoad(LoadAdError error) { + Log.e("AdMob", "Failed code: " + error.getCode()); + Log.e("AdMob", "Failed message: " + error.getMessage()); + Log.e("AdMob", "Full: " + error.toString()); + } + }); + } + + + @Override + protected void onDestroy() { + if (adView != null) { + adView.destroy(); + } + super.onDestroy(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mxdyeah/tools/GenerateActivity.java b/app/src/main/java/com/mxdyeah/tools/GenerateActivity.java new file mode 100644 index 0000000..cd62d6c --- /dev/null +++ b/app/src/main/java/com/mxdyeah/tools/GenerateActivity.java @@ -0,0 +1,73 @@ +package com.mxdyeah.tools; + +import android.graphics.Bitmap; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.common.BitMatrix; +import java.util.Hashtable; + +public class GenerateActivity extends AppCompatActivity { + + private EditText etContent; + private ImageView ivQRCode; + private Button btnGenerate; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_generate); + + etContent = findViewById(R.id.etContent); + ivQRCode = findViewById(R.id.ivQRCode); + btnGenerate = findViewById(R.id.btnGenerate); + + btnGenerate.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String content = etContent.getText().toString().trim(); + if (content.isEmpty()) { + Toast.makeText(GenerateActivity.this, "请输入内容", Toast.LENGTH_SHORT).show(); + return; + } + generateQRCode(content); + } + }); + } + + private void generateQRCode(String content) { + try { + Hashtable hints = new Hashtable<>(); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, 512, 512, hints); + + int width = bitMatrix.getWidth(); + int height = bitMatrix.getHeight(); + int[] pixels = new int[width * height]; + + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + pixels[offset + x] = bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF; + } + } + + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, width, 0, 0, width, height); + ivQRCode.setImageBitmap(bitmap); + + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(this, "生成失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mxdyeah/tools/MainActivity.java b/app/src/main/java/com/mxdyeah/tools/MainActivity.java new file mode 100644 index 0000000..04ef159 --- /dev/null +++ b/app/src/main/java/com/mxdyeah/tools/MainActivity.java @@ -0,0 +1,61 @@ +package com.mxdyeah.tools; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; + +import androidx.appcompat.app.AppCompatActivity; +import com.google.android.gms.ads.MobileAds; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdView; +import com.google.android.gms.ads.initialization.InitializationStatus; +import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; + +public class MainActivity extends AppCompatActivity { + + private AdView mAdView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + MobileAds.initialize(this, new OnInitializationCompleteListener() { + @Override + public void onInitializationComplete(InitializationStatus status) { + Log.d("MainActivity", "Mobile Ads initialized"); + } + }); + + mAdView = findViewById(R.id.adView); + AdRequest adRequest = new AdRequest.Builder().build(); + mAdView.loadAd(adRequest); + + Button btnGenerate = findViewById(R.id.btnGenerate); + Button btnScan = findViewById(R.id.btnScan); + Button btnAd = findViewById(R.id.btnAd); + + btnGenerate.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, GenerateActivity.class)); + } + }); + + btnScan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, ScanActivity.class)); + } + }); + + btnAd.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(MainActivity.this, AdActivity.class)); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mxdyeah/tools/ScanActivity.java b/app/src/main/java/com/mxdyeah/tools/ScanActivity.java new file mode 100644 index 0000000..8bea14f --- /dev/null +++ b/app/src/main/java/com/mxdyeah/tools/ScanActivity.java @@ -0,0 +1,66 @@ +package com.mxdyeah.tools; + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; + +public class ScanActivity extends AppCompatActivity { + + private static final int REQUEST_CAMERA_PERMISSION = 100; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); + } else { + startScan(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQUEST_CAMERA_PERMISSION) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + startScan(); + } else { + Toast.makeText(this, "需要相机权限才能扫描", Toast.LENGTH_SHORT).show(); + finish(); + } + } + } + + private void startScan() { + IntentIntegrator integrator = new IntentIntegrator(this); + integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE); + integrator.setPrompt("扫描二维码"); + integrator.setCameraId(0); + integrator.setBeepEnabled(true); + integrator.setBarcodeImageEnabled(true); + integrator.initiateScan(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); + if (result != null) { + if (result.getContents() != null) { + Toast.makeText(this, "扫描结果: " + result.getContents(), Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(this, "取消扫描", Toast.LENGTH_SHORT).show(); + } + } + super.onActivityResult(requestCode, resultCode, data); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca5e045 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ad.xml b/app/src/main/res/layout/activity_ad.xml new file mode 100644 index 0000000..d04d8c7 --- /dev/null +++ b/app/src/main/res/layout/activity_ad.xml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_generate.xml b/app/src/main/res/layout/activity_generate.xml new file mode 100644 index 0000000..27b86ca --- /dev/null +++ b/app/src/main/res/layout/activity_generate.xml @@ -0,0 +1,31 @@ + + + + + +