feat: 获取sn
This commit is contained in:
@@ -4,6 +4,15 @@
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
|
||||
<!-- Android 8.0+ 需要 -->
|
||||
<uses-permission
|
||||
android:name="android.permission.READ_PHONE_STATE"
|
||||
android:maxSdkVersion="28" /> <!-- 29+ 加了也没用,可限制住 -->
|
||||
|
||||
<!-- 如果你只跑在定制系统/有特权,用这个 -->
|
||||
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
|
||||
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.ttstd.control.ControlMessage;
|
||||
import com.ttstd.controller.signaling.SignalMessage;
|
||||
import com.ttstd.controller.signaling.WebSocketClient;
|
||||
import com.ttstd.controller.view.RemoteTouchView;
|
||||
import com.ttstd.controller.utils.DeviceUtils;
|
||||
import com.ttstd.controller.webrtc.WebRtcClient;
|
||||
|
||||
import org.webrtc.EglBase;
|
||||
@@ -29,7 +30,6 @@ import org.webrtc.RendererCommon;
|
||||
import org.webrtc.SurfaceViewRenderer;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.UUID;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
|
||||
@@ -92,8 +92,8 @@ public class MainActivity extends AppCompatActivity {
|
||||
|
||||
// 默认服务器地址
|
||||
etServerUrl.setText("ws://175.178.213.60:8088/ws/signal");
|
||||
// 生成设备ID
|
||||
myDeviceId = "controller_" + UUID.randomUUID().toString().substring(0, 8);
|
||||
// 生成设备ID(非系统签名,使用兜底方案获取设备标识)
|
||||
myDeviceId = DeviceUtils.getSerialNumber(this);
|
||||
etDeviceId.setText(myDeviceId);
|
||||
|
||||
btnConnect.setOnClickListener(v -> connectToControlled());
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
package com.ttstd.controller.utils;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* 设备信息工具类(控制端,非系统签名应用)
|
||||
* <p>
|
||||
* 与 WebRTCControlled 的 DeviceUtils 对应,但控制端没有系统签名,
|
||||
* 因此无法稳定获取真实的硬件序列号,这里采用「不要求准确」的兜底方案:
|
||||
* 1. 先尝试 Build.getSerial() / Build.SERIAL(Android 10+ 普通应用通常失败);
|
||||
* 2. 失败则使用官方提供的 Android ID;
|
||||
* 3. 再失败则基于硬件机型信息生成 UUID。
|
||||
*/
|
||||
public class DeviceUtils {
|
||||
|
||||
/**
|
||||
* 获取设备标识(适用于普通应用)
|
||||
* <p>
|
||||
* 做了 Android 版本兼容。如果无法获取硬件序列号(如 Android 10+),
|
||||
* 则尝试使用 Android ID。如果 Android ID 也获取不到,则通过硬件信息生成 UUID。
|
||||
*
|
||||
* @param context 上下文
|
||||
* @return 设备唯一标识
|
||||
*/
|
||||
@SuppressLint({"MissingPermission", "HardwareIds"})
|
||||
public static String getSerialNumber(Context context) {
|
||||
String serial = null;
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// 尝试通过 getSerial 获取,Android 10+ 普通应用通常会抛异常或返回 unknown
|
||||
serial = Build.getSerial();
|
||||
} else {
|
||||
serial = Build.SERIAL;
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
|
||||
// 校验序列号是否有效
|
||||
if (!TextUtils.isEmpty(serial) && !Build.UNKNOWN.equalsIgnoreCase(serial)) {
|
||||
return serial;
|
||||
}
|
||||
|
||||
// 尝试获取 Android ID(官方提供的设备标识,无需特殊权限)
|
||||
String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
|
||||
// 排除某些设备上已知的错误 Android ID ("9774d56d682e549c")
|
||||
if (!TextUtils.isEmpty(androidId) && !"9774d56d682e549c".equals(androidId)) {
|
||||
return androidId;
|
||||
}
|
||||
|
||||
// 如果上述方式都失败,则根据硬件机型信息生成 UUID
|
||||
return getDeviceUuid();
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用硬件机型信息生成 UUID
|
||||
* 这种方案在设备重启或刷机后通常能保持稳定,但在系统升级导致某些 Build 字段变化时可能会变。
|
||||
*/
|
||||
private static String getDeviceUuid() {
|
||||
String devInfo = "35" + // 模拟 IMEI 的前缀
|
||||
Build.BOARD.length() % 10 +
|
||||
Build.BRAND.length() % 10 +
|
||||
Build.SUPPORTED_ABIS[0].length() % 10 +
|
||||
Build.DEVICE.length() % 10 +
|
||||
Build.DISPLAY.length() % 10 +
|
||||
Build.HOST.length() % 10 +
|
||||
Build.ID.length() % 10 +
|
||||
Build.MANUFACTURER.length() % 10 +
|
||||
Build.MODEL.length() % 10 +
|
||||
Build.PRODUCT.length() % 10 +
|
||||
Build.TAGS.length() % 10 +
|
||||
Build.TYPE.length() % 10 +
|
||||
Build.USER.length() % 10;
|
||||
|
||||
// 使用 Build.SERIAL 参与 hash,增加独特性(即使它是 "unknown" 也是一种标识)
|
||||
return new UUID(devInfo.hashCode(), Build.SERIAL.hashCode()).toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user