2009-11-02 25 views
20

Tengo una aplicación que envía muchos mensajes SMS a un servidor central. Cada usuario probablemente enviará ~ 300 txts/día. Los mensajes SMS se están utilizando como una capa de red, porque los SMS están en casi todas partes y la Internet móvil no. La aplicación está pensada para su uso en muchos países del tercer mundo donde Internet móvil no es omnipresente.Android enviando muchos mensajes SMS

Cuando llego a un límite de 100 mensajes, aparece un mensaje para cada mensaje enviado. El mensaje dice "Se está enviando una gran cantidad de mensajes SMS". Esto no está bien para que se le pregunte al usuario cada vez que pregunte si la aplicación puede enviar un mensaje de texto. El usuario no desea obtener 30 mensajes consecutivos.

Encontré este archivo fuente de Android con google. Podría estar desactualizado, no puedo decirlo. Parece que hay un límite de 100 mensajes de SMS cada 3600000ms (1 día) para cada aplicación.

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; 

y

/** 
* 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; 
    } 
} 

¿Es esto el código verdadero androide? Parece que está en el paquete "com.android.internal.telephony.gsm", no puedo encontrar este paquete en el sitio web de Android.

¿Cómo puedo desactivar/modificar este límite? He estado buscando soluciones en Google, pero no he encontrado nada.


Así que estaba mirando el enlace que publicó commonsware.com, y encontré que la fuente realmente había cambiado. Y entonces todavía podría tener una oportunidad.

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); 

Esto está obteniendo checkPeriod y maxCount de una tabla de configuraciones. Pero parece que no tengo acceso a la misma mesa. Esa fuente debe ser Android 1.1, que es lo mismo que estoy usando. Cuando intento importar android.provider.Settings.Gservices, aparece un error que dice que la importación no se puede resolver.

¿Qué está pasando?

+5

Solo una nota: 3600000ms no es un día, sino una hora: 3600000ms = 3600s = 60m = 1h –

+3

Si puede enviar 100/hora y solo necesita 300/día, ¿por qué no simplemente acelera su aplicación, y trabaja en su compresión en su lugar? Además, tengo curiosidad; exactamente qué parte del mundo no tiene Internet móvil, pero los teléfonos android y 300 SMS son prácticos/asequibles? SMS es bastante caro en la mayoría de los países sin Internet móvil desarrollado. El único caso de uso en el que pienso es en las corporaciones extranjeras sin dinero; pero seguramente los teléfonos satallite tienen una mejor cobertura por el dinero? –

+0

Tengo un atacante de SMS que envía 1 mensaje de texto por segundo y sin límite, por lo que obviamente hay una forma de evitarlo. Y @Colin, no los teléfonos satelitales no son para nada lo que están hechos para ser. Mi papá trabaja para el Departamento de Seguridad Nacional, y ellos lo tienen, y él dice que tienes que estar completamente quieto para que trabajen. Ni siquiera una brisa ligera puede estar allí, y especialmente no en un edificio. Los que los militares usan son más como teléfonos inalámbricos que están conectados a un gran plato o estación base en algún lugar cercano. – Brandon

Respuesta

0

Esto parece estar integrado en el árbol de fuentes de Android, por lo que la única forma de llevar este cambio a los usuarios sería crear su propia ROM e instalarla.

En cuanto a las ideas sobre cómo evitarlo, ¿por qué no verificar primero la conectividad de red en lugar de simplemente suponer que no existe? Incluso si no está presente en una mayoría significativa de dispositivos hoy en día, ciertamente no siempre será el caso. Deje que SMS sea el mecanismo de retroceso. Si se trata del mecanismo de repliegue, puede solicitarle al usuario que les avise que se les pedirá que confirmen el nivel de actividad de SMS cada 100 mensajes más o menos. Quién sabe, pueden vagar en un punto de acceso Wifi y tener conectividad también durante parte del día.

De lo contrario, accederá a un juego de instalación de otras actividades + Intents que pueden actuar como proxies silenciosos de SMS para superar el límite. Por supuesto, esto tiene su propio conjunto de cualidades indeseables y no puedo creer que haya escrito/sugerido algo tan malo.

+0

Específicamente, puede usar Google Code Search para buscar en SmsCounter, que le ofrece http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#uX1GffpyOZk/telephony/java/com/android /internal/telephony/gsm/SMSDispatcher.java&q=package:android%20SmsCounter y muestra que este límite aún está en su lugar. El límite es por aplicación, no por actividad. – CommonsWare

+0

Como dije en la publicación original, esta aplicación se usará en partes del mundo sin internet móvil. Y avisa al usuario durante cada mensaje de texto después del límite de 100 mensajes. Esto hace que la aplicación tenga 30 cuadros de diálogo emergentes consecutivos. –

4

¿Has intentado utilizar "import android.provider.Settings;" en lugar de "import android.provider.Settings.GServices"?(Véase la línea 36 de SMSDispatcher.java)

Además, no está seguro de cuánto diferencia que hace, pero 3600000 ms es uno horas ni un día.

+1

android.provider.Settings.GServices .. Enlace muerto ... –

4

Desafortunadamente, creo que sólo tiene unas pocas opciones

1) Obtener acceso a la raíz y modificar la tabla de ajustes directamente haciendo:

sqlite3 /data/data/com.android.providers.settings/databases/settings.db 

sqlite> INSERT INTO gservices (name, value) VALUES 
('sms_outgoing_check_interval_ms', 0); 

2) El uso de múltiples aplicaciones ya que es un límite por aplicación

3) ¿Quizás saque la batería después de alcanzar el límite? Parece que el límite está almacenado en la memoria. No he probado esto todavía.

+0

Probé este # 1, pero sqlite3 no existía, entonces lo que hice fue copiar los settings.db a mi tarjeta sd, luego a mi computadora donde la edité y luego vuelva a colocarlo en mi tarjeta sd y la copie nuevamente en el directorio de configuraciones. Yo tenía root, que necesitas. – DanO

Cuestiones relacionadas