android开发中想获取双卡手机号码,两个号码的怎样获取?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android开发中想获取双卡手机号码,两个号码的怎样获取?相关的知识,希望对你有一定的参考价值。

getLine1Number();只能获取卡1的号码,而且如果双卡的手机把卡放到卡2槽上也是获取不到。这个纠结的问题,求大神帮忙......

android的官方文档是没有提供相应的Api的,因为标准的Andoird是没有双卡的,好像也只有国内才会搞双卡双待的神器吧。以下记录一下做这个功能所学习到的东西。直接上代码:
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" />
参考技术A 标准的android是不支持双卡的,双卡的都是各个芯片供应商自己加进去的接口,所以各个平台的手机获取方式不一定一致。但是有规律可言的。比如getLine1Number()是获取卡1的,那么可能就有getLine2Number()就是获取卡2的。。。。。本回答被提问者和网友采纳

android怎么获取当前手机号码。双卡双待的手机怎么去处理?

不要再从网上看到什么getLine1Number(); 这个方法对现在的手机卡来说已经获取不到手机号码了 返回值都是null。
可能我没说清楚。。。。。。
我说的是android软件开发时怎么获取手机号码 。

参考技术A 你按两个9,然后拨出去,然后会跳出来你的号码
要查卡1的就用卡1拨
要查卡2就用卡2拨
不信你试试
望采纳
参考技术B 先设置一下 Call ID 为‘显示‘,只插入一个卡,拨打一个有来电显示的手机,显示出来的就是这个卡的号码。更多信息求助,请加新浪微博@李边请

以上是关于android开发中想获取双卡手机号码,两个号码的怎样获取?的主要内容,如果未能解决你的问题,请参考以下文章

如何从双卡手机获取两个 IMEI 号码?

android 开发怎么获得本机号码

获取双卡安卓移动设备中两个 sim 卡插槽的 IMEI

如何区分 Android 中双卡的数据/语音使用情况

如何查看双卡手机的本机号码?

Android Q 基站刷新接口源码分析 & 适配双卡手机基站刷新逻辑