爲了實現一個功能,須要蒐集手機信息,本身先在網上找了相關信息進行了彙總,主要是聚集手機的信息,通常想要的信息在手機設置->關於手機->狀態消息裏面包含了手機的各類信息,下面的代碼中也主要顯示了那些信息,可是源碼的方法我尚未看,先把總結的貼出來。先上圖(太多就截取幾個)。android
- // 獲取Android手機中SD卡存儲信息 獲取剩餘空間
- public void getSDCardInfo() {
- // 在manifest.xml文件中要添加
- /*
- * <uses-permission
- * android:name="android.permission.WRITE_EXTERNAL_STORAGE">
- * </uses-permission>
- */
- // 須要判斷手機上面SD卡是否插好,若是有SD卡的狀況下,咱們才能夠訪問獲得並獲取到它的相關信息,固然如下這個語句須要用if作判斷
- if (Environment.getExternalStorageState().equals(
- Environment.MEDIA_MOUNTED)) {
- // 取得sdcard文件路徑
- File path = Environment.getExternalStorageDirectory();
- StatFs statfs = new StatFs(path.getPath());
- // 獲取block的SIZE
- long blocSize = statfs.getBlockSize();
- // 獲取BLOCK數量
- long totalBlocks = statfs.getBlockCount();
- // 空閒的Block的數量
- long availaBlock = statfs.getAvailableBlocks();
- // 計算總空間大小和空閒的空間大小
- // 存儲空間大小跟空閒的存儲空間大小就被計算出來了。
- long availableSize = blocSize * availaBlock;
- // (availableBlocks * blockSize)/1024 KIB 單位
- // (availableBlocks * blockSize)/1024 /1024 MIB單位
- long allSize = blocSize * totalBlocks;
- }
- }
- // 獲取手機ip method-1
- public String getLocalIpAddress() {
- try {
- for (Enumeration<NetworkInterface> en = NetworkInterface
- .getNetworkInterfaces(); en.hasMoreElements();) {
- NetworkInterface intf = en.nextElement();
- for (Enumeration<InetAddress> enumIpAddr = intf
- .getInetAddresses(); enumIpAddr.hasMoreElements();) {
- InetAddress inetAddress = enumIpAddr.nextElement();
- if (!inetAddress.isLoopbackAddress()) {
- Toast.makeText(this,
- inetAddress.getHostAddress().toString(), 3000)
- .show();
- return inetAddress.getHostAddress().toString();
- }
- }
- }
- } catch (SocketException ex) {
- ex.printStackTrace();
- // Log.e("ifo", ex.toString());
- }
- return "";
- } // 須要權限<uses-permission
- // android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
- // <uses-permission
- // android:name="android.permission.INTERNET"></uses-permission>
- // 獲取手機ip method-2
- // 首先設置用戶權限
- // <uses-permission
- // android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
- // <uses-permission
- // android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
- // <uses-permission
- // android:name="android.permission.WAKE_LOCK"></uses-permission>
- public String getLocalIpAddress2() {
- // 獲取wifi服務
- WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
- // 判斷wifi是否開啓
- if (!wifiManager.isWifiEnabled()) {
- wifiManager.setWifiEnabled(true);
- }
- WifiInfo wifiInfo = wifiManager.getConnectionInfo();
- int ipAddress = wifiInfo.getIpAddress();
- String ip = intToIp(ipAddress);
- return ip;
- }
- private String intToIp(int i) {
- return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF)
- + "." + (i >> 24 & 0xFF);
- }
- // 查看本機外網IP
- /*
- * 該方法須要設備支持上網 查看
- * System.out.println((GetNetIp("http://fw.qq.com/ipaddress"))); 加權限
- * <uses-permission
- * android:name="android.permission.INTERNET"></uses-permission>
- * 經過獲取http://fw.qq.com/ipaddress網頁取得外網IP 這裏有幾個查看IP的網址而後提取IP試試。
- * http://ip168.com/ http://www.cmyip.com/ http://city.ip138.com/ip2city.asp
- */
- public String GetNetIp(String ipaddr) {
- URL infoUrl = null;
- InputStream inStream = null;
- try {
- infoUrl = new URL(ipaddr);
- URLConnection connection = infoUrl.openConnection();
- HttpURLConnection httpConnection = (HttpURLConnection) connection;
- int responseCode = httpConnection.getResponseCode();
- if (responseCode == HttpURLConnection.HTTP_OK) {
- inStream = httpConnection.getInputStream();
- BufferedReader reader = new BufferedReader(
- new InputStreamReader(inStream, "utf-8"));
- StringBuilder strber = new StringBuilder();
- String line = null;
- while ((line = reader.readLine()) != null)
- strber.append(line + "\n");
- inStream.close();
- return strber.toString();
- }
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return "";
- }
- // 獲取手機MAC地址
- private String getMacAddress() {
- String result = "";
- WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
- WifiInfo wifiInfo = wifiManager.getConnectionInfo();
- result = wifiInfo.getMacAddress();
- // Log.i(TAG, "macAdd:" + result);
- return result;
- }
- // 獲取手機屏幕高度
- private String getWeithAndHeight() {
- // 這種方式在service中沒法使用,
- DisplayMetrics dm = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(dm);
- int width = dm.widthPixels; // 寬
- int height = dm.heightPixels; // 高
- float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
- int densityDpi = dm.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
- // 在service中也能獲得高和寬
- WindowManager mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
- width = mWindowManager.getDefaultDisplay().getWidth();
- height = mWindowManager.getDefaultDisplay().getHeight();
- // 居中顯示Toast
- Toast msg = Toast.makeText(this, "寬=" + width + " 高=" + height,
- Toast.LENGTH_LONG);
- msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2,
- msg.getYOffset() / 2);
- msg.show();
- return "(像素)寬:" + width + "\n" + "(像素)高:" + height + "\n"
- + "屏幕密度(0.75 / 1.0 / 1.5):" + density + "\n"
- + "屏幕密度DPI(120 / 160 / 240):" + densityDpi + "\n";
- /*
- * 下面的代碼便可獲取屏幕的尺寸。 在一個Activity的onCreate方法中,寫入以下代碼:
- DisplayMetrics metric = new DisplayMetrics();
- * getWindowManager().getDefaultDisplay().getMetrics(metric);
- * int width = metric.widthPixels; // 屏幕寬度(像素)
- * int height = metric.heightPixels; // 屏幕高度(像素)
- * float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
- * int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
- *
- * 可是,須要注意的是,在一個低密度的小屏手機上,僅靠上面的代碼是不能獲取正確的尺寸的。
- * 好比說,一部240x320像素的低密度手機,若是運行上述代碼,獲取到的屏幕尺寸是320x427。
- * 所以,研究以後發現,若沒有設定多分辨率支持的話
- * ,Android系統會將240x320的低密度(120)尺寸轉換爲中等密度(160)對應的尺寸,
- * 這樣的話就大大影響了程序的編碼。因此,須要在工程的AndroidManifest
- * .xml文件中,加入supports-screens節點,具體的內容以下: <supports-screens
- * android:smallScreens="true" android:normalScreens="true"
- * android:largeScreens="true" android:resizeable="true"
- * android:anyDensity="true" />
- * 這樣的話,當前的Android程序就支持了多種分辨率,那麼就能夠獲得正確的物理尺寸了。
- */
- }
- // 獲取手機經緯度
- public void getLocation() {
- // 1. 建立一個 LocationManager對象。
- LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- // 2. 建立一個 LocationListener對象。
- LocationListener myGPSListener = new LocationListener() {
- // 一旦Location發生改變就會調用這個方法
- public void onLocationChanged(Location location) {
- double latitude = location.getLatitude();
- double longitude = location.getLongitude();
- }
- public void onStatusChanged(String provider, int status,
- Bundle extras) {
- }
- public void onProviderEnabled(String provider) {
- }
- public void onProviderDisabled(String provider) {
- }
- };
- // 3.向LocationManager 註冊一個LocationListener。
- Criteria criteria = new Criteria();
- criteria.setAccuracy(Criteria.ACCURACY_COARSE);
- criteria.setAltitudeRequired(false);
- criteria.setCostAllowed(true);
- criteria.setPowerRequirement(Criteria.POWER_LOW);
- String provider = locationManager.getBestProvider(criteria, true); // 根據Criteria
- // 的設置獲取一個最佳的Provider
- locationManager
- .requestLocationUpdates(provider, 5000, 0, myGPSListener);
- // 4.移除LocationManager 註冊的 LocationListener。
- locationManager.removeUpdates(myGPSListener);
- }
- // 當前網絡是否鏈接
- public boolean isNetConnecting() {
- ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
- if (networkInfo == null || !networkInfo.isConnected()) {
- // info.setConnected(false);
- return false;
- } else {
- // info.setConnected(true);
- return true;
- }
- }
- // 獲取信號強度
- public void getPhoneState() {
- // 1. 建立telephonyManager 對象。
- TelephonyManager telephonyManager = (TelephonyManager) /* context. */getSystemService(Context.TELEPHONY_SERVICE);
- // 2. 建立PhoneStateListener 對象
- PhoneStateListener MyPhoneListener = new PhoneStateListener() {
- @Override
- public void onCellLocationChanged(CellLocation location) {
- if (location instanceof GsmCellLocation) {// gsm網絡
- int CID = ((GsmCellLocation) location).getCid();
- } else if (location instanceof CdmaCellLocation) {// 其餘CDMA等網絡
- int ID = ((CdmaCellLocation) location).getBaseStationId();
- }
- }
- @Override
- public void onServiceStateChanged(ServiceState serviceState) {
- super.onServiceStateChanged(serviceState);
- }
- @Override
- public void onSignalStrengthsChanged(SignalStrength signalStrength) {
- int asu = signalStrength.getGsmSignalStrength();
- int dbm = -113 + 2 * asu; // 信號強度
- super.onSignalStrengthsChanged(signalStrength);
- }
- };
- // 3. 監聽信號改變
- telephonyManager.listen(MyPhoneListener,
- PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
- /*
- * 可能須要的權限 <uses-permission
- * android:name="android.permission.WAKE_LOCK"></uses-permission>
- * <uses-permission
- * android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- * <uses-permission
- * android:name="android.permission.ACCESS_FINE_LOCATION"/>
- * <uses-permission android:name="android.permission.READ_PHONE_STATE"
- * /> <uses-permission
- * android:name="android.permission.ACCESS_NETWORK_STATE" />
- */
- }
- // 獲取手機可用內存和總內存
- private String getSystemMemory() {
- /*
- * 在android開發中,有時候咱們想獲取手機的一些硬件信息,好比android手機的總內存和可用內存大小。這個該如何實現呢?
- * 經過讀取文件"/proc/meminfo" 的信息可以獲取手機Memory的總量,而經過ActivityManager.getMemoryInfo
- * (ActivityManager.MemoryInfo)方法能夠獲取當前的可用Memory量。
- * "/proc/meminfo"文件記錄了android手機的一些內存信息
- * ,在命令行窗口裏輸入"adb shell",進入shell環境,輸入
- * "cat /proc/meminfo"便可在命令行裏顯示meminfo文件的內容,具體以下所示。
- *
- * C:\Users\Figo>adb shell # cat /proc/meminfo cat /proc/meminfo
- * MemTotal: 94096 kB
- * MemFree: 1684 kB Buffers: 16 kB Cached: 27160 kB
- * SwapCached: 0 kB Active: 35392 kB Inactive: 44180 kB
- * Active(anon): 26540 kB Inactive(anon): 28244 kB Active(file): 8852 kB
- * 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
- * Mapped: 17960 kB Slab: 3816 kB SReclaimable: 936 kB SUnreclaim: 2880
- * kB PageTables: 5260 kB NFS_Unstable: 0 kB Bounce: 0 kB
- * WritebackTmp: 0 kB
- * CommitLimit: 47048 kB
- * Committed_AS: 1483784 kB
- * VmallocTotal: 876544 kB
- * VmallocUsed: 15456 kB
- * VmallocChunk: 829444 kB #
- *
- * 下面先對"/proc/meminfo"文件裏列出的字段進行粗略解釋: MemTotal: 全部可用RAM大小。 MemFree:
- * LowFree與HighFree的總和,被系統留着未使用的內存。 Buffers: 用來給文件作緩衝大小。 Cached:
- * 被高速緩衝存儲器(cache memory)用的內存的大小(等於diskcache minus SwapCache)。
- * SwapCached:被高速緩衝存儲器(cache
- * memory)用的交換空間的大小。已經被交換出來的內存,仍然被存放在swapfile中,
- * 用來在須要的時候很快的被替換而不須要再次打開I/O端口。 Active:
- * 在活躍使用中的緩衝或高速緩衝存儲器頁面文件的大小,除非很是必要,不然不會被移做他用。 Inactive:
- * 在不常用中的緩衝或高速緩衝存儲器頁面文件的大小,可能被用於其餘途徑。 SwapTotal: 交換空間的總大小。 SwapFree:
- * 未被使用交換空間的大小。 Dirty: 等待被寫回到磁盤的內存大小。 Writeback: 正在被寫回到磁盤的內存大小。
- * AnonPages:未映射頁的內存大小。 Mapped: 設備和文件等映射的大小。 Slab:
- * 內核數據結構緩存的大小,能夠減小申請和釋放內存帶來的消耗。 SReclaimable:可收回Slab的大小。
- * SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。
- * PageTables:管理內存分頁頁面的索引表的大小。 NFS_Unstable:不穩定頁表的大小。
- * 要獲取android手機總內存大小,只需讀取"/proc/meminfo"文件的第1行,並進行簡單的字符串處理便可。
- */
- String availMemory = getAvailMemory();
- String totalMemory = getTotalMemory();
- return "可用內存=" + availMemory + "\n" + "總內存=" + totalMemory;
- }// 手機的內存信息主要在/proc/meminfo文件中,其中第一行是總內存,而剩餘內存可經過ActivityManager.MemoryInfo獲得。
- private String getAvailMemory() {// 獲取android當前可用內存大小
- ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
- MemoryInfo mi = new MemoryInfo();
- am.getMemoryInfo(mi);
- // mi.availMem; 當前系統的可用內存
- return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 將獲取的內存大小規格化
- }
- private String getTotalMemory() {
- String str1 = "/proc/meminfo";// 系統內存信息文件
- String str2;
- String[] arrayOfString;
- long initial_memory = 0;
- try {
- FileReader localFileReader = new FileReader(str1);
- BufferedReader localBufferedReader = new BufferedReader(
- localFileReader, 8192);
- str2 = localBufferedReader.readLine();// 讀取meminfo第一行,系統總內存大小
- arrayOfString = str2.split("\\s+");
- for (String num : arrayOfString) {
- Log.i(str2, num + "\t");
- }
- initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 得到系統總內存,單位是KB,乘以1024轉換爲Byte
- localBufferedReader.close();
- } catch (IOException e) {
- }
- return Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte轉換爲KB或者MB,內存大小規格化
- }
- // 獲取手機CPU信息
- private String getCpuInfo() {
- String str1 = "/proc/cpuinfo";
- String str2 = "";
- String[] cpuInfo = { "", "" }; // 1-cpu型號 //2-cpu頻率
- String[] arrayOfString;
- try {
- FileReader fr = new FileReader(str1);
- BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
- str2 = localBufferedReader.readLine();
- arrayOfString = str2.split("\\s+");
- for (int i = 2; i < arrayOfString.length; i++) {
- cpuInfo[0] = cpuInfo[0] + arrayOfString[i] + " ";
- }
- str2 = localBufferedReader.readLine();
- arrayOfString = str2.split("\\s+");
- cpuInfo[1] += arrayOfString[2];
- localBufferedReader.close();
- } catch (IOException e) {
- }
- // Log.i(TAG, "cpuinfo:" + cpuInfo[0] + " " + cpuInfo[1]);
- return "1-cpu型號:" + cpuInfo[0] + "2-cpu頻率:" + cpuInfo[1];
- }// 和內存信息同理,cpu信息可經過讀取/proc/cpuinfo文件來獲得,其中第一行爲cpu型號,第二行爲cpu頻率。
- /*
- * 1、Android 獲取手機中已安裝apk文件信息(PackageInfo、ResolveInfo)(應用圖片、應用名、包名等)
- * 一、經過PackageManager可獲取手機端已安裝的apk文件的信息,具體代碼以下: PackageManager
- * packageManager = this.getPackageManager(); List<PackageInfo>
- * packageInfoList = packageManager.getInstalledPackages(0);
- * 經過上述方法,可獲得手機中安裝的全部應用程序,包括手動安裝的apk包的信息、、系統預裝的應用軟件的信息,要區分這兩類軟件可以使用如下方法:
- * (a)從packageInfoList獲取的packageInfo
- * ,再經過packageInfo.applicationInfo獲取applicationInfo。
- * (b)判斷(applicationInfo.flags &
- * ApplicationInfo.FLAG_SYSTEM)的值,該值大於0時,表示獲取的應用爲系統預裝的應用,反之則爲手動安裝的應用。
- * (1)獲取應用的代碼: public static List<PackageInfo> getAllApps(Context context) {
- * List<PackageInfo> apps = new ArrayList<PackageInfo>(); PackageManager
- * pManager = context.getPackageManager(); //獲取手機內全部應用 List<PackageInfo>
- * paklist = pManager.getInstalledPackages(0); for (int i = 0; i <
- * paklist.size(); i++) { PackageInfo pak = (PackageInfo) paklist.get(i);
- * //判斷是否爲非系統預裝的應用程序 if ((pak.applicationInfo.flags &
- * pak.applicationInfo.FLAG_SYSTEM) <= 0) { apps.add(pak); } } return apps;
- * } (2)、獲取圖片、應用名、包名: PackageManager pManager =
- * MessageSendActivity.this.getPackageManager(); List<PackageInfo> appList =
- * Utils.getAllApps(MessageSendActivity.this); for(int
- * i=0;i<appList.size();i++) { PackageInfo pinfo = appList.get(i); shareItem
- * = new ShareItemInfo();
- * shareItem.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));
- * shareItem
- * .setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString
- * ()); shareItem.setPackageName(pinfo.applicationInfo.packageName); }
- * 其中ShareItemInfo 類本身寫的,各位能夠忽略 (3)獲取支持分享的應用的代碼: public static
- * List<ResolveInfo> getShareApps(Context context){ List<ResolveInfo> mApps
- * = new ArrayList<ResolveInfo>(); Intent intent=new
- * Intent(Intent.ACTION_SEND,null);
- * intent.addCategory(Intent.CATEGORY_DEFAULT);
- * intent.setType("text/plain"); PackageManager pManager =
- * context.getPackageManager(); mApps =
- * pManager.queryIntentActivities(intent
- * ,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); return mApps; }
- * 因爲該方法,返回的並非PackageInfo 對象。而是ResolveInfo。所以獲取圖片、應用名、包名的方法不同,以下:
- * PackageManager pManager = MessageSendActivity.this.getPackageManager();
- * List<ResolveInfo> resolveList =
- * Utils.getShareApps(MessageSendActivity.this); for(int
- * i=0;i<resolveList.size();i++) { ResolveInfo resolve = resolveList.get(i);
- * ShareItemInfo shareItem = new ShareItemInfo(); //set Icon
- * shareItem.setIcon(resolve.loadIcon(pManager)); //set Application Name
- * shareItem.setLabel(resolve.loadLabel(pManager).toString()); //set Package
- * Name shareItem.setPackageName(resolve.activityInfo.packageName); } 總結: 經過
- * PackageInfo 獲取具體信息方法: 包名獲取方法:packageInfo.packageName
- * icon獲取獲取方法:packageManager.getApplicationIcon(applicationInfo)
- * 應用名稱獲取方法:packageManager.getApplicationLabel(applicationInfo)
- * 使用權限獲取方法:packageManager
- * .getPackageInfo(packageName,PackageManager.GET_PERMISSIONS)
- * .requestedPermissions 經過 ResolveInfo 獲取具體信息方法:
- * 包名獲取方法:resolve.activityInfo.packageName
- * icon獲取獲取方法:resolve.loadIcon(packageManager)
- * 應用名稱獲取方法:resolve.loadLabel(packageManager).toString()
- */
- ublic String getSimCardInfo() {
- // 在manifest.xml文件中要添加
- // <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
- /*
- * TelephonyManager類主要提供了一系列用於訪問與手機通信相關的狀態和信息的get方法。其中包括手機SIM的狀態和信息
- * 、電信網絡的狀態及手機用戶的信息。
- * 在應用程序中可使用這些get方法獲取相關數據。TelephonyManager類的對象能夠經過Context
- * .getSystemService(Context.TELEPHONY_SERVICE)
- * 方法來得到,須要注意的是有些通信信息的獲取對應用程序的權限有必定的限制
- * ,在開發的時候須要爲其添加相應的權限。如下列出TelephonyManager類全部方法及說明:
- * TelephonyManager提供設備上獲取通信服務信息的入口。 應用程序可使用這個類方法肯定的電信服務商和國家
- * 以及某些類型的用戶訪問信息。 應用程序也能夠註冊一個監聽器到電話收狀態的變化。不須要直接實例化這個類
- * 使用Context.getSystemService (Context.TELEPHONY_SERVICE)來獲取這個類的實例。
- */
- // 解釋:
- // IMSI是國際移動用戶識別碼的簡稱(International Mobile Subscriber Identity)
- // IMSI共有15位,其結構以下:
- // MCC+MNC+MIN
- // MCC:Mobile Country Code,移動國家碼,共3位,中國爲460;
- // MNC:Mobile NetworkCode,移動網絡碼,共2位
- // 在中國,移動的代碼爲電00和02,聯通的代碼爲01,電信的代碼爲03
- // 合起來就是(也是Android手機中APN配置文件中的代碼):
- // 中國移動:46000 46002
- // 中國聯通:46001
- // 中國電信:46003
- // 舉例,一個典型的IMSI號碼爲460030912121001
- // IMEI是International Mobile Equipment Identity (國際移動設備標識)的簡稱
- // IMEI由15位數字組成的」電子串號」,它與每臺手機一一對應,並且該碼是全世界惟一的
- // 其組成爲:
- // 1. 前6位數(TAC)是」型號覈准號碼」,通常表明機型
- // 2. 接着的2位數(FAC)是」最後裝配號」,通常表明產地
- // 3. 以後的6位數(SNR)是」串號」,通常表明生產順序號
- // 4. 最後1位數(SP)一般是」0″,爲檢驗碼,目前暫備用
- TelephonyManager tm = (TelephonyManager) this
- .getSystemService(TELEPHONY_SERVICE);
- /*
- * 電話狀態: 1.tm.CALL_STATE_IDLE=0 無活動,無任何狀態時 2.tm.CALL_STATE_RINGING=1
- * 響鈴,電話進來時 3.tm.CALL_STATE_OFFHOOK=2 摘機
- */
- tm.getCallState();// int
- /*
- * 電話方位:
- */
- // 返回當前移動終端的位置
- CellLocation location = tm.getCellLocation();
- // 請求位置更新,若是更新將產生廣播,接收對象爲註冊LISTEN_CELL_LOCATION的對象,須要的permission名稱爲
- // ACCESS_COARSE_LOCATION。
- location.requestLocationUpdate();
- /**
- * 獲取數據活動狀態
- *
- * DATA_ACTIVITY_IN 數據鏈接狀態:活動,正在接受數據 DATA_ACTIVITY_OUT 數據鏈接狀態:活動,正在發送數據
- * DATA_ACTIVITY_INOUT 數據鏈接狀態:活動,正在接受和發送數據 DATA_ACTIVITY_NONE
- * 數據鏈接狀態:活動,但無數據發送和接受
- */
- tm.getDataActivity();
- /**
- * 獲取數據鏈接狀態
- *
- * DATA_CONNECTED 數據鏈接狀態:已鏈接 DATA_CONNECTING 數據鏈接狀態:正在鏈接
- * DATA_DISCONNECTED 數據鏈接狀態:斷開 DATA_SUSPENDED 數據鏈接狀態:暫停
- */
- tm.getDataState();
- /**
- * 返回當前移動終端的惟一標識,設備ID
- *
- * 若是是GSM網絡,返回IMEI;若是是CDMA網絡,返回MEID Return null if device ID is not
- * available.
- */
- String Imei = tm.getDeviceId();// String
- /*
- * 返回移動終端的軟件版本,例如:GSM手機的IMEI/SV碼。 設備的軟件版本號: 例如:the IMEI/SV(software
- * version) for GSM phones. Return null if the software version is not
- * available.
- */
- tm.getDeviceSoftwareVersion();// String
- /*
- * 手機號: GSM手機的 MSISDN. Return null if it is unavailable.
- */
- String phoneNum = tm.getLine1Number();// String
- /*
- * 獲取ISO標準的國家碼,即國際長途區號。 注意:僅當用戶已在網絡註冊後有效。 在CDMA網絡中結果也許不可靠。
- */
- tm.getNetworkCountryIso();// String
- /*
- * MCC+MNC(mobile country code + mobile network code) 注意:僅當用戶已在網絡註冊時有效。
- * 在CDMA網絡中結果也許不可靠。
- */
- tm.getNetworkOperator();// String
- /*
- * 按照字母次序的current registered operator(當前已註冊的用戶)的名字 注意:僅當用戶已在網絡註冊時有效。
- * 在CDMA網絡中結果也許不可靠。
- */
- tm.getNetworkOperatorName();// String
- /*
- * 當前使用的網絡類型: 例如: NETWORK_TYPE_UNKNOWN 網絡類型未知 0 NETWORK_TYPE_GPRS GPRS網絡
- * 1 NETWORK_TYPE_EDGE EDGE網絡 2 NETWORK_TYPE_UMTS UMTS網絡 3
- * NETWORK_TYPE_HSDPA HSDPA網絡 8 NETWORK_TYPE_HSUPA HSUPA網絡 9
- * NETWORK_TYPE_HSPA HSPA網絡 10 NETWORK_TYPE_CDMA CDMA網絡,IS95A 或 IS95B. 4
- * NETWORK_TYPE_EVDO_0 EVDO網絡, revision 0. 5 NETWORK_TYPE_EVDO_A EVDO網絡,
- * revision A. 6 NETWORK_TYPE_1xRTT 1xRTT網絡 7
- */
- tm.getNetworkType();// int
- /*
- * 手機類型: 例如: PHONE_TYPE_NONE 無信號 PHONE_TYPE_GSM GSM信號 PHONE_TYPE_CDMA
- * CDMA信號
- */
- tm.getPhoneType();// int
- /*
- * Returns the ISO country code equivalent for the SIM provider's
- * country code. 獲取ISO國家碼,至關於提供SIM卡的國家碼。
- */
- tm.getSimCountryIso();// String
- /*
- * Returns the MCC+MNC (mobile country code + mobile network code) of
- * the provider of the SIM. 5 or 6 decimal digits.
- * 獲取SIM卡提供的移動國家碼和移動網絡碼.5或6位的十進制數字. SIM卡的狀態必須是
- * SIM_STATE_READY(使用getSimState()判斷).
- */
- tm.getSimOperator();// String
- /*
- * 服務商名稱: 例如:中國移動、聯通 SIM卡的狀態必須是 SIM_STATE_READY(使用getSimState()判斷).
- */
- tm.getSimOperatorName();// String
- /*
- * SIM卡的序列號: 須要權限:READ_PHONE_STATE
- */
- tm.getSimSerialNumber();// String
- /*
- * SIM的狀態信息: SIM_STATE_UNKNOWN 未知狀態 0 SIM_STATE_ABSENT 沒插卡 1
- * SIM_STATE_PIN_REQUIRED 鎖定狀態,須要用戶的PIN碼解鎖 2 SIM_STATE_PUK_REQUIRED
- * 鎖定狀態,須要用戶的PUK碼解鎖 3 SIM_STATE_NETWORK_LOCKED 鎖定狀態,須要網絡的PIN碼解鎖 4
- * SIM_STATE_READY 就緒狀態 5
- */
- tm.getSimState();// int
- /*
- * 惟一的用戶ID: 例如:IMSI(國際移動用戶識別碼) for a GSM phone. 須要權限:READ_PHONE_STATE
- */
- tm.getSubscriberId();// String
- /*
- * 取得和語音郵件相關的標籤,即爲識別符 須要權限:READ_PHONE_STATE
- */
- tm.getVoiceMailAlphaTag();// String
- /*
- * 獲取語音郵件號碼: 須要權限:READ_PHONE_STATE
- */
- tm.getVoiceMailNumber();// String
- /*
- * ICC卡是否存在
- */
- tm.hasIccCard();// boolean
- /*
- * 是否漫遊: (在GSM用途下)
- */
- tm.isNetworkRoaming();//
- String ProvidersName = null;
- // 返回惟一的用戶ID;就是這張卡的編號神馬的
- String IMSI = tm.getSubscriberId(); // 國際移動用戶識別碼
- // IMSI號前面3位460是國家,緊接着後面2位00 02是中國移動,01是中國聯通,03是中國電信。
- System.out.println(IMSI);
- if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {
- ProvidersName = "中國移動";
- } else if (IMSI.startsWith("46001")) {
- ProvidersName = "中國聯通";
- } else if (IMSI.startsWith("46003")) {
- ProvidersName = "中國電信";
- }
- // 返回當前移動終端附近移動終端的信息
- /*
- * 附近的電話的信息: 類型:List<NeighboringCellInfo>
- * 須要權限:android.Manifest.permission#ACCESS_COARSE_UPDATES
- */
- List<NeighboringCellInfo> infos = tm.getNeighboringCellInfo();
- for (NeighboringCellInfo info : infos) {
- // 獲取鄰居小區號
- int cid = info.getCid();
- // 獲取鄰居小區LAC,LAC:
- // 位置區域碼。爲了肯定移動臺的位置,每一個GSM/PLMN的覆蓋區都被劃分紅許多位置區,LAC則用於標識不一樣的位置區。
- info.getLac();
- info.getNetworkType();
- info.getPsc();
- // 獲取鄰居小區信號強度
- info.getRssi();
- }
- return "手機號碼:" + phoneNum + "\n" + "服務商:" + ProvidersName+"\n" + "IMEI:" + Imei;
- }
- // 顯示信息對話框
- public void showDialog(String title, String info) {
- AlertDialog dialog = new AlertDialog.Builder(this)
- .setTitle(title)
- .setMessage(info)
- .setPositiveButton("close",
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,
- int which) {
- dialog.cancel();
- dialog = null;
- }
- }).create();
- dialog.show();
- }