【小功能2】android獲取手機信息(號碼,內存,CPU,分辨率,MAC,IP,SD卡,IMEI,經緯度,信號強度等等)

            爲了實現一個功能,需要蒐集手機信息,自己先在網上找了相關信息進行了彙總,主要是彙集手機的信息,一般想要的信息在手機設置->關於手機->狀態消息裏面包含了手機的各種信息,下面的代碼中也主要顯示了那些信息,但是源碼的方法我還沒有看,先把總結的貼出來。先上圖(太多就截取幾個)。

 

 

上代碼啦,太多了,就寫主要代碼了。

 

  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.  
  29. }  
  30.  
  31. // 獲取手機ip method-1  
  32. public String getLocalIpAddress() {  
  33.     try {  
  34.         for (Enumeration<NetworkInterface> en = NetworkInterface  
  35.                 .getNetworkInterfaces(); en.hasMoreElements();) {  
  36.             NetworkInterface intf = en.nextElement();  
  37.             for (Enumeration<InetAddress> enumIpAddr = intf  
  38.                     .getInetAddresses(); enumIpAddr.hasMoreElements();) {  
  39.                 InetAddress inetAddress = enumIpAddr.nextElement();  
  40.                 if (!inetAddress.isLoopbackAddress()) {  
  41.                     Toast.makeText(this,  
  42.                             inetAddress.getHostAddress().toString(), 3000)  
  43.                             .show();  
  44.                     return inetAddress.getHostAddress().toString();  
  45.                 }  
  46.             }  
  47.         }  
  48.     } catch (SocketException ex) {  
  49.         ex.printStackTrace();  
  50.         // Log.e("ifo", ex.toString());  
  51.     }  
  52.     return "";  
  53. // 需要權限<uses-permission  
  54.     // android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
  55.     // <uses-permission  
  56.     // android:name="android.permission.INTERNET"></uses-permission>  
  57.  
  58. // 獲取手機ip method-2  
  59. // 首先設置用戶權限  
  60. // <uses-permission  
  61. // android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
  62. // <uses-permission  
  63. // android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
  64. // <uses-permission  
  65. // android:name="android.permission.WAKE_LOCK"></uses-permission>  
  66. public String getLocalIpAddress2() {  
  67.     // 獲取wifi服務  
  68.     WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
  69.     // 判斷wifi是否開啓  
  70.     if (!wifiManager.isWifiEnabled()) {  
  71.         wifiManager.setWifiEnabled(true);  
  72.     }  
  73.     WifiInfo wifiInfo = wifiManager.getConnectionInfo();  
  74.     int ipAddress = wifiInfo.getIpAddress();  
  75.     String ip = intToIp(ipAddress);  
  76.     return ip;  
  77. }  
  78.  
  79. private String intToIp(int i) {  
  80.     return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF)  
  81.             + "." + (i >> 24 & 0xFF);  
  82. }  
  83.  
  84. // 查看本機外網IP  
  85. /*  
  86.  * 該方法需要設備支持上網 查看  
  87.  * System.out.println((GetNetIp("http://fw.qq.com/ipaddress"))); 加權限  
  88.  * <uses-permission  
  89.  * android:name="android.permission.INTERNET"></uses-permission>  
  90.  * 通過獲取http://fw.qq.com/ipaddress網頁取得外網IP 這裏有幾個查看IP的網址然後提取IP試試。  
  91.  * http://ip168.com/ http://www.cmyip.com/ http://city.ip138.com/ip2city.asp  
  92.  */ 
  93. public String GetNetIp(String ipaddr) {  
  94.     URL infoUrl = null;  
  95.     InputStream inStream = null;  
  96.     try {  
  97.         infoUrl = new URL(ipaddr);  
  98.         URLConnection connection = infoUrl.openConnection();  
  99.         HttpURLConnection httpConnection = (HttpURLConnection) connection;  
  100.         int responseCode = httpConnection.getResponseCode();  
  101.         if (responseCode == HttpURLConnection.HTTP_OK) {  
  102.             inStream = httpConnection.getInputStream();  
  103.             BufferedReader reader = new BufferedReader(  
  104.                     new InputStreamReader(inStream, "utf-8"));  
  105.             StringBuilder strber = new StringBuilder();  
  106.             String line = null;  
  107.             while ((line = reader.readLine()) != null)  
  108.                 strber.append(line + "\n");  
  109.             inStream.close();  
  110.             return strber.toString();  
  111.         }  
  112.     } catch (MalformedURLException e) {  
  113.         // TODO Auto-generated catch block  
  114.         e.printStackTrace();  
  115.     } catch (IOException e) {  
  116.         // TODO Auto-generated catch block  
  117.         e.printStackTrace();  
  118.     }  
  119.     return "";  
  120. }  
  121.  
  122. // 獲取手機MAC地址  
  123. private String getMacAddress() {  
  124.     String result = "";  
  125.     WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
  126.     WifiInfo wifiInfo = wifiManager.getConnectionInfo();  
  127.     result = wifiInfo.getMacAddress();  
  128.     // Log.i(TAG, "macAdd:" + result);  
  129.     return result;  
  130. }  
  131.  
  132. // 獲取手機屏幕高度  
  133. private String getWeithAndHeight() {  
  134.     // 這種方式在service中無法使用,  
  135.     DisplayMetrics dm = new DisplayMetrics();  
  136.     getWindowManager().getDefaultDisplay().getMetrics(dm);  
  137.     int width = dm.widthPixels; // 寬  
  138.     int height = dm.heightPixels; // 高  
  139.     float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)  
  140.     int densityDpi = dm.densityDpi; // 屏幕密度DPI(120 / 160 / 240)  
  141.     // 在service中也能得到高和寬  
  142.     WindowManager mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  
  143.     width = mWindowManager.getDefaultDisplay().getWidth();  
  144.     height = mWindowManager.getDefaultDisplay().getHeight();  
  145.  
  146.     // 居中顯示Toast  
  147.     Toast msg = Toast.makeText(this"寬=" + width + "   高=" + height,  
  148.             Toast.LENGTH_LONG);  
  149.     msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2,  
  150.             msg.getYOffset() / 2);  
  151.     msg.show();  
  152.     return "(像素)寬:" + width + "\n" + "(像素)高:" + height + "\n" 
  153.             + "屏幕密度(0.75 / 1.0 / 1.5):" + density + "\n" 
  154.             + "屏幕密度DPI(120 / 160 / 240):" + densityDpi + "\n";  
  155.     /*  
  156.      * 下面的代碼即可獲取屏幕的尺寸。 在一個Activity的onCreate方法中,寫入如下代碼: 
  157. DisplayMetrics metric   = new DisplayMetrics();  
  158.      * getWindowManager().getDefaultDisplay().getMetrics(metric); 
  159. * int width  = metric.widthPixels; // 屏幕寬度(像素) 
  160. * int height = metric.heightPixels;   // 屏幕高度(像素) 
  161. * float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)  
  162.      * int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)  
  163.      *   
  164.      * 但是,需要注意的是,在一個低密度的小屏手機上,僅靠上面的代碼是不能獲取正確的尺寸的。  
  165.      * 比如說,一部240x320像素的低密度手機,如果運行上述代碼,獲取到的屏幕尺寸是320x427。  
  166.      * 因此,研究之後發現,若沒有設定多分辨率支持的話  
  167.      * ,Android系統會將240x320的低密度(120)尺寸轉換爲中等密度(160)對應的尺寸,  
  168.      * 這樣的話就大大影響了程序的編碼。所以,需要在工程的AndroidManifest  
  169.      * .xml文件中,加入supports-screens節點,具體的內容如下: <supports-screens  
  170.      * android:smallScreens="true" android:normalScreens="true"  
  171.      * android:largeScreens="true" android:resizeable="true"  
  172.      * android:anyDensity="true" />  
  173.      * 這樣的話,當前的Android程序就支持了多種分辨率,那麼就可以得到正確的物理尺寸了。  
  174.      */ 
  175. }  
  176.  
  177. // 獲取手機經緯度  
  178. public void getLocation() {  
  179.     // 1. 創建一個 LocationManager對象。  
  180.     LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
  181.     // 2. 創建一個 LocationListener對象。  
  182.     LocationListener myGPSListener = new LocationListener() {  
  183.         // 一旦Location發生改變就會調用這個方法  
  184.         public void onLocationChanged(Location location) {  
  185.             double latitude = location.getLatitude();  
  186.             double longitude = location.getLongitude();  
  187.         }  
  188.  
  189.         public void onStatusChanged(String provider, int status,  
  190.                 Bundle extras) {  
  191.         }  
  192.  
  193.         public void onProviderEnabled(String provider) {  
  194.         }  
  195.  
  196.         public void onProviderDisabled(String provider) {  
  197.         }  
  198.     };  
  199.     // 3.向LocationManager 註冊一個LocationListener。  
  200.     Criteria criteria = new Criteria();  
  201.     criteria.setAccuracy(Criteria.ACCURACY_COARSE);  
  202.     criteria.setAltitudeRequired(false);  
  203.     criteria.setCostAllowed(true);  
  204.     criteria.setPowerRequirement(Criteria.POWER_LOW);  
  205.     String provider = locationManager.getBestProvider(criteria, true); // 根據Criteria  
  206.                                                                         // 的設置獲取一個最佳的Provider  
  207.     locationManager  
  208.             .requestLocationUpdates(provider, 50000, myGPSListener);  
  209.     // 4.移除LocationManager 註冊的 LocationListener。  
  210.     locationManager.removeUpdates(myGPSListener);  
  211.  
  212. }  
  213.  
  214. // 當前網絡是否連接  
  215. public boolean isNetConnecting() {  
  216.     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);  
  217.     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();  
  218.     if (networkInfo == null || !networkInfo.isConnected()) {  
  219.         // info.setConnected(false);  
  220.         return false;  
  221.     } else {  
  222.         // info.setConnected(true);  
  223.         return true;  
  224.     }  
  225. }  
  226.  
  227. // 獲取信號強度  
  228. public void getPhoneState() {  
  229.     // 1. 創建telephonyManager 對象。  
  230.     TelephonyManager telephonyManager = (TelephonyManager) /* context. */getSystemService(Context.TELEPHONY_SERVICE);  
  231.     // 2. 創建PhoneStateListener 對象  
  232.     PhoneStateListener MyPhoneListener = new PhoneStateListener() {  
  233.         @Override 
  234.         public void onCellLocationChanged(CellLocation location) {  
  235.             if (location instanceof GsmCellLocation) {// gsm網絡  
  236.                 int CID = ((GsmCellLocation) location).getCid();  
  237.             } else if (location instanceof CdmaCellLocation) {// 其他CDMA等網絡  
  238.                 int ID = ((CdmaCellLocation) location).getBaseStationId();  
  239.             }  
  240.         }  
  241.  
  242.         @Override 
  243.         public void onServiceStateChanged(ServiceState serviceState) {  
  244.             super.onServiceStateChanged(serviceState);  
  245.         }  
  246.  
  247.         @Override 
  248.         public void onSignalStrengthsChanged(SignalStrength signalStrength) {  
  249.             int asu = signalStrength.getGsmSignalStrength();  
  250.             int dbm = -113 + 2 * asu; // 信號強度  
  251.             super.onSignalStrengthsChanged(signalStrength);  
  252.         }  
  253.     };  
  254.     // 3. 監聽信號改變  
  255.     telephonyManager.listen(MyPhoneListener,  
  256.             PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);  
  257.  
  258.     /*  
  259.      * 可能需要的權限 <uses-permission  
  260.      * android:name="android.permission.WAKE_LOCK"></uses-permission>  
  261.      * <uses-permission  
  262.      * android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
  263.      * <uses-permission  
  264.      * android:name="android.permission.ACCESS_FINE_LOCATION"/>  
  265.      * <uses-permission android:name="android.permission.READ_PHONE_STATE"  
  266.      * /> <uses-permission  
  267.      * android:name="android.permission.ACCESS_NETWORK_STATE" />  
  268.      */ 
  269. }  
  270.  
  271. // 獲取手機可用內存和總內存  
  272. private String getSystemMemory() {  
  273.     /*  
  274.      * 在android開發中,有時候我們想獲取手機的一些硬件信息,比如android手機的總內存和可用內存大小。這個該如何實現呢?  
  275.      * 通過讀取文件"/proc/meminfo"  的信息能夠獲取手機Memory的總量,而通過ActivityManager.getMemoryInfo  
  276.      * (ActivityManager.MemoryInfo)方法可以獲取當前的可用Memory量。  
  277.      * "/proc/meminfo"文件記錄了android手機的一些內存信息  
  278.      * ,在命令行窗口裏輸入"adb shell",進入shell環境,輸入  
  279.      * "cat /proc/meminfo"即可在命令行裏顯示meminfo文件的內容,具體如下所示。  
  280.      *   
  281.      * C:\Users\Figo>adb shell # cat /proc/meminfo cat /proc/meminfo  
  282.      * MemTotal: 94096 kB 
  283. * MemFree: 1684 kB  Buffers: 16 kB  Cached: 27160 kB  
  284.      * SwapCached: 0 kB  Active: 35392 kB  Inactive: 44180 kB 
  285. * Active(anon): 26540 kB Inactive(anon): 28244 kB  Active(file): 8852 kB  
  286.      * 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  
  287.      * Mapped: 17960 kB Slab: 3816 kB SReclaimable: 936 kB SUnreclaim: 2880  
  288.      * kB PageTables: 5260 kB NFS_Unstable: 0 kB Bounce: 0 kB 
  289. * WritebackTmp:   0 kB 
  290. * CommitLimit: 47048 kB 
  291. * Committed_AS: 1483784 kB 
  292. * VmallocTotal:  876544 kB 
  293. * VmallocUsed: 15456 kB 
  294. * VmallocChunk: 829444 kB #  
  295.      *   
  296.      * 下面先對"/proc/meminfo"文件裏列出的字段進行粗略解釋: MemTotal: 所有可用RAM大小。 MemFree:  
  297.      * LowFree與HighFree的總和,被系統留着未使用的內存。 Buffers: 用來給文件做緩衝大小。 Cached:  
  298.      * 被高速緩衝存儲器(cache memory)用的內存的大小(等於diskcache minus SwapCache)。  
  299.      * SwapCached:被高速緩衝存儲器(cache  
  300.      * memory)用的交換空間的大小。已經被交換出來的內存,仍然被存放在swapfile中,  
  301.      * 用來在需要的時候很快的被替換而不需要再次打開I/O端口。 Active:  
  302.      * 在活躍使用中的緩衝或高速緩衝存儲器頁面文件的大小,除非非常必要,否則不會被移作他用。 Inactive:  
  303.      * 在不經常使用中的緩衝或高速緩衝存儲器頁面文件的大小,可能被用於其他途徑。 SwapTotal: 交換空間的總大小。 SwapFree:  
  304.      * 未被使用交換空間的大小。 Dirty: 等待被寫回到磁盤的內存大小。 Writeback: 正在被寫回到磁盤的內存大小。  
  305.      * AnonPages:未映射頁的內存大小。 Mapped: 設備和文件等映射的大小。 Slab:  
  306.      * 內核數據結構緩存的大小,可以減少申請和釋放內存帶來的消耗。 SReclaimable:可收回Slab的大小。  
  307.      * SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。  
  308.      * PageTables:管理內存分頁頁面的索引表的大小。 NFS_Unstable:不穩定頁表的大小。  
  309.      * 要獲取android手機總內存大小,只需讀取"/proc/meminfo"文件的第1行,並進行簡單的字符串處理即可。  
  310.      */ 
  311.     String availMemory = getAvailMemory();  
  312.     String totalMemory = getTotalMemory();  
  313.     return "可用內存=" + availMemory + "\n" + "總內存=" + totalMemory;  
  314.  
  315. }// 手機的內存信息主要在/proc/meminfo文件中,其中第一行是總內存,而剩餘內存可通過ActivityManager.MemoryInfo得到。  
  316.  
  317. private String getAvailMemory() {// 獲取android當前可用內存大小  
  318.     ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  319.     MemoryInfo mi = new MemoryInfo();  
  320.     am.getMemoryInfo(mi);  
  321.     // mi.availMem; 當前系統的可用內存  
  322.     return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 將獲取的內存大小規格化  
  323. }  
  324.  
  325. private String getTotalMemory() {  
  326.     String str1 = "/proc/meminfo";// 系統內存信息文件  
  327.     String str2;  
  328.     String[] arrayOfString;  
  329.     long initial_memory = 0;  
  330.     try {  
  331.         FileReader localFileReader = new FileReader(str1);  
  332.         BufferedReader localBufferedReader = new BufferedReader(  
  333.                 localFileReader, 8192);  
  334.         str2 = localBufferedReader.readLine();// 讀取meminfo第一行,系統總內存大小  
  335.  
  336.         arrayOfString = str2.split("\\s+");  
  337.         for (String num : arrayOfString) {  
  338.             Log.i(str2, num + "\t");  
  339.         }  
  340.  
  341.         initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 獲得系統總內存,單位是KB,乘以1024轉換爲Byte  
  342.         localBufferedReader.close();  
  343.  
  344.     } catch (IOException e) {  
  345.     }  
  346.     return Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte轉換爲KB或者MB,內存大小規格化  
  347. }  
  348.  
  349. // 獲取手機CPU信息  
  350. private String getCpuInfo() {  
  351.     String str1 = "/proc/cpuinfo";  
  352.     String str2 = "";  
  353.     String[] cpuInfo = { """" }; // 1-cpu型號 //2-cpu頻率  
  354.     String[] arrayOfString;  
  355.     try {  
  356.         FileReader fr = new FileReader(str1);  
  357.         BufferedReader localBufferedReader = new BufferedReader(fr, 8192);  
  358.         str2 = localBufferedReader.readLine();  
  359.         arrayOfString = str2.split("\\s+");  
  360.         for (int i = 2; i < arrayOfString.length; i++) {  
  361.             cpuInfo[0] = cpuInfo[0] + arrayOfString[i] + " ";  
  362.         }  
  363.         str2 = localBufferedReader.readLine();  
  364.         arrayOfString = str2.split("\\s+");  
  365.         cpuInfo[1] += arrayOfString[2];  
  366.         localBufferedReader.close();  
  367.     } catch (IOException e) {  
  368.     }  
  369.     // Log.i(TAG, "cpuinfo:" + cpuInfo[0] + " " + cpuInfo[1]);  
  370.     return "1-cpu型號:" + cpuInfo[0] + "2-cpu頻率:" + cpuInfo[1];  
  371. }// 和內存信息同理,cpu信息可通過讀取/proc/cpuinfo文件來得到,其中第一行爲cpu型號,第二行爲cpu頻率。  
  372.  
  373. /*  
  374.  * 一、Android 獲取手機中已安裝apk文件信息(PackageInfo、ResolveInfo)(應用圖片、應用名、包名等)  
  375.  * 1、通過PackageManager可獲取手機端已安裝的apk文件的信息,具體代碼如下: PackageManager  
  376.  * packageManager = this.getPackageManager(); List<PackageInfo>  
  377.  * packageInfoList = packageManager.getInstalledPackages(0);  
  378.  * 通過上述方法,可得到手機中安裝的所有應用程序,包括手動安裝的apk包的信息、、系統預裝的應用軟件的信息,要區分這兩類軟件可使用以下方法:  
  379.  * (a)從packageInfoList獲取的packageInfo  
  380.  * ,再通過packageInfo.applicationInfo獲取applicationInfo。  
  381.  * (b)判斷(applicationInfo.flags &  
  382.  * ApplicationInfo.FLAG_SYSTEM)的值,該值大於0時,表示獲取的應用爲系統預裝的應用,反之則爲手動安裝的應用。  
  383.  * (1)獲取應用的代碼: public static List<PackageInfo> getAllApps(Context context) {  
  384.  * List<PackageInfo> apps = new ArrayList<PackageInfo>(); PackageManager  
  385.  * pManager = context.getPackageManager(); //獲取手機內所有應用 List<PackageInfo>  
  386.  * paklist = pManager.getInstalledPackages(0); for (int i = 0; i <  
  387.  * paklist.size(); i++) { PackageInfo pak = (PackageInfo) paklist.get(i);  
  388.  * //判斷是否爲非系統預裝的應用程序 if ((pak.applicationInfo.flags &  
  389.  * pak.applicationInfo.FLAG_SYSTEM) <= 0) { apps.add(pak); } } return apps;  
  390.  * } (2)、獲取圖片、應用名、包名: PackageManager pManager =  
  391.  * MessageSendActivity.this.getPackageManager(); List<PackageInfo> appList =  
  392.  * Utils.getAllApps(MessageSendActivity.this); for(int  
  393.  * i=0;i<appList.size();i++) { PackageInfo pinfo = appList.get(i); shareItem  
  394.  * = new ShareItemInfo();  
  395.  * shareItem.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));  
  396.  * shareItem  
  397.  * .setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString  
  398.  * ()); shareItem.setPackageName(pinfo.applicationInfo.packageName); }  
  399.  * 其中ShareItemInfo 類自己寫的,各位可以忽略 (3)獲取支持分享的應用的代碼: public static  
  400.  * List<ResolveInfo> getShareApps(Context context){ List<ResolveInfo> mApps  
  401.  * = new ArrayList<ResolveInfo>(); Intent intent=new  
  402.  * Intent(Intent.ACTION_SEND,null);  
  403.  * intent.addCategory(Intent.CATEGORY_DEFAULT);  
  404.  * intent.setType("text/plain"); PackageManager pManager =  
  405.  * context.getPackageManager(); mApps =  
  406.  * pManager.queryIntentActivities(intent  
  407.  * ,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); return mApps; }  
  408.  * 由於該方法,返回的並不是PackageInfo 對象。而是ResolveInfo。因此獲取圖片、應用名、包名的方法不一樣,如下:  
  409.  * PackageManager pManager = MessageSendActivity.this.getPackageManager();  
  410.  * List<ResolveInfo> resolveList =  
  411.  * Utils.getShareApps(MessageSendActivity.this); for(int  
  412.  * i=0;i<resolveList.size();i++) { ResolveInfo resolve = resolveList.get(i);  
  413.  * ShareItemInfo shareItem = new ShareItemInfo(); //set Icon  
  414.  * shareItem.setIcon(resolve.loadIcon(pManager)); //set Application Name  
  415.  * shareItem.setLabel(resolve.loadLabel(pManager).toString()); //set Package  
  416.  * Name shareItem.setPackageName(resolve.activityInfo.packageName); } 總結: 通過  
  417.  * PackageInfo 獲取具體信息方法: 包名獲取方法:packageInfo.packageName  
  418.  * icon獲取獲取方法:packageManager.getApplicationIcon(applicationInfo)  
  419.  * 應用名稱獲取方法:packageManager.getApplicationLabel(applicationInfo)  
  420.  * 使用權限獲取方法:packageManager  
  421.  * .getPackageInfo(packageName,PackageManager.GET_PERMISSIONS)  
  422.  * .requestedPermissions 通過 ResolveInfo 獲取具體信息方法:  
  423.  * 包名獲取方法:resolve.activityInfo.packageName  
  424.  * icon獲取獲取方法:resolve.loadIcon(packageManager)  
  425.  * 應用名稱獲取方法:resolve.loadLabel(packageManager).toString()  
  426.  */ 
  427. ublic String getSimCardInfo() {  
  428.     // 在manifest.xml文件中要添加  
  429.     // <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
  430.     /*  
  431.      * TelephonyManager類主要提供了一系列用於訪問與手機通訊相關的狀態和信息的get方法。其中包括手機SIM的狀態和信息  
  432.      * 、電信網絡的狀態及手機用戶的信息。  
  433.      * 在應用程序中可以使用這些get方法獲取相關數據。TelephonyManager類的對象可以通過Context  
  434.      * .getSystemService(Context.TELEPHONY_SERVICE)  
  435.      * 方法來獲得,需要注意的是有些通訊信息的獲取對應用程序的權限有一定的限制  
  436.      * ,在開發的時候需要爲其添加相應的權限。以下列出TelephonyManager類所有方法及說明:  
  437.      * TelephonyManager提供設備上獲取通訊服務信息的入口。 應用程序可以使用這個類方法確定的電信服務商和國家  
  438.      * 以及某些類型的用戶訪問信息。 應用程序也可以註冊一個監聽器到電話收狀態的變化。不需要直接實例化這個類  
  439.      * 使用Context.getSystemService (Context.TELEPHONY_SERVICE)來獲取這個類的實例。  
  440.      */ 
  441.  
  442.     // 解釋:  
  443.     // IMSI是國際移動用戶識別碼的簡稱(International Mobile Subscriber Identity)  
  444.     // IMSI共有15位,其結構如下:  
  445.     // MCC+MNC+MIN  
  446.     // MCC:Mobile Country Code,移動國家碼,共3位,中國爲460;  
  447.     // MNC:Mobile NetworkCode,移動網絡碼,共2位  
  448.     // 在中國,移動的代碼爲電00和02,聯通的代碼爲01,電信的代碼爲03  
  449.     // 合起來就是(也是Android手機中APN配置文件中的代碼):  
  450.     // 中國移動:46000 46002  
  451.     // 中國聯通:46001  
  452.     // 中國電信:46003  
  453.     // 舉例,一個典型的IMSI號碼爲460030912121001  
  454.  
  455.     // IMEI是International Mobile Equipment Identity (國際移動設備標識)的簡稱  
  456.     // IMEI由15位數字組成的”電子串號”,它與每臺手機一一對應,而且該碼是全世界唯一的  
  457.     // 其組成爲:  
  458.     // 1. 前6位數(TAC)是”型號覈准號碼”,一般代表機型  
  459.     // 2. 接着的2位數(FAC)是”最後裝配號”,一般代表產地  
  460.     // 3. 之後的6位數(SNR)是”串號”,一般代表生產順序號  
  461.     // 4. 最後1位數(SP)通常是”0″,爲檢驗碼,目前暫備用  
  462.  
  463.     TelephonyManager tm = (TelephonyManager) this 
  464.             .getSystemService(TELEPHONY_SERVICE);  
  465.     /*  
  466.      * 電話狀態: 1.tm.CALL_STATE_IDLE=0 無活動,無任何狀態時 2.tm.CALL_STATE_RINGING=1  
  467.      * 響鈴,電話進來時 3.tm.CALL_STATE_OFFHOOK=2 摘機  
  468.      */ 
  469.     tm.getCallState();// int  
  470.  
  471.     /*  
  472.      * 電話方位:  
  473.      */ 
  474.     // 返回當前移動終端的位置  
  475.     CellLocation location = tm.getCellLocation();  
  476.     // 請求位置更新,如果更新將產生廣播,接收對象爲註冊LISTEN_CELL_LOCATION的對象,需要的permission名稱爲  
  477.     // ACCESS_COARSE_LOCATION。  
  478.     location.requestLocationUpdate();  
  479.  
  480.     /**  
  481.      * 獲取數據活動狀態  
  482.      *   
  483.      * DATA_ACTIVITY_IN 數據連接狀態:活動,正在接受數據 DATA_ACTIVITY_OUT 數據連接狀態:活動,正在發送數據  
  484.      * DATA_ACTIVITY_INOUT 數據連接狀態:活動,正在接受和發送數據 DATA_ACTIVITY_NONE  
  485.      * 數據連接狀態:活動,但無數據發送和接受  
  486.      */ 
  487.     tm.getDataActivity();  
  488.  
  489.     /**  
  490.      * 獲取數據連接狀態  
  491.      *   
  492.      * DATA_CONNECTED 數據連接狀態:已連接 DATA_CONNECTING 數據連接狀態:正在連接  
  493.      * DATA_DISCONNECTED 數據連接狀態:斷開 DATA_SUSPENDED 數據連接狀態:暫停  
  494.      */ 
  495.     tm.getDataState();  
  496.  
  497.     /**  
  498.      * 返回當前移動終端的唯一標識,設備ID  
  499.      *   
  500.      * 如果是GSM網絡,返回IMEI;如果是CDMA網絡,返回MEID Return null if device ID is not  
  501.      * available.  
  502.      */ 
  503.     String Imei = tm.getDeviceId();// String  
  504.  
  505.     /*  
  506.      * 返回移動終端的軟件版本,例如:GSM手機的IMEI/SV碼。 設備的軟件版本號: 例如:the IMEI/SV(software  
  507.      * version) for GSM phones. Return null if the software version is not  
  508.      * available.  
  509.      */ 
  510.     tm.getDeviceSoftwareVersion();// String  
  511.  
  512.     /*  
  513.      * 手機號: GSM手機的 MSISDN. Return null if it is unavailable.  
  514.      */ 
  515.     String phoneNum = tm.getLine1Number();// String  
  516.  
  517.     /*  
  518.      * 獲取ISO標準的國家碼,即國際長途區號。 注意:僅當用戶已在網絡註冊後有效。 在CDMA網絡中結果也許不可靠。  
  519.      */ 
  520.     tm.getNetworkCountryIso();// String  
  521.  
  522.     /*  
  523.      * MCC+MNC(mobile country code + mobile network code) 注意:僅當用戶已在網絡註冊時有效。  
  524.      * 在CDMA網絡中結果也許不可靠。  
  525.      */ 
  526.     tm.getNetworkOperator();// String  
  527.  
  528.     /*  
  529.      * 按照字母次序的current registered operator(當前已註冊的用戶)的名字 注意:僅當用戶已在網絡註冊時有效。  
  530.      * 在CDMA網絡中結果也許不可靠。  
  531.      */ 
  532.  
  533.     tm.getNetworkOperatorName();// String  
  534.  
  535.     /*  
  536.      * 當前使用的網絡類型: 例如: NETWORK_TYPE_UNKNOWN 網絡類型未知 0 NETWORK_TYPE_GPRS GPRS網絡  
  537.      * 1 NETWORK_TYPE_EDGE EDGE網絡 2 NETWORK_TYPE_UMTS UMTS網絡 3  
  538.      * NETWORK_TYPE_HSDPA HSDPA網絡 8 NETWORK_TYPE_HSUPA HSUPA網絡 9  
  539.      * NETWORK_TYPE_HSPA HSPA網絡 10 NETWORK_TYPE_CDMA CDMA網絡,IS95A 或 IS95B. 4  
  540.      * NETWORK_TYPE_EVDO_0 EVDO網絡, revision 0. 5 NETWORK_TYPE_EVDO_A EVDO網絡,  
  541.      * revision A. 6 NETWORK_TYPE_1xRTT 1xRTT網絡 7  
  542.      */ 
  543.     tm.getNetworkType();// int  
  544.  
  545.     /*  
  546.      * 手機類型: 例如: PHONE_TYPE_NONE 無信號 PHONE_TYPE_GSM GSM信號 PHONE_TYPE_CDMA  
  547.      * CDMA信號  
  548.      */ 
  549.     tm.getPhoneType();// int  
  550.  
  551.     /*  
  552.      * Returns the ISO country code equivalent for the SIM provider's  
  553.      * country code. 獲取ISO國家碼,相當於提供SIM卡的國家碼。  
  554.      */ 
  555.     tm.getSimCountryIso();// String  
  556.  
  557.     /*  
  558.      * Returns the MCC+MNC (mobile country code + mobile network code) of  
  559.      * the provider of the SIM. 5 or 6 decimal digits.  
  560.      * 獲取SIM卡提供的移動國家碼和移動網絡碼.5或6位的十進制數字. SIM卡的狀態必須是  
  561.      * SIM_STATE_READY(使用getSimState()判斷).  
  562.      */ 
  563.     tm.getSimOperator();// String  
  564.  
  565.     /*  
  566.      * 服務商名稱: 例如:中國移動、聯通 SIM卡的狀態必須是 SIM_STATE_READY(使用getSimState()判斷).  
  567.      */ 
  568.     tm.getSimOperatorName();// String  
  569.  
  570.     /*  
  571.      * SIM卡的序列號: 需要權限:READ_PHONE_STATE  
  572.      */ 
  573.     tm.getSimSerialNumber();// String  
  574.  
  575.     /*  
  576.      * SIM的狀態信息: SIM_STATE_UNKNOWN 未知狀態 0 SIM_STATE_ABSENT 沒插卡 1  
  577.      * SIM_STATE_PIN_REQUIRED 鎖定狀態,需要用戶的PIN碼解鎖 2 SIM_STATE_PUK_REQUIRED  
  578.      * 鎖定狀態,需要用戶的PUK碼解鎖 3 SIM_STATE_NETWORK_LOCKED 鎖定狀態,需要網絡的PIN碼解鎖 4  
  579.      * SIM_STATE_READY 就緒狀態 5  
  580.      */ 
  581.     tm.getSimState();// int  
  582.  
  583.     /*  
  584.      * 唯一的用戶ID: 例如:IMSI(國際移動用戶識別碼) for a GSM phone. 需要權限:READ_PHONE_STATE  
  585.      */ 
  586.     tm.getSubscriberId();// String  
  587.  
  588.     /*  
  589.      * 取得和語音郵件相關的標籤,即爲識別符 需要權限:READ_PHONE_STATE  
  590.      */ 
  591.  
  592.     tm.getVoiceMailAlphaTag();// String  
  593.  
  594.     /*  
  595.      * 獲取語音郵件號碼: 需要權限:READ_PHONE_STATE  
  596.      */ 
  597.     tm.getVoiceMailNumber();// String  
  598.  
  599.     /*  
  600.      * ICC卡是否存在  
  601.      */ 
  602.     tm.hasIccCard();// boolean  
  603.  
  604.     /*  
  605.      * 是否漫遊: (在GSM用途下)  
  606.      */ 
  607.     tm.isNetworkRoaming();//  
  608.  
  609.     String ProvidersName = null;  
  610.     // 返回唯一的用戶ID;就是這張卡的編號神馬的  
  611.     String IMSI = tm.getSubscriberId(); // 國際移動用戶識別碼  
  612.     // IMSI號前面3位460是國家,緊接着後面2位00 02是中國移動,01是中國聯通,03是中國電信。  
  613.     System.out.println(IMSI);  
  614.     if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {  
  615.         ProvidersName = "中國移動";  
  616.     } else if (IMSI.startsWith("46001")) {  
  617.  
  618.         ProvidersName = "中國聯通";  
  619.  
  620.     } else if (IMSI.startsWith("46003")) {  
  621.  
  622.         ProvidersName = "中國電信";  
  623.  
  624.     }  
  625.     // 返回當前移動終端附近移動終端的信息  
  626.     /*  
  627.      * 附近的電話的信息: 類型:List<NeighboringCellInfo>  
  628.      * 需要權限:android.Manifest.permission#ACCESS_COARSE_UPDATES  
  629.      */ 
  630.     List<NeighboringCellInfo> infos = tm.getNeighboringCellInfo();  
  631.     for (NeighboringCellInfo info : infos) {  
  632.         // 獲取鄰居小區號  
  633.         int cid = info.getCid();  
  634.         // 獲取鄰居小區LAC,LAC:  
  635.         // 位置區域碼。爲了確定移動臺的位置,每個GSM/PLMN的覆蓋區都被劃分成許多位置區,LAC則用於標識不同的位置區。  
  636.         info.getLac();  
  637.         info.getNetworkType();  
  638.         info.getPsc();  
  639.         // 獲取鄰居小區信號強度  
  640.         info.getRssi();  
  641.     }  
  642.     return "手機號碼:" + phoneNum + "\n" + "服務商:" + ProvidersName+"\n" + "IMEI:" + Imei;  
  643.  
  644. }  
  645.  
  646.  
  647. // 顯示信息對話框  
  648. public void showDialog(String title, String info) {  
  649.     AlertDialog dialog = new AlertDialog.Builder(this)  
  650.             .setTitle(title)  
  651.             .setMessage(info)  
  652.             .setPositiveButton("close",  
  653.                     new DialogInterface.OnClickListener() {  
  654.                         @Override 
  655.                         public void onClick(DialogInterface dialog,  
  656.                                 int which) {  
  657.                             dialog.cancel();  
  658.                             dialog = null;  
  659.                         }  
  660.                     }).create();  
  661.     dialog.show();  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章