1. 程式人生 > >android雙卡發簡訊,基於5.1.1實現

android雙卡發簡訊,基於5.1.1實現

【原創】作品,轉載請註明出處,請尊重作者的辛苦。

最近開發中遇到了雙卡的問題,關於雙卡查看了好多文章,但是沒有一個能解決問題的,要麼就是定製的或者有廠商提供支援的,我這裡是基於android 5.1.1實現的雙卡傳送簡訊,這裡需要用的反射,下面直接上程式碼,供大家參考:

一、首先例項化相關類

TelephonyManager mTelephonyManager = (TelephonyManager) mContext
				.getSystemService(Context.TELEPHONY_SERVICE);
Class<TelephonyManager> clz = (Class<TelephonyManager>) mTelephonyManager.getClass();

二、呼叫相關方法

1、獲取sim的狀態,引數對應sim卡的序號,分別為0(卡1)和1(卡2):

public int getSimState(int slotID) {
		int status = 0;
		try {
			Method mtd = clz.getMethod("getSimState", int.class);
			mtd.setAccessible(true);
			status = (Integer) mtd.invoke(mTelephonyManager, slotID);
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return status;
}

返回的值是sim卡的狀態碼,對應值:
TelephonyManager.SIM_STATE_READY
TelephonyManager.IM_STATE_ABSENT
TelephonyManager.SIM_STATE_NETWORK_LOCKED
TelephonyManager.SIM_STATE_PIN_REQUIRED
TelephonyManager.SIM_STATE_READY
TelephonyManager.SIM_STATE_UNKNOWN

如果返回的是
TelephonyManager.SIM_STATE_READY
那就是可用狀態;

2、傳送簡訊

private void sendSms(final int which) {
		SubscriptionInfo sInfo = null;

		final SubscriptionManager sManager = (SubscriptionManager) mActivity
				.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);

		List<SubscriptionInfo> list = sManager.getActiveSubscriptionInfoList();

		if (list.size() == 2) {// double card
			sInfo = list.get(which);
		} else {//single card
			sInfo = list.get(0);
		}

		if (sInfo != null) {
<span style="white-space:pre">			</span>//provider是對應10086、10010、10000
<span style="white-space:pre">			</span>//這個需要根據sik卡的Mcc和Mnc自己判斷,這裡就不貼出來了
			String provider = matchIMSI(String.valueOf(sInfo.getMcc()) + "0"
					+ String.valueOf(sInfo.getMnc()));
			int subId = sInfo.getSubscriptionId();
			Log.i(TAG, " select provider = " + provider + ", subid = "
					+ subId);

			SmsManager manager = SmsManager
					.getSmsManagerForSubscriptionId(subId);

			if (!TextUtils.isEmpty(provider)) {
				manager.sendTextMessage(provider, null, "YE", null, null);
				Toast.makeText(mActivity, "資訊正在傳送,請稍候", Toast.LENGTH_SHORT)
						.show();
			} else {
				Toast.makeText(mActivity, "無法正確的獲取SIM卡資訊,請稍候重試",
						Toast.LENGTH_SHORT).show();
			}
		}
	}