Подтвердить что ты не робот

Android отправляет множество SMS-сообщений

У меня есть приложение, которое отправляет много SMS-сообщений на центральный сервер. Каждый пользователь, вероятно, отправит ~ 300 т/с. SMS-сообщения используются в качестве сетевого уровня, потому что SMS почти везде, а мобильный интернет - нет. Приложение предназначено для использования во многих странах третьего мира, где мобильный интернет не является вездесущим.

Когда я нажимаю ограничение в 100 сообщений, я получаю приглашение для каждого отправленного сообщения. В подсказке указано "Отправляется большое количество SMS-сообщений". Это не нормально, когда пользователь получает запрос каждый раз, чтобы спросить, может ли приложение отправлять текстовое сообщение. Пользователь не хочет получать 30 последовательных запросов.

Я нашел этот исходный файл для Android с google. Это может быть устаревшим, я не могу сказать. Похоже, что для каждого приложения существует ограничение в 100 смс сообщений каждые 3600000 мс (1 день).

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, я получаю сообщение об ошибке, что импорт не может быть разрешен.

Что происходит?

4b9b3361

Ответ 1

Вы пытались использовать "import android.provider.Settings;" вместо "import android.provider.Settings.GServices"? (см. строку 36 SMSDispatcher.java)

Кроме того, не уверен, какая разница, но 3600000 мс - один час, а не один день.

Ответ 2

К сожалению, я думаю, что у вас есть только несколько вариантов

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) Возможно, выберете батарею после достижения предела? Похоже, что предел хранится в памяти. Я еще не пробовал это.

Ответ 3

Кажется, что это встроено в дерево исходных текстов Android, поэтому единственный способ подтолкнуть это изменение к пользователям - это создать собственный ПЗУ и установить его.

Что касается идей о том, как обойти это, почему бы не сначала проверить сетевое подключение, а просто предположить, что он не существует. Даже если сегодня он отсутствует на значительном большинстве устройств, это, безусловно, не всегда будет иметь место. Пусть SMS - это механизм возврата. Если это механизм возврата, вы можете попросить пользователя сообщить им, что им будет предложено подтвердить уровень активности SMS каждые 100 сообщений или около того. Кто знает, они могут бродить в точку доступа Wi-Fi и иметь возможность подключения в течение дня.

В противном случае вы попадете в игру по установке множества других действий + намерений, которые могут действовать как молчащие SMS-прокси, чтобы обойти предел. Конечно, у этого есть свой определенный набор нежелательных качеств, и я с трудом могу поверить, что я просто набрал/предложил что-то злое.