Android发送大量短信

Android发送大量短信,android,sms,Android,Sms,我有一个应用程序,它向中央服务器发送大量短信。每个用户可能每天发送约300个TXT。短信被用作网络层,因为短信几乎无处不在,而移动互联网则不然。该应用计划在许多第三世界国家使用,这些国家的移动互联网并不普遍 当我达到100条消息的限制时,我会收到发送每条消息的提示。提示显示“正在发送大量短信”。如果用户每次都被提示询问应用程序是否可以发送文本消息,则这是不正常的。用户不希望连续收到30个提示 我在谷歌上找到了这个android源文件。它可能已经过时了,我不知道。看起来每个应用程序每3600000

我有一个应用程序,它向中央服务器发送大量短信。每个用户可能每天发送约300个TXT。短信被用作网络层,因为短信几乎无处不在,而移动互联网则不然。该应用计划在许多第三世界国家使用,这些国家的移动互联网并不普遍

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

我在谷歌上找到了这个android源文件。它可能已经过时了,我不知道。看起来每个应用程序每3600000ms(1天)有100条短信的限制

这是从设置表中获取checkPeriod和maxCount。但我似乎无法访问同一张表。该源代码应该是Android1.1,这与我使用的相同。当我尝试导入android.provider.Settings.Gservices时,我收到一个错误,提示无法解析导入


这是怎么回事?

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

至于绕过它的想法,为什么不先检查一下网络连接,而不是假设它不存在呢。即使目前绝大多数设备上都没有这种功能,也肯定不会总是这样。让短信成为回退机制。如果是回退机制,那么您可以提示用户,让他们知道每隔100条左右就会提示他们确认SMS活动的级别。谁知道呢,他们可能会漫游到一个Wifi热点,并在一天的某个时间连接

否则,您将进入一个安装一系列其他活动+意图的游戏,这些活动+意图可以充当沉默的SMS代理来绕过限制。当然,这也有它自己的一些不好的特性,我简直不敢相信我只是输入了/建议了一些邪恶的东西。

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


另外,我也不知道这有多大区别,但3600000毫秒是一小时而不是一天。

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

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) 也许在你达到极限后取出电池?看起来该限制已存储在内存中。不过我还没有尝试过。

具体来说,您可以使用谷歌代码搜索在SMSConter上搜索,这会给您提供并显示此限制仍然存在。限制是每个应用程序,而不是每个活动。正如我在原始帖子中所说,这个应用程序将在世界上没有移动互联网的地区使用。并且在100条消息限制之后的每一条文本消息中,它都会提示用户。这会导致应用程序有30个连续的弹出对话框。只需注意:3600000ms不是一天,而是一小时:3600000ms=3600s=60m=1HI如果你可以每小时发送100个,而你每天只需要300个,为什么不限制你的应用程序,改为压缩?还有,我很好奇;确切地说,世界上哪个地区没有移动互联网,但安卓手机和300条短信是实用/实惠的?在大多数没有发达移动互联网的国家,短信的价格相当昂贵。我想到的唯一一个用例是外国公司不以金钱为目标;但satallite手机肯定有更好的覆盖范围吗?我有一个短信炸弹,每秒发送一条短信,而且没有限制,所以显然有办法解决这个问题。还有@Colin,no-sat电话根本就不是人们想象的那样。我爸爸在国土安全部工作,他们有他们,他说你必须站着一动不动才能让他们工作。甚至连微风都吹不到,尤其是在建筑物里。军事用途的手机更像是无线手机,都连接到附近的一个大碟或基站。@Brandon:你有安卓手机上的短信轰炸机,但设备没有根吗?如果是这样,请告诉我更多。找到了任何可行的解决方案吗?我尝试了这个#1,但sqlite3不存在,所以我所做的是将settings.db复制到我的SD卡,然后复制到我的计算机,在那里我编辑了settings.db,然后将其放回SD卡并复制回settings目录。我有根,你确实需要。
/**
 *  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;
    }
}
    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);
sqlite3 /data/data/com.android.providers.settings/databases/settings.db

sqlite> INSERT INTO gservices (name, value) VALUES
('sms_outgoing_check_interval_ms', 0);