zoukankan      html  css  js  c++  java
  • Android 开发 获取设备信息与App信息

    设备信息

    设备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.
    读取 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);
             }

     

  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/9890132.html
Copyright © 2011-2022 走看看