Android отправляет множество SMS-сообщений - PullRequest
20 голосов
/ 02 ноября 2009

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

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

Ответы [ 3 ]

4 голосов
/ 03 ноября 2009

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

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

4 голосов
/ 12 марта 2010

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

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 голосов
/ 03 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...