0

我想通过 SmsManager 发送短信,但在第一个 sim 中我没有余额,在这种情况下短信失败。那么如何仅从我的应用程序中通过第二个 sim 发送短信。如果第一个 sim 中的余额不可用,其他应用程序(如 WhatsApp)会在注册时间从我的第二个 sim 发送消息。所以我认为它是可能的。请帮助我

String mobileNo = phoneNumber1.getText().toString();

  try {
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(mobileNo, null, "BAL", null, null);
    Toast.makeText(getApplicationContext(), "SMS Sent!",
                Toast.LENGTH_LONG).show();
  } catch (Exception e) {
    Toast.makeText(getApplicationContext(),
        "SMS faild, please try again later!",
        Toast.LENGTH_LONG).show();
    e.printStackTrace();
  }
4

2 回答 2

1

我查看了 SubscriptionManager 类并找到了一个方法 getActiveSubscriptionInfoForSimSlotIndex(simIndex) 来获取特定 sim 插槽的订阅信息,使用此 subscriptionInfo 我们可以获得特定 simSlot 的订阅 ID。使用 subscriptionID 我们可以获得 SMSManager 以获得所需的 simSlot

这对我有用:

public void sendSMS(final String number,final String text){
  final PendingIntent localPendingIntent1 = 
  PendingIntent.getBroadcast(mContext, 0, new Intent(this.SENT), 0);
  final PendingIntent localPendingIntent2 = 
  PendingIntent.getBroadcast(mContext, 0, new Intent(this.DELIVERED), 0);

if (Build.VERSION.SDK_INT >= 22)
{

    SubscriptionManager subscriptionManager=((Activity)mContext).getSystemService(SubscriptionManager.class);
    SubscriptionInfo subscriptionInfo=subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(simIndex);
    SmsManager.getSmsManagerForSubscriptionId(subscriptionInfo.getSubscriptionId()).sendTextMessage(number, null, text, localPendingIntent1, localPendingIntent2);
}
SmsManager.getSmsManagerForSubscriptionId(subscriptionInfo.getSubscriptionId()).sendTextMessage(number, null, text, localPendingIntent1, localPendingIntent2);
}

其中 simIndex 为 0 的 sim1 和 1 的 sim2

于 2017-10-10T12:03:17.547 回答
0

在分析了Mlais MX28手机(带有定制ROM)的日志后,我发现了以下技巧来切换SIM卡发送短信。不幸的是,它似乎为所有应用程序全局切换 SIM 卡(我还没有找到“保存和恢复”现行设置的方法)。另外,您可能不得不费力找出sim_id分配给您每张 SIM 卡的 ID ( )(可能通过检查手机的日志输出;我也找不到一种编程方式来执行此操作)。

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

我不确定这是否适合您(尽管代码似乎与制造商无关);但我想它仍然值得一试。

更新:

奇怪的是,在一些尝试之后,早期的方法不再起作用。然而,经过更多的日志分析,我遇到了另一种使用直接设置操作的方法(不幸的是,它需要android.permission.WRITE_SETTINGS权限)。

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);

我相信它也适用于其他与多 SIM 卡相关的操作,因为我设备上的设置数据库包含诸如gprs_connection_sim_settingvoice_call_sim_settingvideo_call_sim_setting等设置的条目。

于 2015-04-13T17:26:58.690 回答