├── .github └── workflows │ └── android.yml ├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── build │ └── outputs │ │ └── apk │ │ └── debug │ │ └── app-debug.apk ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── copy │ │ └── copy_device_info │ │ └── GetDeviceInfoActivity.java │ └── res │ ├── drawable │ ├── ic_launcher_background.xml │ └── ic_launcher_foreground.xml │ ├── layout │ ├── activity_main.xml │ ├── fragment_first.xml │ └── fragment_second.xml │ ├── menu │ └── menu_main.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values-land │ └── dimens.xml │ ├── values-night │ └── themes.xml │ ├── values-v23 │ └── themes.xml │ ├── values-w1240dp │ └── dimens.xml │ ├── values-w600dp │ └── dimens.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ ├── backup_rules.xml │ └── data_extraction_rules.xml ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | paths-ignore: 7 | - README.md 8 | - .gitignore 9 | - LICENSE 10 | pull_request: 11 | branches: [ "main" ] 12 | paths-ignore: 13 | - README.md 14 | - .gitignore 15 | - LICENSE 16 | workflow_dispatch: 17 | 18 | jobs: 19 | build: 20 | runs-on: ubuntu-latest 21 | 22 | steps: 23 | - uses: actions/checkout@v3 24 | - name: set up JDK 17 25 | uses: actions/setup-java@v3 26 | with: 27 | java-version: '17' 28 | distribution: 'temurin' 29 | cache: gradle 30 | 31 | - name: Grant execute permission for gradlew 32 | run: chmod +x gradlew 33 | 34 | - name: Build with Gradle 35 | run: ./gradlew build 36 | 37 | - name: Upload artifact 38 | uses: actions/upload-artifact@v3 39 | with: 40 | name: get-device.apk 41 | path: app/build/outputs/apk/debug/app-debug.apk 42 | 43 | - name: Checkout branch 44 | uses: actions/checkout@v2 45 | with: 46 | ref: main 47 | 48 | - name: Download artifact 49 | uses: actions/download-artifact@v2 50 | with: 51 | name: get-device.apk 52 | path: app/build/outputs/apk/debug 53 | 54 | - name: Commit changes 55 | uses: EndBug/add-and-commit@v9 56 | with: 57 | author_name: github-actions[bot] 58 | author_email: github-actions[bot]@users.noreply.github.com 59 | pathspec_error_handling: ignore 60 | message: ':wrench: 自动上传app' 61 | add: app/build/outputs/apk/debug/app-debug.apk --force 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Gradle files 2 | .gradle/ 3 | build/ 4 | 5 | # Local configuration file (sdk path, etc) 6 | local.properties 7 | 8 | # Log/OS Files 9 | *.log 10 | 11 | # Android Studio generated files and folders 12 | captures/ 13 | .externalNativeBuild/ 14 | .cxx/ 15 | *.apk 16 | output.json 17 | 18 | # IntelliJ 19 | *.iml 20 | .idea/ 21 | misc.xml 22 | deploymentTargetDropDown.xml 23 | render.experimental.xml 24 | 25 | # Keystore files 26 | *.jks 27 | *.keystore 28 | 29 | # Google Services (e.g. APIs or Firebase) 30 | google-services.json 31 | 32 | # Android Profiling 33 | *.hprof 34 | 35 | # vscode 36 | .vscode/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 forchannot 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # get_device_info 2 | 3 | 用于获取设备一些基本信息。 4 | 5 | 你可以到[action](https://github.com/forchannot/get_device_info/actions)的`Artifacts`中找到最新能下载的,需登录。(注意action下载下来为zip,需要解压才能安装) 6 | 7 | 或者点击以下链接下载最新[download](https://ghproxy.mihomo.me/https://raw.githubusercontent.com/forchannot/get_device_info/main/app/build/outputs/apk/debug/app-debug.apk) 8 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | } 4 | 5 | android { 6 | namespace = "com.copy.copy_device_info" 7 | compileSdk = 32 8 | 9 | defaultConfig { 10 | applicationId = "com.copy.copy_device_info" 11 | minSdk = 24 12 | targetSdk = 32 13 | versionCode = 120 14 | versionName = "1.2" 15 | 16 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | isMinifyEnabled = false 22 | proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") 23 | } 24 | } 25 | compileOptions { 26 | sourceCompatibility = JavaVersion.VERSION_1_8 27 | targetCompatibility = JavaVersion.VERSION_1_8 28 | } 29 | buildFeatures { 30 | viewBinding = true 31 | } 32 | } 33 | 34 | dependencies { 35 | implementation("androidx.appcompat:appcompat:1.5.1") 36 | implementation("com.google.android.material:material:1.8.0") 37 | implementation("androidx.constraintlayout:constraintlayout:2.1.4") 38 | implementation("com.google.code.gson:gson:2.10.1") 39 | implementation("com.github.gzu-liyujiang:Android_CN_OAID:4.2.9") 40 | } 41 | -------------------------------------------------------------------------------- /app/build/outputs/apk/debug/app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/forchannot/get_device_info/2e3a03e7482db53b58f9b8ae86e1dd4568c74c1c/app/build/outputs/apk/debug/app-debug.apk -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 15 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/copy/copy_device_info/GetDeviceInfoActivity.java: -------------------------------------------------------------------------------- 1 | package com.copy.copy_device_info; 2 | 3 | import android.content.ClipData; 4 | import android.content.ClipboardManager; 5 | import android.content.Context; 6 | import android.os.Build; 7 | import android.os.Bundle; 8 | import android.widget.Button; 9 | import android.widget.Toast; 10 | 11 | import androidx.activity.result.ActivityResultCallback; 12 | import androidx.appcompat.app.AlertDialog; 13 | import androidx.appcompat.app.AppCompatActivity; 14 | 15 | import com.github.gzuliyujiang.oaid.DeviceID; 16 | import com.github.gzuliyujiang.oaid.DeviceIdentifier; 17 | import com.github.gzuliyujiang.oaid.IGetter; 18 | import com.google.gson.JsonObject; 19 | 20 | public class GetDeviceInfoActivity extends AppCompatActivity 21 | implements ActivityResultCallback { 22 | JsonObject json = new JsonObject(); 23 | int random = (int) ((Math.random() * 9 + 1) * 100000); 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_main); 29 | Button myButton = findViewById(R.id.myButton); 30 | myButton.setOnClickListener(v -> obtainDeviceId()); 31 | } 32 | 33 | @Override 34 | public void onActivityResult(Boolean result) { 35 | obtainDeviceId(); 36 | } 37 | 38 | private void obtainDeviceId() { 39 | String model = Build.MODEL; 40 | String version = Build.VERSION.RELEASE; 41 | String fingerprint = Build.FINGERPRINT; 42 | String device = Build.DEVICE; 43 | String board = Build.BOARD; 44 | String product = Build.PRODUCT; 45 | json.addProperty("deviceModel", model); 46 | json.addProperty("androidVersion", version); 47 | json.addProperty("deviceFingerprint", fingerprint); 48 | json.addProperty("deviceName", device); 49 | json.addProperty("deviceBoard", board); 50 | json.addProperty("deviceProduct", product); 51 | AlertDialog.Builder builder = new AlertDialog.Builder(GetDeviceInfoActivity.this); 52 | DeviceIdentifier.getOAID(this); 53 | // 获取OAID/AAID,异步回调 54 | builder.setTitle("设备信息"); 55 | DeviceID.getOAID( 56 | this, 57 | new IGetter() { 58 | @Override 59 | public void onOAIDGetComplete(String result) { 60 | handleResult(result); 61 | } 62 | 63 | @Override 64 | public void onOAIDGetError(Exception error) { 65 | handleResult("error_" + random); 66 | } 67 | 68 | private void handleResult(String oaidResult) { 69 | String message = 70 | String.format( 71 | "设备型号:%s\n系统版本:%s\n设备指纹:%s\n设备名:%s\n主板名:%s\n产品名:%s\nOAID:%s" + 72 | "\n温馨提示:如果OAID显示为error_******,请允许本应用获取虚拟身份ID,并稍等一会再重新点开此对话框,若仍为error,则代表你手机无法获取oaid", 73 | model, 74 | version, 75 | fingerprint, 76 | device, 77 | board, 78 | product, 79 | oaidResult); 80 | json.addProperty("oaid", oaidResult); 81 | builder.setMessage(message) 82 | .setPositiveButton("点击复制", (dialog, which) -> copyToClipboard()) 83 | .show(); 84 | } 85 | 86 | private void copyToClipboard() { 87 | ClipboardManager clipboard = 88 | (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); 89 | ClipData clip = ClipData.newPlainText("deviceInfo", json.toString()); 90 | if (clipboard != null) { 91 | clipboard.setPrimaryClip(clip); 92 | Toast.makeText( 93 | GetDeviceInfoActivity.this, 94 | "信息已复制到剪贴板", 95 | Toast.LENGTH_SHORT) 96 | .show(); 97 | } 98 | } 99 | }); 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |