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

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

Solutions Collecting From Web of "Android отправляет множество SMS-сообщений"

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

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

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

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

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