获取手机的 cpu 内存 sd卡 号码

为了实现一个功能,需要搜集手机信息,自己先在网上找了相关信息进行了汇总,主要是汇集手机的信息,一般想要的信息在手机设置->关于手机->状态消息里面包含了手机的各种信息,下面的代码中也主要显示了那些信息,但是源码的方法我还没有看,先把总结的贴出来。先上图(太多就截取几个)。

上代码啦,太多了,就写主要代码了。

  1.     // 获取Android手机中SD卡存储信息 获取剩余空间
  2. public void getSDCardInfo() { 
  3.     // 在manifest.xml文件中要添加
  4.     /*
  5.      * <uses-permission
  6.      * android:name="android.permission.WRITE_EXTERNAL_STORAGE">
  7.      * </uses-permission>
  8.      */
  9.     // 需要判断手机上面SD卡是否插好,如果有SD卡的情况下,我们才可以访问得到并获取到它的相关信息,当然以下这个语句需要用if做判断
  10.     if (Environment.getExternalStorageState().equals( 
  11.             Environment.MEDIA_MOUNTED)) { 
  12.         // 取得sdcard文件路径
  13.         File path = Environment.getExternalStorageDirectory(); 
  14.         StatFs statfs = new StatFs(path.getPath()); 
  15.         // 获取block的SIZE
  16.         long blocSize = statfs.getBlockSize(); 
  17.         // 获取BLOCK数量
  18.         long totalBlocks = statfs.getBlockCount(); 
  19.         // 空闲的Block的数量
  20.         long availaBlock = statfs.getAvailableBlocks(); 
  21.         // 计算总空间大小和空闲的空间大小
  22.         // 存储空间大小跟空闲的存储空间大小就被计算出来了。
  23.         long availableSize = blocSize * availaBlock; 
  24.         // (availableBlocks * blockSize)/1024 KIB 单位
  25.         // (availableBlocks * blockSize)/1024 /1024 MIB单位
  26.         long allSize = blocSize * totalBlocks; 
  27.     } 
  28. // 获取手机ip method-1
  29. public String getLocalIpAddress() { 
  30.     try
  31.         for (Enumeration<NetworkInterface> en = NetworkInterface 
  32.                 .getNetworkInterfaces(); en.hasMoreElements();) { 
  33.             NetworkInterface intf = en.nextElement(); 
  34.             for (Enumeration<InetAddress> enumIpAddr = intf 
  35.                     .getInetAddresses(); enumIpAddr.hasMoreElements();) { 
  36.                 InetAddress inetAddress = enumIpAddr.nextElement(); 
  37.                 if (!inetAddress.isLoopbackAddress()) { 
  38.                     Toast.makeText(this
  39.                             inetAddress.getHostAddress().toString(), 3000
  40.                             .show(); 
  41.                     return inetAddress.getHostAddress().toString(); 
  42.                 } 
  43.             } 
  44.         } 
  45.     } catch (SocketException ex) { 
  46.         ex.printStackTrace(); 
  47.         // Log.e("ifo", ex.toString());
  48.     } 
  49.     return ""
  50. } // 需要权限<uses-permission
  51.     // android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  52.     // <uses-permission
  53.     // android:name="android.permission.INTERNET"></uses-permission>
  54. // 获取手机ip method-2
  55. // 首先设置用户权限
  56. // <uses-permission
  57. // android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  58. // <uses-permission
  59. // android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
  60. // <uses-permission
  61. // android:name="android.permission.WAKE_LOCK"></uses-permission>
  62. public String getLocalIpAddress2() { 
  63.     // 获取wifi服务
  64.     WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
  65.     // 判断wifi是否开启
  66.     if (!wifiManager.isWifiEnabled()) { 
  67.         wifiManager.setWifiEnabled(true); 
  68.     } 
  69.     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
  70.     int ipAddress = wifiInfo.getIpAddress(); 
  71.     String ip = intToIp(ipAddress); 
  72.     return ip; 
  73. private String intToIp(int i) { 
  74.     return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF
  75.             + "." + (i >> 24 & 0xFF); 
  76. // 查看本机外网IP
  77. /*
  78. * 该方法需要设备支持上网 查看
  79. * System.out.println((GetNetIp("http://fw.qq.com/ipaddress"))); 加权限
  80. * <uses-permission
  81. * android:name="android.permission.INTERNET"></uses-permission>
  82. * 通过获取http://fw.qq.com/ipaddress网页取得外网IP 这里有几个查看IP的网址然后提取IP试试。
  83. * http://ip168.com/ http://www.cmyip.com/ http://city.ip138.com/ip2city.asp
  84. */
  85. public String GetNetIp(String ipaddr) { 
  86.     URL infoUrl = null
  87.     InputStream inStream = null
  88.     try
  89.         infoUrl = new URL(ipaddr); 
  90.         URLConnection connection = infoUrl.openConnection(); 
  91.         HttpURLConnection httpConnection = (HttpURLConnection) connection; 
  92.         int responseCode = httpConnection.getResponseCode(); 
  93.         if (responseCode == HttpURLConnection.HTTP_OK) { 
  94.             inStream = httpConnection.getInputStream(); 
  95.             BufferedReader reader = new BufferedReader( 
  96.                     new InputStreamReader(inStream, "utf-8")); 
  97.             StringBuilder strber = new StringBuilder(); 
  98.             String line = null
  99.             while ((line = reader.readLine()) != null
  100.                 strber.append(line + "\n"); 
  101.             inStream.close(); 
  102.             return strber.toString(); 
  103.         } 
  104.     } catch (MalformedURLException e) { 
  105.         // TODO Auto-generated catch block
  106.         e.printStackTrace(); 
  107.     } catch (IOException e) { 
  108.         // TODO Auto-generated catch block
  109.         e.printStackTrace(); 
  110.     } 
  111.     return ""
  112. // 获取手机MAC地址
  113. private String getMacAddress() { 
  114.     String result = ""
  115.     WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
  116.     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
  117.     result = wifiInfo.getMacAddress(); 
  118.     // Log.i(TAG, "macAdd:" + result);
  119.     return result; 
  120. // 获取手机屏幕高度
  121. private String getWeithAndHeight() { 
  122.     // 这种方式在service中无法使用,
  123.     DisplayMetrics dm = new DisplayMetrics(); 
  124.     getWindowManager().getDefaultDisplay().getMetrics(dm); 
  125.     int width = dm.widthPixels; // 宽
  126.     int height = dm.heightPixels; // 高
  127.     float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
  128.     int densityDpi = dm.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
  129.     // 在service中也能得到高和宽
  130.     WindowManager mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
  131.     width = mWindowManager.getDefaultDisplay().getWidth(); 
  132.     height = mWindowManager.getDefaultDisplay().getHeight(); 
  133.     // 居中显示Toast
  134.     Toast msg = Toast.makeText(this, "宽=" + width + "   高=" + height, 
  135.             Toast.LENGTH_LONG); 
  136.     msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2
  137.             msg.getYOffset() / 2); 
  138.     msg.show(); 
  139.     return "(像素)宽:" + width + "\n" + "(像素)高:" + height + "\n"
  140.             + "屏幕密度(0.75 / 1.0 / 1.5):" + density + "\n"
  141.             + "屏幕密度DPI(120 / 160 / 240):" + densityDpi + "\n"
  142.     /*
  143.      * 下面的代码即可获取屏幕的尺寸。 在一个Activity的onCreate方法中,写入如下代码:
  144. DisplayMetrics metric = new DisplayMetrics();
  145.      * getWindowManager().getDefaultDisplay().getMetrics(metric);
  146. * int width = metric.widthPixels; // 屏幕宽度(像素)
  147. * int height = metric.heightPixels; // 屏幕高度(像素)
  148. * float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
  149.      * int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
  150.      * 
  151.      * 但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。
  152.      * 比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。
  153.      * 因此,研究之后发现,若没有设定多分辨率支持的话
  154.      * ,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,
  155.      * 这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifest
  156.      * .xml文件中,加入supports-screens节点,具体的内容如下: <supports-screens
  157.      * android:smallScreens="true" android:normalScreens="true"
  158.      * android:largeScreens="true" android:resizeable="true"
  159.      * android:anyDensity="true" />
  160.      * 这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。
  161.      */
  162. // 获取手机经纬度
  163. public void getLocation() { 
  164.     // 1. 创建一个 LocationManager对象。
  165.     LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
  166.     // 2. 创建一个 LocationListener对象。
  167.     LocationListener myGPSListener = new LocationListener() { 
  168.         // 一旦Location发生改变就会调用这个方法
  169.         public void onLocationChanged(Location location) { 
  170.             double latitude = location.getLatitude(); 
  171.             double longitude = location.getLongitude(); 
  172.         } 
  173.         public void onStatusChanged(String provider, int status, 
  174.                 Bundle extras) { 
  175.         } 
  176.         public void onProviderEnabled(String provider) { 
  177.         } 
  178.         public void onProviderDisabled(String provider) { 
  179.         } 
  180.     }; 
  181.     // 3.向LocationManager 注册一个LocationListener。
  182.     Criteria criteria = new Criteria(); 
  183.     criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
  184.     criteria.setAltitudeRequired(false); 
  185.     criteria.setCostAllowed(true); 
  186.     criteria.setPowerRequirement(Criteria.POWER_LOW); 
  187.     String provider = locationManager.getBestProvider(criteria, true); // 根据Criteria
  188.                                                                         // 的设置获取一个最佳的Provider
  189.     locationManager 
  190.             .requestLocationUpdates(provider, 5000, 0, myGPSListener); 
  191.     // 4.移除LocationManager 注册的 LocationListener。
  192.     locationManager.removeUpdates(myGPSListener); 
  193. // 当前网络是否连接
  194. public boolean isNetConnecting() { 
  195.     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
  196.     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
  197.     if (networkInfo == null || !networkInfo.isConnected()) { 
  198.         // info.setConnected(false);
  199.         return false
  200.     } else
  201.         // info.setConnected(true);
  202.         return true
  203.     } 
  204. // 获取信号强度
  205. public void getPhoneState() { 
  206.     // 1. 创建telephonyManager 对象。
  207.     TelephonyManager telephonyManager = (TelephonyManager) /* context. */getSystemService(Context.TELEPHONY_SERVICE); 
  208.     // 2. 创建PhoneStateListener 对象
  209.     PhoneStateListener MyPhoneListener = new PhoneStateListener() { 
  210.         @Override
  211.         public void onCellLocationChanged(CellLocation location) { 
  212.             if (location instanceof GsmCellLocation) {// gsm网络
  213.                 int CID = ((GsmCellLocation) location).getCid(); 
  214.             } else if (location instanceof CdmaCellLocation) {// 其他CDMA等网络
  215.                 int ID = ((CdmaCellLocation) location).getBaseStationId(); 
  216.             } 
  217.         } 
  218.         @Override
  219.         public void onServiceStateChanged(ServiceState serviceState) { 
  220.             super.onServiceStateChanged(serviceState); 
  221.         } 
  222.         @Override
  223.         public void onSignalStrengthsChanged(SignalStrength signalStrength) { 
  224.             int asu = signalStrength.getGsmSignalStrength(); 
  225.             int dbm = -113 + 2 * asu; // 信号强度
  226.             super.onSignalStrengthsChanged(signalStrength); 
  227.         } 
  228.     }; 
  229.     // 3. 监听信号改变
  230.     telephonyManager.listen(MyPhoneListener, 
  231.             PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 
  232.     /*
  233.      * 可能需要的权限 <uses-permission
  234.      * android:name="android.permission.WAKE_LOCK"></uses-permission>
  235.      * <uses-permission
  236.      * android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  237.      * <uses-permission
  238.      * android:name="android.permission.ACCESS_FINE_LOCATION"/>
  239.      * <uses-permission android:name="android.permission.READ_PHONE_STATE"
  240.      * /> <uses-permission
  241.      * android:name="android.permission.ACCESS_NETWORK_STATE" />
  242.      */
  243. // 获取手机可用内存和总内存
  244. private String getSystemMemory() { 
  245.     /*
  246.      * 在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。这个该如何实现呢?
  247.      * 通过读取文件"/proc/meminfo" 的信息能够获取手机Memory的总量,而通过ActivityManager.getMemoryInfo
  248.      * (ActivityManager.MemoryInfo)方法可以获取当前的可用Memory量。
  249.      * "/proc/meminfo"文件记录了android手机的一些内存信息
  250.      * ,在命令行窗口里输入"adb shell",进入shell环境,输入
  251.      * "cat /proc/meminfo"即可在命令行里显示meminfo文件的内容,具体如下所示。
  252.      * 
  253.      * C:\Users\Figo>adb shell # cat /proc/meminfo cat /proc/meminfo
  254.      * MemTotal: 94096 kB
  255. * MemFree: 1684 kB  Buffers: 16 kB  Cached: 27160 kB
  256.      * SwapCached: 0 kB  Active: 35392 kB  Inactive: 44180 kB
  257. * Active(anon): 26540 kB Inactive(anon): 28244 kB  Active(file): 8852 kB
  258.      * Inactive(file): 15936 kB  Unevictable: 280 kB  Mlocked: 0 kB * SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 52688 kB
  259.      * Mapped: 17960 kB Slab: 3816 kB SReclaimable: 936 kB SUnreclaim: 2880
  260.      * kB PageTables: 5260 kB NFS_Unstable: 0 kB Bounce: 0 kB
  261. * WritebackTmp: 0 kB
  262. * CommitLimit: 47048 kB
  263. * Committed_AS: 1483784 kB
  264. * VmallocTotal: 876544 kB
  265. * VmallocUsed: 15456 kB
  266. * VmallocChunk: 829444 kB #
  267.      * 
  268.      * 下面先对"/proc/meminfo"文件里列出的字段进行粗略解释: MemTotal: 所有可用RAM大小。 MemFree:
  269.      * LowFree与HighFree的总和,被系统留着未使用的内存。 Buffers: 用来给文件做缓冲大小。 Cached:
  270.      * 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus SwapCache)。
  271.      * SwapCached:被高速缓冲存储器(cache
  272.      * memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,
  273.      * 用来在需要的时候很快的被替换而不需要再次打开I/O端口。 Active:
  274.      * 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。 Inactive:
  275.      * 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。 SwapTotal: 交换空间的总大小。 SwapFree:
  276.      * 未被使用交换空间的大小。 Dirty: 等待被写回到磁盘的内存大小。 Writeback: 正在被写回到磁盘的内存大小。
  277.      * AnonPages:未映射页的内存大小。 Mapped: 设备和文件等映射的大小。 Slab:
  278.      * 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。 SReclaimable:可收回Slab的大小。
  279.      * SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。
  280.      * PageTables:管理内存分页页面的索引表的大小。 NFS_Unstable:不稳定页表的大小。
  281.      * 要获取android手机总内存大小,只需读取"/proc/meminfo"文件的第1行,并进行简单的字符串处理即可。
  282.      */
  283.     String availMemory = getAvailMemory(); 
  284.     String totalMemory = getTotalMemory(); 
  285.     return "可用内存=" + availMemory + "\n" + "总内存=" + totalMemory; 
  286. }// 手机的内存信息主要在/proc/meminfo文件中,其中第一行是总内存,而剩余内存可通过ActivityManager.MemoryInfo得到。
  287. private String getAvailMemory() {// 获取android当前可用内存大小
  288.     ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
  289.     MemoryInfo mi = new MemoryInfo(); 
  290.     am.getMemoryInfo(mi); 
  291.     // mi.availMem; 当前系统的可用内存
  292.     return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 将获取的内存大小规格化
  293. private String getTotalMemory() { 
  294.     String str1 = "/proc/meminfo";// 系统内存信息文件
  295.     String str2; 
  296.     String[] arrayOfString; 
  297.     long initial_memory = 0
  298.     try
  299.         FileReader localFileReader = new FileReader(str1); 
  300.         BufferedReader localBufferedReader = new BufferedReader( 
  301.                 localFileReader, 8192); 
  302.         str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小
  303.         arrayOfString = str2.split("\\s+"); 
  304.         for (String num : arrayOfString) { 
  305.             Log.i(str2, num + "\t"); 
  306.         } 
  307.         initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 获得系统总内存,单位是KB,乘以1024转换为Byte
  308.         localBufferedReader.close(); 
  309.     } catch (IOException e) { 
  310.     } 
  311.     return Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte转换为KB或者MB,内存大小规格化
  312. // 获取手机CPU信息
  313. private String getCpuInfo() { 
  314.     String str1 = "/proc/cpuinfo"
  315.     String str2 = ""
  316.     String[] cpuInfo = { "", "" }; // 1-cpu型号 //2-cpu频率
  317.     String[] arrayOfString; 
  318.     try
  319.         FileReader fr = new FileReader(str1); 
  320.         BufferedReader localBufferedReader = new BufferedReader(fr, 8192); 
  321.         str2 = localBufferedReader.readLine(); 
  322.         arrayOfString = str2.split("\\s+"); 
  323.         for (int i = 2; i < arrayOfString.length; i++) { 
  324.             cpuInfo[0] = cpuInfo[0] + arrayOfString[i] + " "
  325.         } 
  326.         str2 = localBufferedReader.readLine(); 
  327.         arrayOfString = str2.split("\\s+"); 
  328.         cpuInfo[1] += arrayOfString[2]; 
  329.         localBufferedReader.close(); 
  330.     } catch (IOException e) { 
  331.     } 
  332.     // Log.i(TAG, "cpuinfo:" + cpuInfo[0] + " " + cpuInfo[1]);
  333.     return "1-cpu型号:" + cpuInfo[0] + "2-cpu频率:" + cpuInfo[1]; 
  334. }// 和内存信息同理,cpu信息可通过读取/proc/cpuinfo文件来得到,其中第一行为cpu型号,第二行为cpu频率。
  335. /*
  336. * 一、Android 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
  337. * 1、通过PackageManager可获取手机端已安装的apk文件的信息,具体代码如下: PackageManager
  338. * packageManager = this.getPackageManager(); List<PackageInfo>
  339. * packageInfoList = packageManager.getInstalledPackages(0);
  340. * 通过上述方法,可得到手机中安装的所有应用程序,包括手动安装的apk包的信息、、系统预装的应用软件的信息,要区分这两类软件可使用以下方法:
  341. * (a)从packageInfoList获取的packageInfo
  342. * ,再通过packageInfo.applicationInfo获取applicationInfo。
  343. * (b)判断(applicationInfo.flags &
  344. * ApplicationInfo.FLAG_SYSTEM)的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动安装的应用。
  345. * (1)获取应用的代码: public static List<PackageInfo> getAllApps(Context context) {
  346. * List<PackageInfo> apps = new ArrayList<PackageInfo>(); PackageManager
  347. * pManager = context.getPackageManager(); //获取手机内所有应用 List<PackageInfo>
  348. * paklist = pManager.getInstalledPackages(0); for (int i = 0; i <
  349. * paklist.size(); i++) { PackageInfo pak = (PackageInfo) paklist.get(i);
  350. * //判断是否为非系统预装的应用程序 if ((pak.applicationInfo.flags &
  351. * pak.applicationInfo.FLAG_SYSTEM) <= 0) { apps.add(pak); } } return apps;
  352. * } (2)、获取图片、应用名、包名: PackageManager pManager =
  353. * MessageSendActivity.this.getPackageManager(); List<PackageInfo> appList =
  354. * Utils.getAllApps(MessageSendActivity.this); for(int
  355. * i=0;i<appList.size();i++) { PackageInfo pinfo = appList.get(i); shareItem
  356. * = new ShareItemInfo();
  357. * shareItem.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));
  358. * shareItem
  359. * .setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString
  360. * ()); shareItem.setPackageName(pinfo.applicationInfo.packageName); }
  361. * 其中ShareItemInfo 类自己写的,各位可以忽略 (3)获取支持分享的应用的代码: public static
  362. * List<ResolveInfo> getShareApps(Context context){ List<ResolveInfo> mApps
  363. * = new ArrayList<ResolveInfo>(); Intent intent=new
  364. * Intent(Intent.ACTION_SEND,null);
  365. * intent.addCategory(Intent.CATEGORY_DEFAULT);
  366. * intent.setType("text/plain"); PackageManager pManager =
  367. * context.getPackageManager(); mApps =
  368. * pManager.queryIntentActivities(intent
  369. * ,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); return mApps; }
  370. * 由于该方法,返回的并不是PackageInfo 对象。而是ResolveInfo。因此获取图片、应用名、包名的方法不一样,如下:
  371. * PackageManager pManager = MessageSendActivity.this.getPackageManager();
  372. * List<ResolveInfo> resolveList =
  373. * Utils.getShareApps(MessageSendActivity.this); for(int
  374. * i=0;i<resolveList.size();i++) { ResolveInfo resolve = resolveList.get(i);
  375. * ShareItemInfo shareItem = new ShareItemInfo(); //set Icon
  376. * shareItem.setIcon(resolve.loadIcon(pManager)); //set Application Name
  377. * shareItem.setLabel(resolve.loadLabel(pManager).toString()); //set Package
  378. * Name shareItem.setPackageName(resolve.activityInfo.packageName); } 总结: 通过
  379. * PackageInfo 获取具体信息方法: 包名获取方法:packageInfo.packageName
  380. * icon获取获取方法:packageManager.getApplicationIcon(applicationInfo)
  381. * 应用名称获取方法:packageManager.getApplicationLabel(applicationInfo)
  382. * 使用权限获取方法:packageManager
  383. * .getPackageInfo(packageName,PackageManager.GET_PERMISSIONS)
  384. * .requestedPermissions 通过 ResolveInfo 获取具体信息方法:
  385. * 包名获取方法:resolve.activityInfo.packageName
  386. * icon获取获取方法:resolve.loadIcon(packageManager)
  387. * 应用名称获取方法:resolve.loadLabel(packageManager).toString()
  388. */
  389. ublic String getSimCardInfo() { 
  390.     // 在manifest.xml文件中要添加
  391.     // <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  392.     /*
  393.      * TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息
  394.      * 、电信网络的状态及手机用户的信息。
  395.      * 在应用程序中可以使用这些get方法获取相关数据。TelephonyManager类的对象可以通过Context
  396.      * .getSystemService(Context.TELEPHONY_SERVICE)
  397.      * 方法来获得,需要注意的是有些通讯信息的获取对应用程序的权限有一定的限制
  398.      * ,在开发的时候需要为其添加相应的权限。以下列出TelephonyManager类所有方法及说明:
  399.      * TelephonyManager提供设备上获取通讯服务信息的入口。 应用程序可以使用这个类方法确定的电信服务商和国家
  400.      * 以及某些类型的用户访问信息。 应用程序也可以注册一个监听器到电话收状态的变化。不需要直接实例化这个类
  401.      * 使用Context.getSystemService (Context.TELEPHONY_SERVICE)来获取这个类的实例。
  402.      */
  403.     // 解释:
  404.     // IMSI是国际移动用户识别码的简称(International Mobile Subscriber Identity)
  405.     // IMSI共有15位,其结构如下:
  406.     // MCC+MNC+MIN
  407.     // MCC:Mobile Country Code,移动国家码,共3位,中国为460;
  408.     // MNC:Mobile NetworkCode,移动网络码,共2位
  409.     // 在中国,移动的代码为电00和02,联通的代码为01,电信的代码为03
  410.     // 合起来就是(也是Android手机中APN配置文件中的代码):
  411.     // 中国移动:46000 46002
  412.     // 中国联通:46001
  413.     // 中国电信:46003
  414.     // 举例,一个典型的IMSI号码为460030912121001
  415.     // IMEI是International Mobile Equipment Identity (国际移动设备标识)的简称
  416.     // IMEI由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的
  417.     // 其组成为:
  418.     // 1. 前6位数(TAC)是”型号核准号码”,一般代表机型
  419.     // 2. 接着的2位数(FAC)是”最后装配号”,一般代表产地
  420.     // 3. 之后的6位数(SNR)是”串号”,一般代表生产顺序号
  421.     // 4. 最后1位数(SP)通常是”0″,为检验码,目前暂备用
  422.     TelephonyManager tm = (TelephonyManager) this
  423.             .getSystemService(TELEPHONY_SERVICE); 
  424.     /*
  425.      * 电话状态: 1.tm.CALL_STATE_IDLE=0 无活动,无任何状态时 2.tm.CALL_STATE_RINGING=1
  426.      * 响铃,电话进来时 3.tm.CALL_STATE_OFFHOOK=2 摘机
  427.      */
  428.     tm.getCallState();// int
  429.     /*
  430.      * 电话方位:
  431.      */
  432.     // 返回当前移动终端的位置
  433.     CellLocation location = tm.getCellLocation(); 
  434.     // 请求位置更新,如果更新将产生广播,接收对象为注册LISTEN_CELL_LOCATION的对象,需要的permission名称为
  435.     // ACCESS_COARSE_LOCATION。
  436.     location.requestLocationUpdate(); 
  437.     /**
  438.      * 获取数据活动状态
  439.      * 
  440.      * DATA_ACTIVITY_IN 数据连接状态:活动,正在接受数据 DATA_ACTIVITY_OUT 数据连接状态:活动,正在发送数据
  441.      * DATA_ACTIVITY_INOUT 数据连接状态:活动,正在接受和发送数据 DATA_ACTIVITY_NONE
  442.      * 数据连接状态:活动,但无数据发送和接受
  443.      */
  444.     tm.getDataActivity(); 
  445.     /**
  446.      * 获取数据连接状态
  447.      * 
  448.      * DATA_CONNECTED 数据连接状态:已连接 DATA_CONNECTING 数据连接状态:正在连接
  449.      * DATA_DISCONNECTED 数据连接状态:断开 DATA_SUSPENDED 数据连接状态:暂停
  450.      */
  451.     tm.getDataState(); 
  452.     /**
  453.      * 返回当前移动终端的唯一标识,设备ID
  454.      * 
  455.      * 如果是GSM网络,返回IMEI;如果是CDMA网络,返回MEID Return null if device ID is not
  456.      * available.
  457.      */
  458.     String Imei = tm.getDeviceId();// String
  459.     /*
  460.      * 返回移动终端的软件版本,例如:GSM手机的IMEI/SV码。 设备的软件版本号: 例如:the IMEI/SV(software
  461.      * version) for GSM phones. Return null if the software version is not
  462.      * available.
  463.      */
  464.     tm.getDeviceSoftwareVersion();// String
  465.     /*
  466.      * 手机号: GSM手机的 MSISDN. Return null if it is unavailable.
  467.      */
  468.     String phoneNum = tm.getLine1Number();// String
  469.     /*
  470.      * 获取ISO标准的国家码,即国际长途区号。 注意:仅当用户已在网络注册后有效。 在CDMA网络中结果也许不可靠。
  471.      */
  472.     tm.getNetworkCountryIso();// String
  473.     /*
  474.      * MCC+MNC(mobile country code + mobile network code) 注意:仅当用户已在网络注册时有效。
  475.      * 在CDMA网络中结果也许不可靠。
  476.      */
  477.     tm.getNetworkOperator();// String
  478.     /*
  479.      * 按照字母次序的current registered operator(当前已注册的用户)的名字 注意:仅当用户已在网络注册时有效。
  480.      * 在CDMA网络中结果也许不可靠。
  481.      */
  482.     tm.getNetworkOperatorName();// String
  483.     /*
  484.      * 当前使用的网络类型: 例如: NETWORK_TYPE_UNKNOWN 网络类型未知 0 NETWORK_TYPE_GPRS GPRS网络
  485.      * 1 NETWORK_TYPE_EDGE EDGE网络 2 NETWORK_TYPE_UMTS UMTS网络 3
  486.      * NETWORK_TYPE_HSDPA HSDPA网络 8 NETWORK_TYPE_HSUPA HSUPA网络 9
  487.      * NETWORK_TYPE_HSPA HSPA网络 10 NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4
  488.      * NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5 NETWORK_TYPE_EVDO_A EVDO网络,
  489.      * revision A. 6 NETWORK_TYPE_1xRTT 1xRTT网络 7
  490.      */
  491.     tm.getNetworkType();// int
  492.     /*
  493.      * 手机类型: 例如: PHONE_TYPE_NONE 无信号 PHONE_TYPE_GSM GSM信号 PHONE_TYPE_CDMA
  494.      * CDMA信号
  495.      */
  496.     tm.getPhoneType();// int
  497.     /*
  498.      * Returns the ISO country code equivalent for the SIM provider's
  499.      * country code. 获取ISO国家码,相当于提供SIM卡的国家码。
  500.      */
  501.     tm.getSimCountryIso();// String
  502.     /*
  503.      * Returns the MCC+MNC (mobile country code + mobile network code) of
  504.      * the provider of the SIM. 5 or 6 decimal digits.
  505.      * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字. SIM卡的状态必须是
  506.      * SIM_STATE_READY(使用getSimState()判断).
  507.      */
  508.     tm.getSimOperator();// String
  509.     /*
  510.      * 服务商名称: 例如:中国移动、联通 SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).
  511.      */
  512.     tm.getSimOperatorName();// String
  513.     /*
  514.      * SIM卡的序列号: 需要权限:READ_PHONE_STATE
  515.      */
  516.     tm.getSimSerialNumber();// String
  517.     /*
  518.      * SIM的状态信息: SIM_STATE_UNKNOWN 未知状态 0 SIM_STATE_ABSENT 没插卡 1
  519.      * SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2 SIM_STATE_PUK_REQUIRED
  520.      * 锁定状态,需要用户的PUK码解锁 3 SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4
  521.      * SIM_STATE_READY 就绪状态 5
  522.      */
  523.     tm.getSimState();// int
  524.     /*
  525.      * 唯一的用户ID: 例如:IMSI(国际移动用户识别码) for a GSM phone. 需要权限:READ_PHONE_STATE
  526.      */
  527.     tm.getSubscriberId();// String
  528.     /*
  529.      * 取得和语音邮件相关的标签,即为识别符 需要权限:READ_PHONE_STATE
  530.      */
  531.     tm.getVoiceMailAlphaTag();// String
  532.     /*
  533.      * 获取语音邮件号码: 需要权限:READ_PHONE_STATE
  534.      */
  535.     tm.getVoiceMailNumber();// String
  536.     /*
  537.      * ICC卡是否存在
  538.      */
  539.     tm.hasIccCard();// boolean
  540.     /*
  541.      * 是否漫游: (在GSM用途下)
  542.      */
  543.     tm.isNetworkRoaming();//
  544.     String ProvidersName = null
  545.     // 返回唯一的用户ID;就是这张卡的编号神马的
  546.     String IMSI = tm.getSubscriberId(); // 国际移动用户识别码
  547.     // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。
  548.     System.out.println(IMSI); 
  549.     if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) { 
  550.         ProvidersName = "中国移动"
  551.     } else if (IMSI.startsWith("46001")) { 
  552.         ProvidersName = "中国联通"
  553.     } else if (IMSI.startsWith("46003")) { 
  554.         ProvidersName = "中国电信"
  555.     } 
  556.     // 返回当前移动终端附近移动终端的信息
  557.     /*
  558.      * 附近的电话的信息: 类型:List<NeighboringCellInfo>
  559.      * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES
  560.      */
  561.     List<NeighboringCellInfo> infos = tm.getNeighboringCellInfo(); 
  562.     for (NeighboringCellInfo info : infos) { 
  563.         // 获取邻居小区号
  564.         int cid = info.getCid(); 
  565.         // 获取邻居小区LAC,LAC:
  566.         // 位置区域码。为了确定移动台的位置,每个GSM/PLMN的覆盖区都被划分成许多位置区,LAC则用于标识不同的位置区。
  567.         info.getLac(); 
  568.         info.getNetworkType(); 
  569.         info.getPsc(); 
  570.         // 获取邻居小区信号强度
  571.         info.getRssi(); 
  572.     } 
  573.     return "手机号码:" + phoneNum + "\n" + "服务商:" + ProvidersName+"\n" + "IMEI:" + Imei; 
  574. // 显示信息对话框
  575. public void showDialog(String title, String info) { 
  576.     AlertDialog dialog = new AlertDialog.Builder(this
  577.             .setTitle(title) 
  578.             .setMessage(info) 
  579.             .setPositiveButton("close"
  580.                     new DialogInterface.OnClickListener() { 
  581.                         @Override
  582.                         public void onClick(DialogInterface dialog, 
  583.                                 int which) { 
  584.                             dialog.cancel(); 
  585.                             dialog = null
  586.                         } 
  587.                     }).create(); 
  588.     dialog.show(); 
  589. }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值