2011-06-28 8 views
7

क्या "केवल 2 जी नेटवर्क का उपयोग" के लिए एंड्रॉइड की मोबाइल नेटवर्क सेटिंग के मूल्य को वापस करने का कोई तरीका है?"केवल 2 जी नेटवर्क का उपयोग करें" सेटिंग

ऐप विकसित किया जा रहा है एक निश्चित स्थान पर इंटरनेट की गति को मापता है, लेकिन इसके लिए प्रासंगिक होने के लिए, यह जानना चाहिए कि क्या उपयोगकर्ता जानबूझ कर मोबाइल इंटरनेट को 2 जी तक सीमित कर रहा है या नहीं।

मैंने कनेक्टिविटीमेनगर पर एक नज़र डाली है, लेकिन यह केवल पृष्ठभूमि डेटा सेटिंग या सभी नेटवर्क के बारे में जानकारी प्रदान करता है। उन के माध्यम से पुनरावृत्ति का पता चलता है के बावजूद सेटिंग सक्षम किया जा रहा, एचएसपीए और UMTS लौटने कि trueisAvailable() के लिए:

for (NetworkInfo netInfo : cm.getAllNetworkInfo()) { 
    Log.i(TAG, netInfo.getSubtypeName() + ": " + netInfo.isAvailable()); 
} 

केवल संकेत मैं इस सब के बीच पाया है कि netInfo.getReason() रिटर्न "connectionDisabled" HSPA पर और UMTS जब सेटिंग है सक्षम किया गया है। समस्या यह है कि जब सेटिंग अक्षम होती है, तो उन नेटवर्क प्रकारों को सूची में जरूरी नहीं दिखता है। "कनेक्शन अक्षम" के लिए विशेष रूप से एचएसपीए और यूएमटीएस पर स्ट्रिंग तुलना का उपयोग करने के लिए मुझे सही नहीं लगता है।

इससे निपटने का सही तरीका क्या है?

+0

कोई भी उपरोक्त स्निपेट से सार्थक जानकारी प्राप्त करने की कोशिश करने से पहले, परेशान न करें; मैंने कोशिश की। ऐसा लगता है कि जब "2 जी केवल" मोड सक्षम होता है या जब केवल उपलब्ध सिग्नल जीपीआरएस होता है, तो 3 जी नेटवर्क "कनेक्शन डिस्प्लेबल" लौटाते हैं। दूसरे शब्दों में, 'getReason() 'कोई उपयोगी जानकारी प्रदान नहीं करता है। –

+0

[एंड्रॉइड इश्यू # 8753 इसे संबोधित करता है।] (Http://code.google.com/p/android/issues/detail?id=8753) मैंने वहां उल्लिखित सुझावों का प्रयास किया है, लेकिन परीक्षण किए गए उपकरणों पर, ' वास्तविक सेटिंग या कनेक्टिविटी स्थिति के बावजूद Set.ecure.getInt() 'हमेशा' 1' देता है। –

+0

अनुवर्ती: समस्या # 8753 बताती है कि 'सेटिंग्स.Secure.NETWORK_PREFERENCE' इस सेटिंग को दर्शाती है। सेटिंग की अनियंत्रित है, लेकिन यह दोनों TYPE_MOBILE' पर 'TYPE_WOBII' की प्राथमिकता को प्रतिबिंबित करता है जब दोनों कनेक्शन उपलब्ध होते हैं, और जो मैं ढूंढ रहा हूं वह नहीं है। –

उत्तर

5

, एक जवाब हो रहा है:

int enabled = Settings.Secure.getInt(getContentResolver(), 
     "preferred_network_mode", -1); 
Log.d("MYAPP", "2G only enabled: " + enabled); 

कहाँ " केवल 2G नेटवर्क का उपयोग "सेटिंग निर्दिष्ट किया जाता है के रूप में:

  • 0 सेटिंग संकेत अक्षम किया गया है
  • 1 इंगित करता है सेटिंग सक्षम है
  • -1 इंगित करता है सेटिंग (कुछ उपकरणों?)

सेट नहीं है मैं यह कैसे पता चला? मैं का उपयोग कर Settings.Secure से सभी कुंजी/मान जोड़े इकट्ठा निम्नलिखित:

ContentResolver cr = getContentResolver(); 
Cursor cursor = cr.query(Settings.Secure.CONTENT_URI, null, null, null, null); 
if (cursor.moveToFirst()) { 
    while (!cursor.isAfterLast()) { 
     Log.d("MYAPP", "cursor: " 
       + cursor.getString(0) + ", " 
       + cursor.getString(1) + ", " 
       + cursor.getString(2)); 
     cursor.moveToNext(); 
    } 
} 

मैं तुलना में सक्षम करने और सेटिंग को अक्षम के बीच परिणाम है, और यकीन है कि पर्याप्त मुझे मिल गया:

07-08 00:15: 20.991: डीबग/MyApp (13813): कर्सर: 5154, preferred_network_mode, 1

सूचकांक स्तंभ (5154 ऊपर के उदाहरण में) का उपयोग न करें, क्योंकि मैंने देखा है यह सेटिंग टॉगल के बीच बदलता है।

हालांकि यह some documentation for Settings.Secure I found online से संबंधित है, लेकिन यह मान सभी फोनों द्वारा सम्मानित नहीं है।

यदि आपका डिवाइस -1 देता है, तो संभवतः कुंजी मान जोड़े सूचीबद्ध करने से आपको पता चल जाएगा कि आपको कौन सी सेटिंग की आवश्यकता है। यदि आप इसे सामना करते हैं तो कृपया टिप्पणी करें!

+1

से पहले कॉल किया जाना चाहिए मैंने देखा है कि एचटीसी और सैमसंग डिवाइस 2 जी नेटवर्क को प्राथमिकता देने के लिए एक विशिष्ट विकल्प प्रदर्शित नहीं करते हैं, और इसके बजाय उपयोगकर्ता को जीएसएम (2 जी/2.5 जी) या डब्ल्यूसीडीएमए (3 जी/4 जी) या दोनों के बीच चयन करने की अनुमति दें। मुझे अभी तक इसकी सेटिंग नहीं मिली है। –

0

जहां तक ​​मैं कह सकता हूं, उस सेटिंग के लिए मूल्य प्राप्त करने का कोई दस्तावेज तरीका नहीं है। लेकिन Use2GOnlyCheckBoxPreference कक्षा है जिसका उपयोग उदाहरण के रूप में किया जा सकता है। prefer_2g सेटिंग के वर्तमान मूल्य को प्राप्त करने के लिए यह आंतरिक Phone और PhoneFactory कक्षाओं का उपयोग करता है।

आप प्रतिबिंब के माध्यम से Phone और PhoneFactory कक्षाओं का उपयोग कर सकते हैं। लेकिन कारण यह अनियंत्रित है और आपके जोखिम पर है। यहाँ Use2GOnlyCheckBoxPreference से प्रासंगिक कोड है: डिवाइस (एलजी ऑप्टिमस 2X गति, एलजी-P990 के लिए विशेष रूप) के एक छोटे सबसेट के लिए

import com.android.internal.telephony.Phone; 
import com.android.internal.telephony.PhoneFactory; 

public class Use2GOnlyCheckBoxPreference extends CheckBoxPreference { 

    private Phone mPhone; 
    private MyHandler mHandler; 

    public Use2GOnlyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     mPhone = PhoneFactory.getDefaultPhone(); 
     mHandler = new MyHandler(); 
     mPhone.getPreferredNetworkType(
       mHandler.obtainMessage(MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE)); 
    } 

    private class MyHandler extends Handler { 

     private static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0; 

     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
       case MESSAGE_GET_PREFERRED_NETWORK_TYPE: 
        handleGetPreferredNetworkTypeResponse(msg); 
        break; 
      } 
     } 

     private void handleGetPreferredNetworkTypeResponse(Message msg) { 
      AsyncResult ar = (AsyncResult) msg.obj; 

      if (ar.exception == null) { 
       int type = ((int[])ar.result)[0]; 
       Log.i(LOG_TAG, "get preferred network type="+type); 
       setChecked(type == Phone.NT_MODE_GSM_ONLY); 
      } else { 
       // Weird state, disable the setting 
       Log.i(LOG_TAG, "get preferred network type, exception="+ar.exception); 
       setEnabled(false); 
      } 
     } 
    } 
} 
+0

यदि मैं सही ढंग से समझता हूं, 'फोन' और' फोनफैक्टरी 'तक पहुंचने के लिए, मुझे एसडीके के स्रोत के साथ काम करने की ज़रूरत है, जिसका अर्थ है कि यह तब तक काम नहीं करेगा जब तक कि आप अपना एंड्रॉइड वितरण तैनात नहीं कर सकते। [मैंने जावा प्रतिबिंब के माध्यम से 'getDefaultPhone() 'प्राप्त करने का प्रयास किया है (http://stackoverflow.com/questions/2143754/can-a-telephony-phone-object-be-instantiated-through-the-sdk) पहले , लेकिन फोन जड़ की जरूरत है। क्या मुझे यह काम करने के लिए एक चाल याद आ रही है? –

+0

हां, आप सही हैं। यह पता चला है कि आप तीसरे पक्ष के आवेदन से 'फोनफैक्टरी' का उपयोग नहीं कर सकते हैं। – inazaruk

+0

यह काम नहीं करेगा (कम से कम 5 साल बाद), क्योंकि PhoneFactory.makeDefaultPhone() को फोनफैक्टरी.getDefaultPhone() – BamsBamx

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