Android发送大量短信

时间:2009-11-02 20:32:57

标签: android sms

我有一个应用程序,它会向中央服务器发送大量SMS消息。每个用户可能会发送~300 txts /天。 SMS消息被用作网络层,因为SMS几乎无处不在,而移动互联网则不是。该应用程序适用于许多移动互联网无处不在的第三世界国家。

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

我发现这个Android源文件与谷歌。这可能是过时的,我不知道。看起来每个应用程序每3600000毫秒(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时,我收到一条错误消息,指出导入无法解析。

发生了什么事?

3 个答案:

答案 0 :(得分:4)

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

此外,不确定它有多大差异,但3600000毫秒是一个小时而不是一天。

答案 1 :(得分: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)或许在达到极限后取出电池?看起来限制存储在内存中。我还没试过这个。

答案 2 :(得分:0)

这似乎内置于Android源代码树中,因此将此更改推送给用户的唯一方法是构建自己的ROM并让他们安装它。

至于绕过它的想法,为什么不先检查网络连接而不是假设它不存在。即使今天绝大多数设备都没有,但情况肯定不会如此。让SMS成为后备机制。如果是回退机制,您可以提示用户让他们知道每100条消息左右会提示他们确认SMS活动的级别。谁知道,他们可能会漫游到Wifi热点并且当天也可以连接。

否则,您将进入安装一系列其他活动+意图的游戏,这些活动可以充当静默SMS代理以绕过限制。当然,这也有其自身特定的一些不良品质,我几乎无法相信我只是输入/暗示了一些邪恶的东西。