Android:怎么在双卡手机上发送带有特定SIM卡的短信?

本教程将介绍Android:如何在双卡手机上发送带有特定SIM卡的短信?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

Android:怎么在双卡手机上发送带有特定SIM卡的短信? 教程 第1张

问题描述

我找到了一些code可以做到这一点,但它给了我一个异常(试图在空对象引用上调用虚拟方法‘java.lang.Class java.lang.Object.getClass()’)。我正在用我的Moto G第三代进行测试。下面是代码,如果我遗漏了什么,请让我知道,或者有任何其他可用的方法。谢谢。

import android.app.PendingIntent;
import android.content.Context;
import android.os.IBinder;
import android.util.Log;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class SimUtil {

 private static final String TAG = "SimUtil";

 public static boolean sendSMS(Context ctx, int simID, String toNum, String centerNum, String smsText, PendingIntent sentIntent, PendingIntent deliveryIntent) {

 SimUtil cls = new SimUtil();

  String name;

  try {
if (simID == 0) {
 name = "isms";

} else if (simID == 1) {
 name = "isms2";

} else {
 throw new Exception("can not get service which for sim '" + simID + "', only 0,1 accepted as values");
}

try
{
 Method method = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", new Class[]{String.class});
 method.setAccessible(true);
 Object param = method.invoke(null, new Object[]{name});

 if (param == null)
 {
  throw new RuntimeException("can not get service which is named '" + name + "'");
 }
 method = Class.forName("com.android.internal.telephony.ISms$Stub").getDeclaredMethod("asInterface", new Class[]{IBinder.class});
 method.setAccessible(true);
 Object stubObj = method.invoke(null, new Object[]{param});

 if (stubObj == null)
 {
  throw new RuntimeException("can not get telephony which is named '" + name + "'");
 }


 method = stubObj.getClass().getMethod("sendText", String.class, String.class, String.class, String.class, PendingIntent.class, PendingIntent.class);

 method.invoke(null, new Object[]{ctx.getPackageName(), toNum, null, smsText, sentIntent, deliveryIntent});


} catch (ClassNotFoundException e)
{
 throw new RuntimeException(e);
} catch (NoSuchMethodException e)
{
 throw new RuntimeException(e);
} catch (InvocationTargetException e)
{
 throw new RuntimeException(e);
} catch (IllegalAccessException e)
{
 throw new RuntimeException(e);
}

return true;
  } catch (ClassNotFoundException e) {
Log.e("Exception", "ClassNotFoundException:" + e.getMessage());
  } catch (NoSuchMethodException e) {
Log.e("Exception", "NoSuchMethodException:" + e.getMessage());
  } catch (InvocationTargetException e) {
Log.e("Exception", "InvocationTargetException:" + e.getMessage());
  } catch (IllegalAccessException e) {
Log.e("Exception", "IllegalAccessException:" + e.getMessage());
  } catch (Exception e) {
Log.e("Exception", "Exception:" + e);
  }
  return false;
 }

api

如果您的目标是推荐答案22或更高版本。您可以使用以下代码来获取SIM卡列表。您还可以允许用户选择SIM卡:

final ArrayList<Integer> simCardList = new ArrayList<>();
SubscriptionManager subscriptionManager;
subscriptionManager = SubscriptionManager.from(activity);
final List<SubscriptionInfo> subscriptionInfoList = subscriptionManager
  .getActiveSubscriptionInfoList();
for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) {
 int subscriptionId = subscriptionInfo.getSubscriptionId();
 simCardList.add(subscriptionId);
}

最终使用以下代码发送短信:

int smsToSendFrom = simCardList.get(0); //assign your desired sim to send sms, or user selected choice
SmsManager.getSmsManagerForSubscriptionId(smsToSendFrom)
 .sendTextMessage(phoneNumber, null, msg, sentPI, deliveredPI); //use your phone number, message and pending intents

好了关于Android:怎么在双卡手机上发送带有特定SIM卡的短信?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。