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