Android 发送大量短信

问题描述 投票:0回答:3

我有一个应用程序,它会向中央服务器发送大量短信。每个用户每天可能会发送约 300 个文本。 SMS 消息被用作网络层,因为 SMS 几乎无处不在,而移动互联网却不然。该应用程序适用于许多移动互联网尚未普及的第三世界国家。

当我达到 100 条消息的限制时,每发送一条消息都会收到提示。提示“正在发送大量短信”。如果用户每次都被提示询问应用程序是否可以发送短信,这是不行的。用户不希望收到 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 时,收到一条错误消息,提示无法解析导入。

发生什么事了?

android sms
3个回答
4
投票

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

另外,不确定它有多大区别,但 3600000 毫秒是一小时,而不是一天。


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
投票

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

至于解决这个问题的想法,为什么不首先检查网络连接而不是假设它不存在。即使现在大多数设备上都没有这种功能,但情况肯定不会总是如此。让短信作为后备机制。如果是回退机制,您可以提示用户,让他们知道每 100 条左右的消息就会提示他们确认 SMS 活动的级别。谁知道呢,他们可能会漫游到 Wifi 热点并在一天中的某些时间也有连接。

否则,您将陷入安装一堆其他活动+意图的游戏,这些活动+意图可以充当静默短信代理来绕过限制。当然,这也有其自身的某些不良品质,我简直不敢相信我刚刚输入/建议了如此邪恶的东西。

© www.soinside.com 2019 - 2024. All rights reserved.