Cómo detectar información del sistema como el sistema operativo o el tipo de dispositivo

Lo más importante que quiero saber es el tipo de dispositivo, la versión del sistema operativo, si tiene un teclado de hardware y tal vez la resolución de la pantalla. pero si conoce otra información de depuración útil, agréguela 🙂

Encontré esto para la versión del sistema operativo:

string += "OS Version: " + System.getProperty("os.version"); 

¿Cómo obtengo las otras propiedades?

editar: para obtener una descripción completa de los atributos útiles, los combiné todos juntos en mi actividad ErrorHandler (empiezo a leer en la línea 56): https://github.com/simon-heinen/SimpleUi/blob/master/SimpleUI/srcAndroid /simpleui/util/DeviceInformation.java#L56

Windowsize y la presencia de teclado fueron una buena idea, agregué algunas más informaciones para depuración:

 String s="Debug-infos:"; s += "\n OS Version: " + System.getProperty("os.version") + "(" + android.os.Build.VERSION.INCREMENTAL + ")"; s += "\n OS API Level: " + android.os.Build.VERSION.SDK_INT; s += "\n Device: " + android.os.Build.DEVICE; s += "\n Model (and Product): " + android.os.Build.MODEL + " ("+ android.os.Build.PRODUCT + ")"; 

Aquí está toda la información del dispositivo que es posible en Android usando a continuación la enumeración y la clase de utilidad

 public enum Device { DEVICE_TYPE, DEVICE_SYSTEM_NAME, DEVICE_VERSION, DEVICE_SYSTEM_VERSION, DEVICE_TOKEN, /** * */ DEVICE_NAME, DEVICE_UUID, DEVICE_MANUFACTURE, IPHONE_TYPE, /** * */ CONTACT_ID, DEVICE_LANGUAGE, DEVICE_TIME_ZONE, DEVICE_LOCAL_COUNTRY_CODE, /** * */ DEVICE_CURRENT_YEAR, DEVICE_CURRENT_DATE_TIME, DEVICE_CURRENT_DATE_TIME_ZERO_GMT, /** * */ DEVICE_HARDWARE_MODEL, DEVICE_NUMBER_OF_PROCESSORS, DEVICE_LOCALE, DEVICE_NETWORK, DEVICE_NETWORK_TYPE, /** * */ DEVICE_IP_ADDRESS_IPV4, DEVICE_IP_ADDRESS_IPV6, DEVICE_MAC_ADDRESS, DEVICE_TOTAL_CPU_USAGE, /** * */ DEVICE_TOTAL_MEMORY, DEVICE_FREE_MEMORY, DEVICE_USED_MEMORY, /** * */ DEVICE_TOTAL_CPU_USAGE_USER, DEVICE_TOTAL_CPU_USAGE_SYSTEM, /** * */ DEVICE_TOTAL_CPU_IDLE, DEVICE_IN_INCH; } 

-> Clase de utilidad:

  public class DeviceInfo { public static String getDeviceInfo(Context activity, Device device) { try { switch (device) { case DEVICE_LANGUAGE: return Locale.getDefault().getDisplayLanguage(); case DEVICE_TIME_ZONE: return TimeZone.getDefault().getID();//(false, TimeZone.SHORT); case DEVICE_LOCAL_COUNTRY_CODE: return activity.getResources().getConfiguration().locale.getCountry(); case DEVICE_CURRENT_YEAR: return "" + (Calendar.getInstance().get(Calendar.YEAR)); case DEVICE_CURRENT_DATE_TIME: Calendar calendarTime = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()); long time = (calendarTime.getTimeInMillis() / 1000); return String.valueOf(time); // return DateFormat.getDateTimeInstance().format(new Date()); case DEVICE_CURRENT_DATE_TIME_ZERO_GMT: Calendar calendarTime_zero = Calendar.getInstance(TimeZone.getTimeZone("GMT+0"), Locale.getDefault()); return String.valueOf((calendarTime_zero.getTimeInMillis() / 1000)); // DateFormat df = DateFormat.getDateTimeInstance(); // df.setTimeZone(TimeZone.getTimeZone("GMT+0")); // return df.format(new Date()); case DEVICE_HARDWARE_MODEL: return getDeviceName(); case DEVICE_NUMBER_OF_PROCESSORS: return Runtime.getRuntime().availableProcessors() + ""; case DEVICE_LOCALE: return Locale.getDefault().getISO3Country(); case DEVICE_IP_ADDRESS_IPV4: return getIPAddress(true); case DEVICE_IP_ADDRESS_IPV6: return getIPAddress(false); case DEVICE_MAC_ADDRESS: String mac = getMACAddress("wlan0"); if (TextUtils.isEmpty(mac)) { mac = getMACAddress("eth0"); } if (TextUtils.isEmpty(mac)) { mac = "DU:MM:YA:DD:RE:SS"; } return mac; case DEVICE_TOTAL_MEMORY: if (Build.VERSION.SDK_INT >= 16) return String.valueOf(getTotalMemory(activity)); case DEVICE_FREE_MEMORY: return String.valueOf(getFreeMemory(activity)); case DEVICE_USED_MEMORY: if (Build.VERSION.SDK_INT >= 16) { long freeMem = getTotalMemory(activity) - getFreeMemory(activity); return String.valueOf(freeMem); } return ""; case DEVICE_TOTAL_CPU_USAGE: int[] cpu = getCpuUsageStatistic(); if (cpu != null) { int total = cpu[0] + cpu[1] + cpu[2] + cpu[3]; return String.valueOf(total); } return ""; case DEVICE_TOTAL_CPU_USAGE_SYSTEM: int[] cpu_sys = getCpuUsageStatistic(); if (cpu_sys != null) { int total = cpu_sys[1]; return String.valueOf(total); } return ""; case DEVICE_TOTAL_CPU_USAGE_USER: int[] cpu_usage = getCpuUsageStatistic(); if (cpu_usage != null) { int total = cpu_usage[0]; return String.valueOf(total); } return ""; case DEVICE_MANUFACTURE: return android.os.Build.MANUFACTURER; case DEVICE_SYSTEM_VERSION: return String.valueOf(getDeviceName()); case DEVICE_VERSION: return String.valueOf(android.os.Build.VERSION.SDK_INT); case DEVICE_IN_INCH: return getDeviceInch(activity); case DEVICE_TOTAL_CPU_IDLE: int[] cpu_idle = getCpuUsageStatistic(); if (cpu_idle != null) { int total = cpu_idle[2]; return String.valueOf(total); } return ""; case DEVICE_NETWORK_TYPE: return getNetworkType(activity); case DEVICE_NETWORK: return checkNetworkStatus(activity); case DEVICE_TYPE: if (isTablet(activity)) { if (getDeviceMoreThan5Inch(activity)) { return "Tablet"; } else return "Mobile"; } else { return "Mobile"; } case DEVICE_SYSTEM_NAME: return "Android OS"; default: break; } } catch (Exception e) { e.printStackTrace(); } return ""; } public static String getDeviceId(Context context) { String device_uuid = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); if (device_uuid == null) { device_uuid = "12356789"; // for emulator testing } else { try { byte[] _data = device_uuid.getBytes(); MessageDigest _digest = java.security.MessageDigest.getInstance("MD5"); _digest.update(_data); _data = _digest.digest(); BigInteger _bi = new BigInteger(_data).abs(); device_uuid = _bi.toString(36); } catch (Exception e) { if (e != null) { e.printStackTrace(); } } } return device_uuid; } @SuppressLint("NewApi") private static long getTotalMemory(Context activity) { try { MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); long availableMegs = mi.totalMem / 1048576L; // in megabyte (mb) return availableMegs; } catch (Exception e) { e.printStackTrace(); return 0; } } private static long getFreeMemory(Context activity) { try { MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); long availableMegs = mi.availMem / 1048576L; // in megabyte (mb) return availableMegs; } catch (Exception e) { e.printStackTrace(); return 0; } } private static String getDeviceName() { String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; if (model.startsWith(manufacturer)) { return capitalize(model); } else { return capitalize(manufacturer) + " " + model; } } private static String capitalize(String s) { if (s == null || s.length() == 0) { return ""; } char first = s.charAt(0); if (Character.isUpperCase(first)) { return s; } else { return Character.toUpperCase(first) + s.substring(1); } } /** * Convert byte array to hex string * * @param bytes * @return */ private static String bytesToHex(byte[] bytes) { StringBuilder sbuf = new StringBuilder(); for (int idx = 0; idx < bytes.length; idx++) { int intVal = bytes[idx] & 0xff; if (intVal < 0x10) sbuf.append("0"); sbuf.append(Integer.toHexString(intVal).toUpperCase()); } return sbuf.toString(); } /** * Returns MAC address of the given interface name. * * @param interfaceName eth0, wlan0 or NULL=use first interface * @return mac address or empty string */ @SuppressLint("NewApi") private static String getMACAddress(String interfaceName) { try { List interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { if (interfaceName != null) { if (!intf.getName().equalsIgnoreCase(interfaceName)) continue; } byte[] mac = intf.getHardwareAddress(); if (mac == null) return ""; StringBuilder buf = new StringBuilder(); for (int idx = 0; idx < mac.length; idx++) buf.append(String.format("%02X:", mac[idx])); if (buf.length() > 0) buf.deleteCharAt(buf.length() - 1); return buf.toString(); } } catch (Exception ex) { return ""; } // for now eat exceptions return ""; /* * try { // this is so Linux hack return * loadFileAsString("/sys/class/net/" +interfaceName + * "/address").toUpperCase().trim(); } catch (IOException ex) { return * null; } */ } /** * Get IP address from first non-localhost interface * * @return address or empty string */ private static String getIPAddress(boolean useIPv4) { try { List interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { List addrs = Collections.list(intf.getInetAddresses()); for (InetAddress addr : addrs) { if (!addr.isLoopbackAddress()) { String sAddr = addr.getHostAddress().toUpperCase(); boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); if (useIPv4) { if (isIPv4) return sAddr; } else { if (!isIPv4) { int delim = sAddr.indexOf('%'); // drop ip6 port // suffix return delim < 0 ? sAddr : sAddr.substring(0, delim); } } } } } } catch (Exception ex) { } // for now eat exceptions return ""; } /* * * @return integer Array with 4 elements: user, system, idle and other cpu * usage in percentage. */ private static int[] getCpuUsageStatistic() { try { String tempString = executeTop(); tempString = tempString.replaceAll(",", ""); tempString = tempString.replaceAll("User", ""); tempString = tempString.replaceAll("System", ""); tempString = tempString.replaceAll("IOW", ""); tempString = tempString.replaceAll("IRQ", ""); tempString = tempString.replaceAll("%", ""); for (int i = 0; i < 10; i++) { tempString = tempString.replaceAll(" ", " "); } tempString = tempString.trim(); String[] myString = tempString.split(" "); int[] cpuUsageAsInt = new int[myString.length]; for (int i = 0; i < myString.length; i++) { myString[i] = myString[i].trim(); cpuUsageAsInt[i] = Integer.parseInt(myString[i]); } return cpuUsageAsInt; } catch (Exception e) { e.printStackTrace(); Log.e("executeTop", "error in getting cpu statics"); return null; } } private static String executeTop() { java.lang.Process p = null; BufferedReader in = null; String returnString = null; try { p = Runtime.getRuntime().exec("top -n 1"); in = new BufferedReader(new InputStreamReader(p.getInputStream())); while (returnString == null || returnString.contentEquals("")) { returnString = in.readLine(); } } catch (IOException e) { Log.e("executeTop", "error in getting first line of top"); e.printStackTrace(); } finally { try { in.close(); p.destroy(); } catch (IOException e) { Log.e("executeTop", "error in closing and destroying top process"); e.printStackTrace(); } } return returnString; } public static String getNetworkType(final Context activity) { String networkStatus = ""; final ConnectivityManager connMgr = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE); // check for wifi final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); // check for mobile data final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi.isAvailable()) { networkStatus = "Wifi"; } else if (mobile.isAvailable()) { networkStatus = getDataType(activity); } else { networkStatus = "noNetwork"; } return networkStatus; } public static String checkNetworkStatus(final Context activity) { String networkStatus = ""; try { // Get connect mangaer final ConnectivityManager connMgr = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE); // // check for wifi final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); // // check for mobile data final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi.isAvailable()) { networkStatus = "Wifi"; } else if (mobile.isAvailable()) { networkStatus = getDataType(activity); } else { networkStatus = "noNetwork"; networkStatus = "0"; } } catch (Exception e) { e.printStackTrace(); networkStatus = "0"; } return networkStatus; } public static boolean isTablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; } public static boolean getDeviceMoreThan5Inch(Context activity) { try { DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); // int width = displayMetrics.widthPixels; // int height = displayMetrics.heightPixels; float yInches = displayMetrics.heightPixels / displayMetrics.ydpi; float xInches = displayMetrics.widthPixels / displayMetrics.xdpi; double diagonalInches = Math.sqrt(xInches * xInches + yInches * yInches); if (diagonalInches >= 7) { // 5inch device or bigger return true; } else { // smaller device return false; } } catch (Exception e) { return false; } } public static String getDeviceInch(Context activity) { try { DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); float yInches = displayMetrics.heightPixels / displayMetrics.ydpi; float xInches = displayMetrics.widthPixels / displayMetrics.xdpi; double diagonalInches = Math.sqrt(xInches * xInches + yInches * yInches); return String.valueOf(diagonalInches); } catch (Exception e) { return "-1"; } } public static String getDataType(Context activity) { String type = "Mobile Data"; TelephonyManager tm = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE); switch (tm.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_HSDPA: type = "Mobile Data 3G"; Log.d("Type", "3g"); // for 3g HSDPA networktype will be return as // per testing(real) in device with 3g enable // data // and speed will also matters to decide 3g network type break; case TelephonyManager.NETWORK_TYPE_HSPAP: type = "Mobile Data 4G"; Log.d("Type", "4g"); // No specification for the 4g but from wiki // i found(HSPAP used in 4g) break; case TelephonyManager.NETWORK_TYPE_GPRS: type = "Mobile Data GPRS"; Log.d("Type", "GPRS"); break; case TelephonyManager.NETWORK_TYPE_EDGE: type = "Mobile Data EDGE 2G"; Log.d("Type", "EDGE 2g"); break; } return type; } } 

– Obtener la dirección IP sin usar la clase InetAddressUtils

  private static final String IPV4_BASIC_PATTERN_STRING = "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" + // initial 3 fields, 0-255 followed by . "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"; // final field, 0-255 private static final Pattern IPV4_PATTERN = Pattern.compile("^" + IPV4_BASIC_PATTERN_STRING + "$"); public static boolean isIPv4Address(final String input) { return IPV4_PATTERN.matcher(input).matches(); } /** * Get IP address from first non-localhost interface * * @return address or empty string */ private static String getIPAddress(boolean useIPv4) { try { List interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { List addrs = Collections.list(intf.getInetAddresses()); for (InetAddress addr : addrs) { if (!addr.isLoopbackAddress()) { String sAddr = addr.getHostAddress().toUpperCase(); //TODO 3.0.0 boolean isIPv4 = isIPv4Address(sAddr); if (useIPv4) { if (isIPv4) return sAddr; } else { if (!isIPv4) { int delim = sAddr.indexOf('%'); // drop ip6 port // suffix return delim < 0 ? sAddr : sAddr.substring(0, delim); } } } } } } catch (Exception ex) { } // for now eat exceptions return ""; } 

Para la resolución de pantalla:

 getWindow().getWindowManager().getDefaultDisplay().getWidth(); getWindow().getWindowManager().getDefaultDisplay().getHeight(); 

Para la presencia del teclado de hardware:

 boolean keyboardPresent = (getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS); 

puedes probar esto>

 import android.os.Build; import android.os.StrictMode; import android.provider.Settings; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Utilies { public static String android_id = Settings.Secure.getString(App.getContext().getContentResolver(), Settings.Secure.ANDROID_ID); public static void getInternet() { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } public static String readKernelVersion() { try { Process p = Runtime.getRuntime().exec("uname -a"); InputStream is = null; if (p.waitFor() == 0) { is = p.getInputStream(); } else { is = p.getErrorStream(); } BufferedReader br = new BufferedReader(new InputStreamReader(is), 1024); String line = br.readLine(); br.close(); return line; } catch (Exception ex) { return "ERROR: " + ex.getMessage(); } } public static String getDeviceModelNumber() { String manufacturer = Build.VERSION.CODENAME; String model = Build.MODEL; if (model.startsWith(manufacturer)) { return capitalize(model); } else { return capitalize(manufacturer) + " " + model; } } private static String capitalize(String s) { if (s == null || s.length() == 0) { return ""; } char first = s.charAt(0); if (Character.isUpperCase(first)) { return s; } else { return Character.toUpperCase(first) + s.substring(1); } } // get System info. public static String OSNAME = System.getProperty("os.name"); public static String OSVERSION = System.getProperty("os.version"); public static String RELEASE = android.os.Build.VERSION.RELEASE; public static String DEVICE = android.os.Build.DEVICE; public static String MODEL = android.os.Build.MODEL; public static String PRODUCT = android.os.Build.PRODUCT; public static String BRAND = android.os.Build.BRAND; public static String DISPLAY = android.os.Build.DISPLAY; public static String CPU_ABI = android.os.Build.CPU_ABI; public static String CPU_ABI2 = android.os.Build.CPU_ABI2; public static String UNKNOWN = android.os.Build.UNKNOWN; public static String HARDWARE = android.os.Build.HARDWARE; public static String ID = android.os.Build.ID; public static String MANUFACTURER = android.os.Build.MANUFACTURER; public static String SERIAL = android.os.Build.SERIAL; public static String USER = android.os.Build.USER; public static String HOST = android.os.Build.HOST; } 

Actualización sobre la resolución de pantalla: getHeight () y getWidth desaprobados en el nivel de API 13 – HONEYCOMB_MR2; use getSize (Point) en su lugar. Más información en: http://developer.android.com/reference/android/view/Display.html

Intenta esto para obtener información del dispositivo.

 String serviceType = Context.TELEPHONY_SERVICE; TelephonyManager m_telephonyManager = (TelephonyManager) getActivity().getSystemService(serviceType); String DeviceId, SubscriberId, NetworkOperator, OsVersion,SimOperatorName; DeviceId = m_telephonyManager.getDeviceId(); SubscriberId = m_telephonyManager.getSubscriberId(); NetworkOperator = m_telephonyManager.getNetworkOperator(); OsVersion = m_telephonyManager.getDeviceSoftwareVersion(); SimOperatorName = m_telephonyManager.getSimOperatorName(); 

Mostrar salida

 Log.d("Device Information :", "\n DeviceId : " + DeviceId + "\n SubscriberId : " + SubscriberId + "\n NetworkOperator : " + NetworkOperator + "\n SoftwareVersion : " + OsVersion+ "\n SimOperatorName : " + SimOperatorName);