前段时间项目里面有发送短信的功能,完成以后,现在总结一下。
首先,短信发送功能在J2ME里面是可选功能,意思就是并不是所有手机都支持,所以,做短信发送程序的时候,一定要考虑这方面的情况。对于不能发送短信的手机,可以让用户自己手动发送。
短信发送的原理可以简单的这样叙述:先把短信发送到移动/联通/电信的服务器,然后这些服务器再把短信转发给相应的用户。在现实的情况下,一般公司的项目,都会在移动、联通、电信分别申请短信中心号码。我们的程序先把短信发送到运营商的服务器,然后运营商通过这些短信中心号码,就可以把短信发送到公司的短信处理服务器。
首先给出一个工具方法,来识别手机卡的运营商(这里可能随着时间而改变,比如又出现了新类型的手机号码):
/** * 取得运营商 * * @return */ public static String getProvider() { try { String smsc = System.getProperty("wireless.messaging.sms.smsc"); if (smsc != null) { // 移动短信中心号码 if ((smsc.startsWith("134") || smsc.startsWith("+134") || smsc.startsWith("+86134")) || (smsc.startsWith("135") || smsc.startsWith("+135") || smsc.startsWith("+86135")) || (smsc.startsWith("136") || smsc.startsWith("+136") || smsc.startsWith("+86136")) || (smsc.startsWith("137") || smsc.startsWith("+137") || smsc.startsWith("+86137")) || (smsc.startsWith("138") || smsc.startsWith("+138") || smsc.startsWith("+86138")) || (smsc.startsWith("139") || smsc.startsWith("+139") || smsc.startsWith("+86139")) || (smsc.startsWith("150") || smsc.startsWith("+150") || smsc.startsWith("+86150")) || (smsc.startsWith("151") || smsc.startsWith("+151") || smsc.startsWith("+86151")) || (smsc.startsWith("152") || smsc.startsWith("+152") || smsc.startsWith("+86152")) || (smsc.startsWith("157") || smsc.startsWith("+157") || smsc.startsWith("+86157")) || (smsc.startsWith("158") || smsc.startsWith("+158") || smsc.startsWith("+86158")) || (smsc.startsWith("159") || smsc.startsWith("+159") || smsc.startsWith("+86159")) || (smsc.startsWith("187") || smsc.startsWith("+187") || smsc.startsWith("+86187")) || (smsc.startsWith("188") || smsc.startsWith("+188") || smsc.startsWith("+86188")) || (smsc.startsWith("147") || smsc.startsWith("+147") || smsc.startsWith("+86147"))) { return "CHINA_MOBILE"; } // 联通短信中心号码 else if (smsc.startsWith("+86130") || smsc.startsWith("0086130") || smsc.startsWith("130") || smsc.startsWith("+130") || smsc.startsWith("+86131") || smsc.startsWith("0086131") || smsc.startsWith("131") || smsc.startsWith("+131") || smsc.startsWith("+86132") || smsc.startsWith("0086132") || smsc.startsWith("132") || smsc.startsWith("+132") || smsc.startsWith("+86155") || smsc.startsWith("0086155") || smsc.startsWith("155") || smsc.startsWith("+155") || smsc.startsWith("+86156") || smsc.startsWith("0086156") || smsc.startsWith("156") || smsc.startsWith("+156") || smsc.startsWith("+86186") || smsc.startsWith("0086186") || smsc.startsWith("186") || smsc.startsWith("+186") || smsc.startsWith("+86145") || smsc.startsWith("0086145") || smsc.startsWith("145") || smsc.startsWith("+145")) { return "CHINA_UNICOM"; } // 电信短信中心号码 else if (smsc.startsWith("+86133") || smsc.startsWith("133") || smsc.startsWith("+133") || smsc.startsWith("+86153") || smsc.startsWith("153") || smsc.startsWith("+153") || smsc.startsWith("+86189") || smsc.startsWith("189") || smsc.startsWith("+189")) { return "CHINA_TELECOM"; } } } catch (Exception e) { return ""; } return ""; }
然后是你的短信中心号码(注意这里要换成你自己的):
下面是短信发送的代码:
private void sendSms(String context) { String provider = getProvider(); String add = null; if (provider.equalsIgnoreCase("CHINA_MOBILE")) { add = "sms://" + TELE_CENTER[0]; } else if (provider.equalsIgnoreCase("CHINA_UNICOM")) { add = "sms://" + TELE_CENTER[2]; } else if (provider.equalsIgnoreCase("CHINA_TELECOM")) { add = "sms://" + TELE_CENTER[1]; } if (add != null) { sendBySms(add, context); } else { System.out.println("不能取得运营商"); } }
附sendBySms方法如下:
注意这里发送短信是一个单独的线程。