2009-11-02 133 views
20

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

当我打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网站上找到这个包。

如何禁用/修改此限制?我一直在搜索解决方案,但我没有找到任何东西。


所以我在查看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时,出现一条错误提示导入无法解析。

这是怎么回事?

+5

只需要注意:3600000ms不是一天,而是一个小时:3600000ms = 3600s = 60m = 1h – 2009-11-02 23:24:21

+3

如果您可以每小时发送100个小时,而每天只需要300个小时,那么为什么不直接关闭应用程序,你的压缩呢?另外,我很好奇;究竟世界上哪个地方没有移动互联网,但android手机和300条短信是实用的还是实惠的?在没有开发移动互联网的大多数国家,短信的费用相当高我想到的唯一用例是无货币的外国公司;但肯定satallite手机有更好的覆盖面的钱? – 2010-09-06 11:21:07

+0

我有一个短信轰炸机,每秒发送1个文本,没有限制,所以显然有一个解决方法。而@科林,没有任何电话根本就不是他们所做的。我的父亲为国土安全部工作,他们有他们,他说你必须完全静止站立才能让他们工作。即使微风也不能在那里,特别是不在建筑物内。军方使用的更像无线手机,它们都连接到附近某个大盘子或基站。 – Brandon 2011-01-17 21:47:59

回答

0

这似乎是建立在Android的源代码树,所以唯一的办法,推动这种变化下至用户将是建立自己的ROM,让他们安装。

至于在避过它,为什么不检查网络连接第一,而不是仅仅假设它不存在的想法。即使它不在今天的绝大多数设备上,也并非总是如此。让SMS成为回退机制。如果它是回退机制,则可以提示用户让他们知道他们将被提示每隔100条消息确认SMS活动的级别。谁知道呢,他们可能会漫游到Wifi热点,并且也是连线的一部分。

否则,你将进入安装很多其他的活动+意图,可以充当沉默的短信代理服务器绕过限制的游戏。当然,这也有它自己的一些不良品质,我几乎不能相信我只是输入/提出了一些邪恶的东西。

+0

具体而言,您可以使用Google代码搜索在SmsCounter上进行搜索,从而为您提供http://www.google.com/codesearch/p?hl=zh-CN&sa=N&cd=1&ct=rc#uX1GffpyOZk/telephony/java/com/android /internal/telephony/gsm/SMSDispatcher.java&q=package:android%20SmsCounter并显示此限制仍然存在。限制是每个应用程序,而不是每个活动。 – CommonsWare 2009-11-02 21:17:13

+0

正如我在原帖中所说,这个应用程序将用于没有移动互联网的世界部分地区。并且在100条消息限制之后的每个文本消息中提示用户。这会导致应用程序有30个连续的弹出对话框。 – 2009-11-02 22:07:49

4

您是否尝试过使用 “进口android.provider.Settings;”而不是“导入android.provider.Settings.GServices”?(见SMSDispatcher.java的第36行)

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

+1

android.provider.Settings.GServices ..链接死亡.. – 2012-09-24 07:26:26

4

不幸的是,我认为你只有几个选择

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)也许在达到极限后取出电池?它看起来像极限存储在内存中。尽管如此,我还没有尝试过。

+0

我试过#1,但sqlite3不存在,所以我所做的是将settings.db复制到我的SD卡,然后到我的计算机,我编辑它,然后然后将其放回到我的SD卡上并将其复制回设置目录。我确实有根,你确实需要。 – DanO 2010-11-10 18:51:21