趙雅智_android擷取本機電訊廠商,手機號部分能擷取,趙雅智_android
手機號碼不是所有的都能擷取。只是有一部分可以拿到。
這個是由於行動電信業者沒有把手機號碼的資料寫入到sim卡中.SIM卡只有唯一的編號,供網路與裝置 識別那就是IMSI號碼,手機的訊號也可以說是通過這個號碼在網路中傳遞的,並不是手機號碼。
試想,你的SIM丟失後,補辦一張新的會換號碼嗎?
是不會 的.就是因為在你的手機號碼對應的IMSI號 在行動電信業者中被修改成新SIM卡的IMSI號碼。
那麼手機號為什麼有的就能顯示呢? 這個就像是一個變數,當行動電信業者為它賦值了,它自然就會有值。不賦值自然為空白。
國內sim卡存的是imsi號,沒有電話號碼存在機器上。只有當你和基站發生聯絡後,由電訊廠商給你分配號碼。
但是我也寫了一個類實現擷取電訊廠商
布局檔案:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_privoid" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/getSIMInfo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="click" android:text="擷取手機號碼等資訊" > </Button></LinearLayout>
SIMCardInfo.java:
/** * @author yazhizhao * 20142014-10-22上午9:13:04 */package com.example.android_sms;import android.content.Context;import android.telephony.TelephonyManager;import android.util.Log;/** * @author yazhizhao 20142014-10-22上午9:13:04 */public class SIMCardInfo {/** * TelephonyManager提供裝置上擷取通訊服務資訊的入口。 應用程式可以使用這個類方法確定的電信服務商和國家 以及某些類型的使用者訪問資訊。 * 應用程式也可以註冊一個監聽器到電話收狀態的變化。不需要直接執行個體化這個類 * 使用Context.getSystemService(Context.TELEPHONY_SERVICE)來擷取這個類的執行個體。 */private TelephonyManager telephonyManager;private String IMSI;// 國際移動使用者識別碼public SIMCardInfo(Context context) {telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);}/** * 擷取當前設定的電話號碼 * * @author yazhizhao 20142014-10-22上午9:44:19 * @return */public String getNativePhoneNumber() {String NativePhoneNumber = null;NativePhoneNumber = telephonyManager.getLine1Number();return NativePhoneNumber;}/** * 擷取手機服務商資訊 需要加入許可權<uses-permission * android:name="android.permission.READ_PHONE_STATE"/> * * @author yazhizhao 20142014-10-22上午9:44:31 * @return */public String getProvidersName() {String ProvidersName = null;// 返回唯一的使用者ID;就是這張卡的編號神馬的IMSI = telephonyManager.getSubscriberId();// IMSI號前面3位460是國家,緊接著後面2位00 02是中國移動,01是中國聯通,03是中國電信。Log.i("MainActivity", "IMSI" + IMSI);if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {ProvidersName = "中國移動";} else if (IMSI.startsWith("46001")) {ProvidersName = "中國聯通";} else if (IMSI.startsWith("46003")) {ProvidersName = "中國電信";}return ProvidersName;}}
MainActivity.java
package com.example.android_sms;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.TextView;/** * 注意許可權 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> * * @author yazhizhao 20142014-10-22上午9:18:04 */public class MainActivity extends Activity {private TextView number;private TextView privoid;private String TAG = "MainActivity";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);number = (TextView) this.findViewById(R.id.tv_num);privoid = (TextView) this.findViewById(R.id.tv_privoid);}public void click(View v) {SIMCardInfo siminfo = new SIMCardInfo(MainActivity.this);Log.i(TAG, "電訊廠商" + siminfo.getProvidersName());Log.i(TAG, "電話" + siminfo.getNativePhoneNumber());number.setText(siminfo.getNativePhoneNumber());privoid.setText(siminfo.getProvidersName());}}
運行效果: