您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在Android中獲取手機的SIM卡信息,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Android 獲取本機手機號(適用于雙卡雙待手機)
直接上代碼:
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.preference.PreferenceManager; import android.telephony.CellInfo; import android.telephony.TelephonyManager; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv; private TextView tv2; // /////////////////////////////////// static String ISDOUBLE; static String SIMCARD; static String SIMCARD_1; static String SIMCARD_2; static boolean isDouble; // ////////////////////////////////// @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.text); tv2 = (TextView) findViewById(R.id.text2); tv2.setText("不知道哪個卡可用!"); getNumber(); } private void getNumber() { TelephonyManager tm = (TelephonyManager) this.getSystemService(this.TELEPHONY_SERVICE); String phoneNumber1 = tm.getLine1Number(); // String phoneNumber2 = tm.getGroupIdLevel1(); initIsDoubleTelephone(this); if (isDouble) { // tv.setText("這是雙卡手機!"); tv.setText("本機號碼是:" + " " + phoneNumber1 + " " + "這是雙卡手機!"); } else { // tv.setText("這是單卡手機"); tv.setText("本機號碼是:" + " " + phoneNumber1 + " " + "這是單卡手機"); } } public void initIsDoubleTelephone(Context context) { isDouble = true; Method method = null; Object result_0 = null; Object result_1 = null; TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try { // 只要在反射getSimStateGemini 這個函數時報了錯就是單卡手機(這是我自己的經驗,不一定全正確) method = TelephonyManager.class.getMethod("getSimStateGemini", new Class[] { int.class }); // 獲取SIM卡1 result_0 = method.invoke(tm, new Object[] { new Integer(0) }); // 獲取SIM卡2 result_1 = method.invoke(tm, new Object[] { new Integer(1) }); } catch (SecurityException e) { isDouble = false; e.printStackTrace(); // System.out.println("1_ISSINGLETELEPHONE:"+e.toString()); } catch (NoSuchMethodException e) { isDouble = false; e.printStackTrace(); // System.out.println("2_ISSINGLETELEPHONE:"+e.toString()); } catch (IllegalArgumentException e) { isDouble = false; e.printStackTrace(); } catch (IllegalAccessException e) { isDouble = false; e.printStackTrace(); } catch (InvocationTargetException e) { isDouble = false; e.printStackTrace(); } catch (Exception e) { isDouble = false; e.printStackTrace(); // System.out.println("3_ISSINGLETELEPHONE:"+e.toString()); } SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); Editor editor = sp.edit(); if (isDouble) { // 保存為雙卡手機 editor.putBoolean(ISDOUBLE, true); // 保存雙卡是否可用 // 如下判斷哪個卡可用.雙卡都可以用 if (result_0.toString().equals("5") && result_1.toString().equals("5")) { if (!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD, "2").equals("1")) { editor.putString(SIMCARD, "0"); } editor.putBoolean(SIMCARD_1, true); editor.putBoolean(SIMCARD_2, true); tv2.setText("雙卡可用"); } else if (!result_0.toString().equals("5") && result_1.toString().equals("5")) {// 卡二可用 if (!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD, "2").equals("1")) { editor.putString(SIMCARD, "1"); } editor.putBoolean(SIMCARD_1, false); editor.putBoolean(SIMCARD_2, true); tv2.setText("卡二可用"); } else if (result_0.toString().equals("5") && !result_1.toString().equals("5")) {// 卡一可用 if (!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD, "2").equals("1")) { editor.putString(SIMCARD, "0"); } editor.putBoolean(SIMCARD_1, true); editor.putBoolean(SIMCARD_2, false); tv2.setText("卡一可用"); } else {// 兩個卡都不可用(飛行模式會出現這種種情況) editor.putBoolean(SIMCARD_1, false); editor.putBoolean(SIMCARD_2, false); tv2.setText("飛行模式"); } } else { // 保存為單卡手機 editor.putString(SIMCARD, "0"); editor.putBoolean(ISDOUBLE, false); } editor.commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
當然不要忘記添加權限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
獲取雙卡雙待手機SIM卡信息
使用反射遍歷 TelephonyManager 中的方法,通過肉眼基本能找到獲取雙卡雙待號碼的方法,最后通過反射取到 SIM 卡信息。
// 遍歷 TelephonyManager 里的方法 public void printTelephonyManagerMethodNamesForThisDevice() { TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Class<?> telephonyClass; try { telephonyClass = Class.forName(telephony.getClass().getName()); Method[] methods = telephonyClass.getMethods(); for (int i = 0; i < methods.length; i++) { Log.i(TAG, "\n" + methods[i] + " declared by " + methods[i].getDeclaringClass()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 獲取雙卡雙待 SIM 卡序列號 public void getSubscriberId() { TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Class<?> telephonyClass; Object result = null; Object result0 = null; Object result1 = null; try { telephonyClass = Class.forName(telephony.getClass().getName()); Method m1 = telephonyClass.getMethod("getSubscriberId"); Method m2 = telephonyClass.getMethod("getSubscriberId", new Class[]{int.class}); result = m1.invoke(telephony); result0 = m2.invoke(telephony, 0); result1 = m2.invoke(telephony, 1); } catch (Exception e) { e.printStackTrace(); } Log.i(TAG, " getSubscriberId : " + telephony.getSubscriberId() + "\n" + " result : " + result + "\n" + " result0 : " + result0 + "\n" + " result1 : " + result1 + "\n"); }
看完上述內容,你們對怎么在Android中獲取手機的SIM卡信息有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。