Android发送大量的短信

我有一个应用程序,它发送大量的短信到中央服务器。 每个用户可能会发送约300 txts /天。 短信正被用作networking层,因为短信几乎到处都是,移动互联网则不是。 该应用程序旨在用于移动互联网并不普遍的许多第三世界国家。

当我达到100封邮件的限制时,我会收到每封邮件的提示。 提示说“正在发送大量的SMS消息”。 这是不好的,用户每次得到提示,询问应用程序是否可以发送短信。 用户不想获得30个连续的提示。

我发现这个Android源文件与谷歌。 这可能是过时了,我不知道。 看起来每个应用程序每3600000ms(1天)有100个短消息的限制。

http://www.netmite.com/android/mydroid/frameworks/base/telephony/java/com/android/internal/telephony/gsm/SMSDispatcher.java

/** Default checking period for SMS sent without uesr permit */ private static final int DEFAULT_SMS_CHECK_PERIOD = 3600000; /** Default number of SMS sent in checking period without uesr permit */ private static final int DEFAULT_SMS_MAX_ALLOWED = 100; 

 /** * Implement the per-application based SMS control, which only allows * a limit on the number of SMS/MMS messages an app can send in checking * period. */ private class SmsCounter { private int mCheckPeriod; private int mMaxAllowed; private HashMap<String, ArrayList<Long>> mSmsStamp; /** * Create SmsCounter * @param mMax is the number of SMS allowed without user permit * @param mPeriod is the checking period */ SmsCounter(int mMax, int mPeriod) { mMaxAllowed = mMax; mCheckPeriod = mPeriod; mSmsStamp = new HashMap<String, ArrayList<Long>> (); } boolean check(String appName) { if (!mSmsStamp.containsKey(appName)) { mSmsStamp.put(appName, new ArrayList<Long>()); } return isUnderLimit(mSmsStamp.get(appName)); } private boolean isUnderLimit(ArrayList<Long> sent) { Long ct = System.currentTimeMillis(); Log.d(TAG, "SMS send size=" + sent.size() + "time=" + ct); while (sent.size() > 0 && (ct - sent.get(0)) > mCheckPeriod ) { sent.remove(0); } if (sent.size() < mMaxAllowed) { sent.add(ct); return true; } return false; } } 

这甚至是真正的android代码? 它看起来像是在“com.android.internal.telephony.gsm”包中,我无法在android网站上find这个包。

我怎样才能禁用/修改这个限制? 我一直在search解决scheme,但我没有find任何东西。


所以我正在查看commonsware.com发布的链接,我发现源已经发生了变化。 所以我可能还会有一个镜头。

  int check_period = Settings.Gservices.getInt(mResolver, Settings.Gservices.SMS_OUTGOING_CEHCK_INTERVAL_MS, DEFAULT_SMS_CHECK_PERIOD); int max_count = Settings.Gservices.getInt(mResolver, Settings.Gservices.SMS_OUTGOING_CEHCK_MAX_COUNT, DEFAULT_SMS_MAX_COUNT); mCounter = new SmsCounter(max_count, check_period); 

这是从设置表获取checkPeriod和maxCount。 但是我似乎没有访问同一张表。 该来源应该是Android 1.1,这是我使用的相同。 当我尝试导入android.provider.Settings.Gservices,我得到一个错误说,导入无法parsing。

到底是怎么回事?

Solutions Collecting From Web of "Android发送大量的短信"

你尝试使用“导入android.provider.Settings;” 而不是“导入android.provider.Settings.GServices”? (参见SMSDispatcher.java的第36 行 )

此外,不知道它有多大的差异,但3600000毫秒是一个小时不是一天。

不幸的是我认为你只有几个select

1)获取root权限并直接修改设置表:

 sqlite3 /data/data/com.android.providers.settings/databases/settings.db sqlite> INSERT INTO gservices (name, value) VALUES ('sms_outgoing_check_interval_ms', 0); 

2)使用多个应用程序,因为它是一个应用程序的限制

3)也许在达到极限后取出电池? 它看起来像极限存储在内存中。 我还没有尝试过。

这似乎是内置到Android源代码树中的,所以将这种改变推向用户的唯一方法就是构build你自己的ROM并安装它们。

至于解决它的想法,为什么不先检查networking连接,而不是假设它不存在。 即使目前绝大部分设备都不存在,那当然不会总是如此。 让SMS成为回退机制。 如果是回退机制,则可以提示用户让他们知道每100条消息会提示他们确认SMS活动的级别。 谁知道,他们可能会漫游到一个Wifi热点,也有连接的一部分。

否则,你将进入一个安装一堆其他Activities + Intents的游戏,它可以作为无声短信代理来解决这个限制。 当然,这也有其自身的一些不良品质,我简直不敢相信我只是提出了一些邪恶的东西。