设备信息
设备ID(DeviceId)
- 获取办法
android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String deviceId = tm.getDeviceId();
- 当设备为手机时,返回设备的唯一ID。手机制式为 GSM 时,返回手机的 IMEI 。手机制式为 CDMA 时,返回手机的 MEID 或 ESN 。
- 非电话设备或者 Device ID 不可用时,返回 null .
- 属于比较稳定的设备标识符。
- 需要
READ_PHONE_STATE
权限。 (Android 6.0 以上需要用户手动赋予该权限)。 - 某些设备上该方法存在 Bug ,返回的结果可能是一串0或者一串*号。
Sim 序列号(Sim Serial Number)
- 获取办法:
android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String simSerialNum = tm.getSimSerialNumber();
- 不同 Sim 卡的序列号不同.
- Sim 卡序列号,当手机上装有 Sim 卡并且可用时,返回该值。手机未装 Sim 卡或者不可用时,返回
null
. - 需要
READ_PHONE_STATE
权限。 (Android 6.0 以上需要用户手动赋予该权限)
IMEI号
/** * 获取IMEI * @param context * @return */ @SuppressLint("MissingPermission") public static String getIMEI(Context context){ TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return telephonyManager.getImei(); } return "unkown"; }
Mac 地址(Mac Address)
- 获取办法:
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) context.getSystemService(Context.WIFI_SERVICE);
String macAddress = wifi.getConnectionInfo().getMacAddress();
- 没有 WiFi 硬件或者 WiFi 不可用的设备可能返回 null 或空,注意判空.
- 比较稳定的硬件标识符。
- 需要
ACCESS_WIFI_STATE
权限。 - Android 6.0开始,谷歌为保护用户数据,用此方法获取到的 Wi-Fi mac 地址都为
02:00:00:00:00:00
(更多信息查看此处) - 如果 app 在装有谷歌框架的设备中读取了mac地址,会被谷歌检测为有害应用提示用户卸载。这也是为什么像友盟、TalkingData 等数据统计 sdk 提供商专门针对 Google Play 提供特供版的 sdk.
![](http://upload-images.jianshu.io/upload_images/610932-1d4a4f36d17be274.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000)
读取 mac 地址导致 app 被谷歌框架判定为有害应用
设备序列号(Serial Number, SN)
- 获取办法:
String serialNum = android.os.Build.SERIAL;
- 比较稳定的设备硬件标识符,在上一篇文章中谷歌也未提到有啥缺点。
ANDROID_ID
- 获取办法:
String androidId = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
- 在设备第一次启动的时候生成并保存,并且可能会在恢复出厂设置后重置该值。理论上是大部分是重置的。(API 中原话是:The value
may
change if a factory reset is performed on the device.) - 在 Android 2.2 中不可靠.
- 部分设备由于制造商错误实现,导致会返回相同的 Android_ID.
- 在 Android 4.2 及以上, 设备启用多用户功能后,每个用户的 Android_ID 不相同.
制造商 (Manufacturer)
- 获取办法:
String manufacturer = android.os.Build.MANUFACTURER;
型号(Model)
- 获取办法:
String model = android.os.Build.MODEL;
品牌(Brand)
- 获取办法:
String brand = android.os.Build.BRAND;
设备名 (Device)
- 获取办法:
String device = android.os.Build.DEVICE;
获取设备Android版本并判断
- 获取办法(判断当前版本是否大于等于19 API):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {...}
获取设备系统版本号
/** * 获取手机设备版本 * @return */ public static String getPhoneVersion(){ return Build.VERSION.RELEASE; }
获取设备系统版本名称
android.os.Build.DISPLAY;
App信息
获取App版本号
int versionCode = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(),0).versionCode; //API 28之前的方法 long vresion = getPackageManager().getPackageInfo(getPackageName(), 0).getLongVersionCode(); // Android API 28 Platform 在API 28后新的方法
获取App版本号名称
String verName = context.getPackageManager().getPackageInfo(context.getPackageName(),0).versionName;
获取App名称
PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(),0); int labelRes = packageInfo.applicationInfo.labelRes; String name = context.getResources().getString(labelRes);
获取app包名
PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); String pkName = packageInfo.packageName;
获取未安装的APP图标、版本号、包名
获取app图标
public static Drawable getApkIcon(Context context, String apkPath) { PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES); if (info != null) { ApplicationInfo appInfo = info.applicationInfo; appInfo.sourceDir = apkPath; appInfo.publicSourceDir = apkPath; try { return appInfo.loadIcon(pm); } catch (OutOfMemoryError e) { Log.e("ApkIconLoader", e.toString()); } } return null; }
获取app名称
String label = appInfo.loadLabel(mPackManager).toString();
获取app包名
String packageName = appInfo.packageName;
获取app VersionCode版本号
API 28之前
int appVersionCode = info.versionCode;
API 28之后
long appVersionCode = info.getLongVersionCode();
获取app VersionName版本名称
String appVersionName = info.versionName;
判断app是否安装
private boolean isApkInstalled(String packagename) { PackageManager localPackageManager = getPackageManager(); try { PackageInfo localPackageInfo = localPackageManager.getPackageInfo(packagename, PackageManager.GET_UNINSTALLED_PACKAGES); return true; } catch (PackageManager.NameNotFoundException localNameNotFoundException) { return false; } }
安装app
private void installAPK(String apkPath) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse("file://" + apkPath), "application/vnd.android.package-archive"); mContext.startActivity(intent); }