2009-11-02 14 views
20

मेरे पास एक ऐप है, जो केंद्रीय सर्वर पर बहुत सारे एसएमएस संदेश भेजता है। प्रत्येक उपयोगकर्ता शायद ~ 300 txts/दिन भेज देगा। एसएमएस संदेशों को नेटवर्किंग परत के रूप में उपयोग किया जा रहा है, क्योंकि एसएमएस लगभग हर जगह है और मोबाइल इंटरनेट नहीं है। ऐप का उद्देश्य उन तीसरे विश्व देशों में उपयोग के लिए है जहां मोबाइल इंटरनेट सर्वव्यापी नहीं है।एंड्रॉइड बहुत सारे एसएमएस संदेश भेज रहा है

जब मैंने 100 संदेशों की सीमा को मारा, तो मुझे प्रत्येक संदेश भेजने के लिए एक संकेत मिलता है। प्रॉम्प्ट कहता है "बड़ी संख्या में एसएमएस संदेश भेजे जा रहे हैं"। प्रत्येक बार पूछने के लिए उपयोगकर्ता को यह संकेत देना ठीक नहीं है कि ऐप एक टेक्स्ट संदेश भेज सकता है या नहीं। उपयोगकर्ता लगातार 30 संकेत प्राप्त नहीं करना चाहता है।

मुझे यह एंड्रॉइड स्रोत फ़ाइल Google के साथ मिली। यह पुराना हो सकता है, मैं नहीं बता सकता। ऐसा लगता है कि प्रत्येक एप्लिकेशन के लिए प्रत्येक 3600000ms (1 दिन) 100 एसएमएस संदेश की सीमा है।

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

यह और भी वास्तविक एंड्रॉयड कोड है? ऐसा लगता है कि यह "com.android.internal.telephony.gsm" पैकेज में है, मुझे एंड्रॉइड वेबसाइट पर यह पैकेज नहीं मिल रहा है।

मैं इस सीमा को कैसे अक्षम/संशोधित कर सकता हूं? मैं समाधान के लिए googling गया है, लेकिन मुझे कुछ भी नहीं मिला है।


तो मैं 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); 

यह सेटिंग तालिका से चेक अवधि और अधिकतम गणना प्राप्त कर रहा है। लेकिन मुझे लगता है कि एक ही टेबल तक पहुंच नहीं है। वह स्रोत एंड्रॉइड 1.1 होना चाहिए, जो वही है जिसका मैं उपयोग कर रहा हूं। जब मैं android.provider.Settings.Gservices आयात करने का प्रयास करता हूं, तो मुझे यह कहते हुए एक त्रुटि मिलती है कि आयात को हल नहीं किया जा सकता है।

क्या चल रहा है?

+5

बस एक नोट: 3600000ms दिन नहीं है, लेकिन एक घंटा: 3600000ms = 3600s = 60m = 1h –

+3

यदि आप 100/घंटा भेज सकते हैं और आपको केवल 300/दिन की आवश्यकता है, तो क्यों न केवल अपने ऐप को थ्रॉटल करें, और काम करें इसके बजाय आपका संपीड़न? इसके अलावा, मैं उत्सुक हूँ; दुनिया के किस हिस्से में कोई मोबाइल इंटरनेट नहीं है, लेकिन एंड्रॉइड फोन और 300 एसएमएस व्यावहारिक/किफायती हैं? विकसित मोबाइल इंटरनेट के बिना अधिकांश देशों में एसएमएस बहुत महंगा है। मुझे लगता है कि एकमात्र उपयोग मामला पैसा-नो-ऑब्जेक्ट विदेशी निगम है; लेकिन निश्चित रूप से सैटेलाइट फोनों के पैसे के लिए बेहतर कवरेज है? –

+0

मेरे पास एक एसएमएस बॉम्बर है जो हर सेकेंड में 1 टेक्स्ट भेजता है, और कोई सीमा नहीं है, इसलिए इसके आसपास स्पष्ट रूप से एक तरीका है। और @ कोलिन, कोई भी सैट फोन बिल्कुल नहीं है जो वे बनते हैं। मेरे पिता गृहभूमि सुरक्षा विभाग के लिए काम करते हैं, और उनके पास है, और वह कहता है कि उन्हें काम करने के लिए अभी भी पूरी तरह से खड़ा होना है। यहां तक ​​कि एक हल्की हवा भी नहीं हो सकती है, और विशेष रूप से इमारत में नहीं। सैन्य उपयोग वाले लोग वायरलेस हैंडसेट की तरह अधिक हैं जो सभी पास कहीं भी एक बड़े पकवान या बेस स्टेशन से जुड़े हुए हैं। – Brandon

उत्तर

0

ऐसा लगता है कि यह एंड्रॉइड स्रोत पेड़ में बनाया गया है, इसलिए उपयोगकर्ताओं को इस बदलाव को धक्का देने का एकमात्र तरीका यह होगा कि आप अपना खुद का रोम बनाएं और उन्हें इंस्टॉल करें।

इसके आसपास होने के विचारों के लिए, यह मानने के बजाय नेटवर्क कनेक्टिविटी की जांच क्यों न करें, यह मानने के बजाय कि यह अस्तित्व में नहीं है। भले ही यह आज के उपकरणों के एक महत्वपूर्ण बहुमत पर मौजूद नहीं है, यह निश्चित रूप से हमेशा मामला नहीं होगा। एसएमएस को पतन वापस तंत्र होने दें। यदि यह पतन वापस तंत्र है, तो आप उपयोगकर्ता को यह बताने के लिए संकेत दे सकते हैं कि उन्हें हर 100 संदेशों या उससे भी अधिक एसएमएस गतिविधि के स्तर की पुष्टि करने के लिए कहा जाएगा। कौन जानता है, वे वाईफ़ाई हॉटस्पॉट में घूम सकते हैं और दिन का कनेक्टिविटी हिस्सा भी ले सकते हैं।

अन्यथा, आप अन्य गतिविधियों + गुच्छों का एक समूह स्थापित करने के खेल में शामिल हो जाएंगे जो सीमा के चारों ओर पाने के लिए चुप एसएमएस प्रॉक्सी के रूप में कार्य कर सकते हैं। बेशक, इसका अपने स्वयं के अवांछनीय गुणों का एक निश्चित सेट भी है और मुझे शायद ही विश्वास हो कि मैंने केवल कुछ बुराई टाइप की है/सुझाव दिया है।

+0

विशेष रूप से, आप SmsCounter पर खोजने के लिए Google Code Search का उपयोग कर सकते हैं, जो आपको http://www.google.com/codesearch/p?hl=hi&sa=N&cd=1&ct=rc#uX1GffpyOZk/telephony/java/com/android देता है /internal/telephony/gsm/SMSDispatcher.java&q=package:android%20SmsCounter और दिखाता है कि यह सीमा अभी भी जगह पर है। सीमा प्रति-आवेदन है, प्रति गतिविधि नहीं। – CommonsWare

+0

जैसा कि मैंने मूल पोस्ट में कहा था, इस ऐप का उपयोग दुनिया के कुछ हिस्सों में मोबाइल फोन के बिना किया जाएगा। और यह 100 संदेश सीमा के बाद प्रत्येक पाठ संदेश के दौरान उपयोगकर्ता को संकेत देता है। इससे ऐप में लगातार 30 पॉपअप संवाद होते हैं। –

4

क्या आपने "आयात android.provider.Settings;" का उपयोग करने का प्रयास किया था "आयात android.provider.Settings.GServices" के बजाय?(SMSDispatcher.java की लाइन 36 देखें)

यह भी सुनिश्चित नहीं है कि यह कितना अंतर बनाता है, लेकिन 3600000 एमएस एक घंटे एक दिन नहीं है।

+1

android.provider.Settings.GServices .. लिंक मृत .. –

4

दुर्भाग्य से मुझे लगता है कि आप केवल कुछ ही विकल्प

1) जड़ पहुँच प्राप्त है और ऐसा करके सीधे सेटिंग तालिका में परिवर्तन:

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

मैंने इस # 1 की कोशिश की, लेकिन sqlite3 अस्तित्व में नहीं था, इसलिए मैंने जो किया वह सेटिंग्स db को मेरे sdcard में कॉपी किया गया था, फिर मेरे कंप्यूटर पर जहां मैंने इसे संपादित किया था और फिर इसे अपने एसडीकार्ड पर वापस रख दें और इसे वापस सेटिंग्स निर्देशिका में कॉपी करें। मेरे पास जड़ है, जिसकी आपको आवश्यकता है। – DanO

संबंधित मुद्दे