Android 发送大量短信

标签 android sms

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

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

我在 google 上找到了这个 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。但我似乎无法访问同一张 table 。该来源应该是 Android 1.1,这与我正在使用的相同。当我尝试导入 android.provider.Settings.Gservices 时,我收到一条错误消息,提示无法解析导入。

发生了什么事?

最佳答案

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

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

关于Android 发送大量短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663514/

相关文章:

Android Gradle 添加原生库

iphone - iPhone 应用程序中的收件人栏

java - AndroidManifest.xml 中的基本错误以获取短信接收权限

java - 如何将json处理为普通类对象?

flutter - 如何在flutter中实现sms retrieve api

ios - 在 iOS 中阅读短信

android - 从收件箱中删除短信时出现奇怪的异常

sms - Twilio 消息段

Android使用AlarmManager每天在同一时间设置重复任务

java - Kotlin 无法获取所需的类型干扰 Array<Uri>!找到数组<Uri?>