【问题标题】:Dual Sim Android双卡安卓
【发布时间】:2011-11-05 06:25:34
【问题描述】:

有什么方法可以让我在我的 android 中访问其他 sim 卡吗?我有一个安卓 Cherry Mobile Orbit,它是一款双卡安卓手机。我想为我的手机开发一个 SMS 应用程序,但只能访问第一个 sim。我想访问另一个 sim,这样当我按 enter 发送消息时,会有一个提示,即消息将发送到哪个 sim。 我知道这是专有的,但手机制造商对此没有任何反馈。还有其他方法吗?调整什么的?

【问题讨论】:

标签: android sim-card


【解决方案1】:

我认为你可以使用 dex2jar 或 apktool 来反转那些在双卡设备上运行的应用程序,一旦你找到相关的“服务管理器”,“电话管理器”,一些接口存根,或者一些像“Gemini”这样的关键词然后你可以使用Java Reflection,反射这个类的所有方法。然后你就可以实现这个目标。

【讨论】:

  • 您能否提供更多详细信息? @shanwu
  • @gumuruh 用 dex2jar 反编译这些应用程序后,尝试找到一个名为 TelephonyMgr.java 的类,对比 android 源代码后应该会发现一些有趣的东西~
【解决方案2】:

此方法可用于从 2 个 SIM 卡中选择一个 SIM 卡!

//above Android API 22
if (Build.VERSION.SDK_INT > 22) {
    //for dual sim mobile
    SubscriptionManager localSubscriptionManager = SubscriptionManager.from(this);

    if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {
     //if there are two sims in dual sim mobile
        List localList = localSubscriptionManager.getActiveSubscriptionInfoList();
        SubscriptionInfo simInfo = (SubscriptionInfo) localList.get(0);
        SubscriptionInfo simInfo1 = (SubscriptionInfo) localList.get(1);

        final String sim1 = simInfo.getDisplayName().toString();
        final String sim2 = simInfo1.getDisplayName().toString();

    }else{
     //if there is 1 sim in dual sim mobile
        TelephonyManager tManager = (TelephonyManager) getBaseContext()
                .getSystemService(Context.TELEPHONY_SERVICE);

        String sim1 = tManager.getNetworkOperatorName();

    }

}else{
    //below android API 22
            TelephonyManager tManager = (TelephonyManager) getBaseContext()
                    .getSystemService(Context.TELEPHONY_SERVICE);

            String sim1 = tManager.getNetworkOperatorName();
}

然后发送短信可以使用下面的方法

    public static boolean sendSMS(Context context, String smsText) {
    SmsManager smsMan = SmsManager.getDefault();

    SharedPreferences prefs = context.getSharedPreferences("uinfo", MODE_PRIVATE);
    String sim = prefs.getString("sim", "No name defined");
    String simName = prefs.getString("simName", "No name defined");
    String toNum = "";

    try {

        if (Build.VERSION.SDK_INT > 22) {

            SubscriptionManager localSubscriptionManager = SubscriptionManager.from(context);
            if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {

                int simID  = Integer.parseInt(sim);

                List localList = localSubscriptionManager.getActiveSubscriptionInfoList();
                SubscriptionInfo simInfo = (SubscriptionInfo) localList.get(simID);
                ArrayList<String> parts = smsMan.divideMessage(smsText);
                SmsManager.getSmsManagerForSubscriptionId(simInfo.getSubscriptionId()).sendMultipartTextMessage(toNum, null, parts, null, null);
            }else{
                ArrayList<String> parts = smsMan.divideMessage(smsText);
                smsMan.sendMultipartTextMessage(toNum, null, parts, null, null);
            }
            return true;
        }else{
            ArrayList<String> parts = smsMan.divideMessage(smsText);
            smsMan.sendMultipartTextMessage(toNum, null, parts, null, null);
        }
    } catch (Exception e) {

    }
    return false;
}

【讨论】:

    【解决方案3】:

    目前官方还没有支持此功能的 API,您必须联系设备制造商。

    【讨论】:

    • 感谢@Reno 的反馈。我仍然希望是否有任何调整。
    【解决方案4】:

    假设您正在为自己的手机开发应用程序,并且您愿意费力找出分配给每张 SIM 卡的 ID (sim_id)(可能通过检查手机的日志输出,搜索sim_id,这是我做的),您可以使用以下代码设置短信发送的默认SIM卡:

    int simId = <place desired SIM ID here>;
    Intent simIntent = new Intent("android.intent.action.SMS_DEFAULT_SIM");
    simIntent.putExtra("simid", simId);
    sendBroadcast(simIntent);
    

    结合其他一些 UI 提示内容(用于实际“选择”首选 SIM 卡),这应该可以解决问题。

    我完全不确定这种方法是否适合您(尽管代码看起来很“标准”);我在我的 Mlais MX28(带有定制的 ROM)上反复试验发现了这一点。但我想它仍然值得一试。 :)

    更新: 奇怪的是,在对我正在开发的应用程序进行了几次更新后,该解决方案意外停止工作。但我遇到了另一种方式(这似乎更有希望)。 (我相信这也可以扩展到其他 SIM 选择场景,因为设置缓存包含 names gprs_connection_sim_settingvoice_call_sim_settingvideo_call_sim_setting 等条目。)

    ContentValues val = new ContentValues();
    val.put("value", "here goes the preferred SIM ID");
    getContentResolver().update(Uri.parse("content://settings/system"), val, "name='sms_sim_setting'", null);
    

    (很遗憾,这需要android.permission.WRITE_SETTINGS 权限。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-31
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      相关资源
      最近更新 更多