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 tcpdump(转)
    linux ping
    Dalvik VM和JVM 的比较
    Android应用开发基础之八:广播与服务(二)
    Android应用开发基础之七:广播与服务(一)
    Android应用开发基础之五:网络编程(二)
    Android应用开发基础之三:数据存储和界面展现(三)
    Android应用开发基础之二:数据存储和界面展现(二)
    Android应用开发基础之一:数据存储和界面展现(一)
    Android之Fragment 基本介绍(转)
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/9890132.html
Copyright © 2011-2022 走看看