Android获取设备和应用信息
jopen
10年前
本文将介绍如何获取当前设备和应用基本信息!
创建一个android应用(AndroidTest),所需权限如下(AndroidManifest.xml文件):
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
接下来是MainActivity.java文件:
package com.example.androidtest; import org.json.JSONException; import org.json.JSONObject; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.provider.Settings.Secure; import android.app.Activity; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.gsm.GsmCellLocation; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getInfo(); } public void getInfo() { try { StringBuilder strLog = new StringBuilder(); Context ctx = this.getApplicationContext(); /** * 1.获取应用信息 * * 要想获取更多应用相关信息请查阅PackageManager、ApplicationInfo资料 */ // 获取应用名称 String appName = getAppName(ctx); strLog.append("应用名称:" + appName + "\r\n"); // 获取应用包名称 String packName = getPackName(ctx); strLog.append("应用包名称:" + packName + "\r\n"); // 获取应用版本 String verName = getVerName(ctx, packName); strLog.append("应用版本名称:" + verName + "\r\n"); // 获取应用版本号 int verCode = getVerCode(ctx, packName); strLog.append("应用版本号:" + verCode + "\r\n"); /** * 2.获取设备信息 */ // 获取手机型号 String model = getPhoneModel(); strLog.append("手机型号:" + model + "\r\n"); // 获取手机号码 String phoneNum = getLineNum(ctx); strLog.append("手机号码:" + phoneNum + "\r\n"); // 获取移动用户标志,IMSI String imsi = getSubscriberId(ctx); strLog.append("IMSI:" + imsi + "\r\n"); // 获取设备ID String devID = getDeviceID(ctx); strLog.append("设备ID:" + devID + "\r\n"); // 获取SIM卡号 String sim = getSim(ctx); strLog.append("SIM卡号:" + sim + "\r\n"); // 获取基站信息 SCell cellInfo = getCellInfo(ctx); String strCell = ""; if (cellInfo != null) { strCell = cellInfo.toJSON().toString(); } strLog.append("基站信息:" + strCell + "\r\n"); // 获取Mac地址 String mac = getMac(ctx); strLog.append("Mac地址:" + mac + "\r\n"); System.out.println(strLog.toString()); } catch (Exception e) { e.printStackTrace(); } } /** * 获取应用包名称 */ public String getPackName(Context ctx) { return ctx.getPackageName(); } /** * 获取应用版本名称 */ public String getVerName(Context ctx, String packName) { String verName = ""; try { verName = ctx.getPackageManager().getPackageInfo(packName, 0).versionName; } catch (NameNotFoundException e) { } return verName; } /** * 获取应用版本号 */ public int getVerCode(Context context, String packName) { int versionCode = 0; try { versionCode = context.getPackageManager().getPackageInfo(packName, 0).versionCode; } catch (NameNotFoundException e) { } return versionCode; } /** * 获取应用名称 */ public String getAppName(Context ctx) { String appName = ""; try { PackageManager packManager = ctx.getPackageManager(); ApplicationInfo appInfo = ctx.getApplicationInfo(); appName = (String) packManager.getApplicationLabel(appInfo); } catch (Exception e) { } return appName; } /** * 获取手机型号 * * android.os.Build提供以下信息: * String BOARD The name of the underlying board, like "goldfish". * String BRAND The brand (e.g., carrier) the software is customized for, if any. * String DEVICE The name of the industrial design. * String FINGERPRINT A string that uniquely identifies this build. * String HOST * String ID Either a changelist number, or a label like "M4-rc20". * String MODEL The end-user-visible name for the end product. * String PRODUCT The name of the overall product. * String TAGS Comma-separated tags describing the build, like "unsigned,debug". * long TIME * String TYPE The type of build, like "user" or "eng". * String USER */ public String getPhoneModel() { return android.os.Build.MODEL; } /** * 获取手机号码,一般获取不到 * * 用到的权限: * <uses-permission android:name="android.permission.READ_PHONE_STATE" /> * * 要想获取更多电话、数据、移动网络相关信息请查阅TelephonyManager资料 */ public String getLineNum(Context ctx) { String strResult = ""; TelephonyManager telephonyManager = (TelephonyManager) ctx .getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { strResult = telephonyManager.getLine1Number(); } return strResult; } /** * 获取移动用户标志,IMSI * * 用到的权限: * <uses-permission android:name="android.permission.READ_PHONE_STATE" /> */ public String getSubscriberId(Context ctx) { String strResult = ""; TelephonyManager telephonyManager = (TelephonyManager) ctx .getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { strResult = telephonyManager.getSubscriberId(); } return strResult; } /** * 获取设备ID * * 用到的权限: * <uses-permission android:name="android.permission.READ_PHONE_STATE" /> */ public String getDeviceID(Context ctx) { String strResult = null; TelephonyManager telephonyManager = (TelephonyManager) ctx .getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { strResult = telephonyManager.getDeviceId(); } if (strResult == null) { strResult = Secure.getString(ctx.getContentResolver(), Secure.ANDROID_ID); } return strResult; } /** * 获取SIM卡号 * * 用到的权限: * <uses-permission android:name="android.permission.READ_PHONE_STATE" /> */ public String getSim(Context ctx) { String strResult = ""; TelephonyManager telephonyManager = (TelephonyManager) ctx .getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null) { strResult = telephonyManager.getSimSerialNumber(); } return strResult; } /** * 获取Wifi Mac地址 * * 要想获取更多Wifi相关信息请查阅WifiInfo资料 * * 用到的权限: * <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> */ public String getMac(Context ctx) { WifiManager wifiManager = (WifiManager) ctx .getSystemService(Context.WIFI_SERVICE); if (wifiManager != null) { WifiInfo wi = wifiManager.getConnectionInfo(); return wi.getMacAddress(); } return null; } /** * 获取基站信息 * * 用到的权限: * <uses-permission android:name="android.permission.READ_PHONE_STATE" /> * <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> */ public SCell getCellInfo(Context ctx) { SCell cell = new SCell(); TelephonyManager tm = null; try { tm = (TelephonyManager) ctx .getSystemService(Context.TELEPHONY_SERVICE); } catch (Exception e) { return null; } // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。 String IMSI = tm.getSubscriberId(); if (IMSI != null) { if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) { cell.NETWORK_TYPE = "CHINA MOBILE"; GsmCellLocation location = (GsmCellLocation) tm .getCellLocation(); if (location == null) { cell = null; } else { String operator = tm.getNetworkOperator(); if (operator.length() > 4) { int mcc = Integer.parseInt(operator.substring(0, 3)); int mnc = Integer.parseInt(operator.substring(3)); int cid = location.getCid(); int lac = location.getLac(); cell.MCC = mcc; cell.MNC = mnc; cell.LAC = lac; cell.CID = cid; } else { cell = null; } } } else if (IMSI.startsWith("46001")) { cell.NETWORK_TYPE = "CHINA UNICOM"; GsmCellLocation location = (GsmCellLocation) tm .getCellLocation(); if (location == null) { cell = null; } else { String operator = tm.getNetworkOperator(); if (operator.length() > 4) { int mcc = Integer.parseInt(operator.substring(0, 3)); int mnc = Integer.parseInt(operator.substring(3)); int cid = location.getCid(); int lac = location.getLac(); cell.MCC = mcc; cell.MNC = mnc; cell.LAC = lac; cell.CID = cid; } else { cell = null; } } } else if (IMSI.startsWith("46003")) { cell.NETWORK_TYPE = "CHINA TELECOM"; CdmaCellLocation location = (CdmaCellLocation) tm .getCellLocation(); if (location == null) { cell = null; } else { String operator = tm.getNetworkOperator(); if (operator.length() > 4) { int mcc = Integer.parseInt(operator.substring(0, 3)); int mnc = Integer.parseInt(operator.substring(3)); int cid = location.getBaseStationId(); int lac = location.getNetworkId(); cell.MCC = mcc; cell.MNC = mnc; cell.LAC = lac; cell.CID = cid; } else { cell = null; } } } else { // cell.NETWORK_TYPE = "UNDENTIFIED"; cell = null; } } else { cell = null; } return cell; } /** * 基站信息 */ class SCell { public String NETWORK_TYPE; public int MCC; public int MNC; public int LAC; public int CID; public JSONObject toJSON() throws JSONException { JSONObject json = new JSONObject(); json.put("network_type", NETWORK_TYPE); json.put("mcc", MCC); json.put("MNC", MNC); json.put("LAC", LAC); json.put("CID", CID); return json; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }