2011-10-31 7 views
6

मैं WifiManager.enableNetwork() को कॉल करते समय अपना कॉलिंग थ्रेड देशी कोड में लटक रहा हूं। अब तक, मैं केवल एंड्रॉइड 3.2.1 चलाने वाले मोटोरोला ज़ूम टैबलेट पर इस हैंग को पुन: उत्पन्न करने में सक्षम हूं। मैंने कई अन्य फोन और टैबलेट पर परीक्षण किया है (सभी फ्रायओ या जिंजरब्रेड चल रहे हैं) और समस्या को नहीं देखा है। एक्सूम एकमात्र दोहरी कोर डिवाइस है जिसे मुझे परीक्षण करना है (और मैंने इस मुद्दे को 2 अलग-अलग ज़ूम पर पुन: उत्पन्न किया है), इसलिए मुझे लगता है कि मैं वाईफाईमेनर के साथ इंटरफेसिंग करते समय कुछ बहुत सूक्ष्म एंड्रॉइड थ्रेडिंग आवश्यकताओं पर ठोकर खा रहा हूं। स्टैक ट्रेस जहाँ मेरे बुला धागा लटका हुआ है:WifiManager.enableNetwork पर थ्रेड लटका()

BinderProxy.transact(int, Parcel, Parcel, int) line: not available [native method] 
    IWifiManager$Stub$Proxy.enableNetwork(int, boolean) line: 513 
    WifiManager.enableNetwork(int, boolean) line: 587 

मेरा आवेदन, एक ज्ञात वाईफ़ाई पहुँच बिंदु से कनेक्ट कुछ परीक्षण करने के लिए प्रयास कर रहा है, तो डिवाइस अपने मूल पहुंच बिंदु से (पुन: कनेक्ट करता है, तो यह पहले से था जुड़े हुए)। कनेक्शन स्थापित करने से पहले, हमने पहले ही सत्यापित कर लिया है कि वाईफाई सक्षम है और हमने यह सत्यापित करने के लिए स्कैन किया है कि हमारा एक्सेस पॉइंट एसएसआईडी पाया गया है। कनेक्शन स्थापित करने के लिए इस कोड को एक AsyncTask में चल रहा है और कुछ इस तरह दिखता है:

... 
private WifiManager mWifiManager; 
private List<WifiConfiguration> mConfiguredNets = new ArrayList<WifiConfiguration>(); 
private Object mConnectMonitor = new Object(); 
private NetworkInfo.State mNetworkState = State.UNKNOWN; 

private final BroadcastReceiver mConnectionStateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context inContext, final Intent inIntent) { 
     final String action = inIntent.getAction(); 
     if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 
      NetworkInfo ni = 
       (NetworkInfo)inIntent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
      State state = ni.getState(); 
      if (state == State.CONNECTED) { 
       synchronized (mConnectMonitor) { 
        mNetworkState = state; 
        mConnectMonitor.notify(); 
       } 
      } 
     } 
    } 
}; 

public void runninInAsyncTask(Context activityContext, int networkID) { 

    mWifiManager = (WifiManager)activityContext.getSystemService(Context.WIFI_SERVICE); 

    // Register our broadcast receiver to get network state change events 
    IntentFilter ifilter = new IntentFilter(); 
    ifilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 
    activityContext.registerReceiver(mConnectionStateReceiver, ifilter); 

    // Get a list of our currently configured networks so we can re-enable 
    // them after connecting to the desired network 
    mConfiguredNets = mWifiManager.getConfiguredNetworks(); 

    // Enable our network and disable all others 
    mWifiManager.enableNetwork(networkId, true); 

    // Start the reconnection process to connect to our desired network 
    synchronized (mConnectMonitor) { 
     mWifiManager.reconnect(); 
     mConnectMonitor.wait(60000); 
     if (mNetworkState != State.CONNECTED) { 
      Log.e(TAG, "Problems connecting to desired network!"); 
     } 
     else { 
      Log.e(TAG, "Successfully connected to desired network!"); 
     } 
    }    

    // Re-enable all of our previously configured networks 
    for (WifiConfiguration wifiConfig : mConfiguredNets) 
    {    
     if (wifiConfig.status != Status.ENABLED) { 
      mWifiManager.enableNetwork(wifiConfig.networkId, false); 
     } 
    }    
} 
... 

इस कोड को एंड्रॉयड जिंजरब्रेड खुला स्रोत कोड में वाईफ़ाई सेटिंग्स मेनू कोड पर आधारित था। क्या WifiManager.enableNetwork() को कॉल करने के बारे में कुछ भी है जो मुझे याद आ रही है? क्या इसे किसी विशेष धागे पर चलाना है? मैंने यह सुनिश्चित करने का प्रयास किया है कि यूआई थ्रेड पर सक्षम नेटवर्क() को कॉल किया जाता है (तर्क को प्रसारण रिसीवर पर ले जाकर)। यह थोड़ा सा मदद करने लग रहा था, लेकिन मैं अभी भी लटका पुन: पेश करने में सक्षम था। शायद यह हनीकॉम के लिए विशिष्ट है? अभी, ये 2 एक्सूम एकमात्र हनीकॉम डिवाइस हैं जो मैंने परीक्षण के लिए उपलब्ध कराए हैं, इसलिए वे मेरे पास एकमात्र डेटा-पॉइंट हैं।

जी

+0

उस पर कोई भाग्य? एक ही मुद्दा मिला। बस कुछ जानकारी मिली जो शायद कनेक्ट करने के लिए नेटवर्क का उपयोग किया जाना चाहिए, लेकिन इसके लिए अभी तक कोई आधिकारिक एआईडीएल नहीं है, इसलिए आपको इसे हैक करना होगा :( – pprzemek

+0

हां, मुझे बिल्कुल ऐसा करना पड़ा। मैंने छिपे हुए " "एपीआई (सिर्फ हनीकॉम और बाद में) और मुझे तब तक कोई समस्या नहीं हुई है। –

+0

मैंने [बग रिपोर्ट] उठाया है (http://code.google.com/p/android/issues/detail?id=34070)। –

उत्तर

1

यह वास्तव में एक फर्मवेयर मुद्दा 3. * (ऐसा लगता है) के लिए विशिष्ट है।

मैंने यह एक एसस ट्रांसफार्मर टीएफ 101, और सोनी टैबलेट एस (दोनों के साथ 3. *, जो कुछ समय पहले था) पर देखा है।

3.0 से शुरू होने पर, वाईफाई से कनेक्ट करने के लिए नए एपीआई हैं, जिन्हें बैच में सक्षम नेटवर्क का उपयोग करने की आवश्यकता नहीं है (सभी नेटवर्क सक्षम करने के लिए लेकिन वर्तमान में)।

अधिक उन एपीआई पर, क्या मैं 4.0 स्रोत कोड से इकट्ठा कर सकते हैं:

  • वे "@hide"
  • वे सेटिंग एप्लिकेशन
  • वे अभी भी दस्तावेज नहीं कर रहे हैं द्वारा किया जाता है के साथ चिह्नित हैं 4.1
  • के रूप में वे 3. * और 4. * क्रम

मेरे सिफारिश कोशिश करते हैं और उन API का उपयोग करने के लिए है के बीच कुछ बदल प्रतिबिंब के माध्यम से। चूंकि उनका उपयोग सेटिंग्स ऐप द्वारा किया जाता है, इसलिए वे काम करते हैं।

+0

मुझे यकीन नहीं है कि यह फर्मवेयर मुद्दा है क्योंकि मुझे पता है कि यह एचटीसी जेट्स्रीम, सैमसंग गैलेक्सी टैब 10.1, एसस आरएफ 101, सोनी टैबलेट एस और मोटोरोला ज़ूम पर होता है। यह हनीकॉम में एक सामान्य बग की तरह लगता है - मुझे कई रिपोर्ट मिली हैं wifiManager विधि सिंक्रनाइज़ेशन के आसपास एंड्रॉइड मुद्दों डीबी में।लगता है कि हनीकॉम कई धागे से हटा, जोड़, सक्षम और सहेज नहीं सकता है। [मुद्दा] देखें (http://code.google.com/p/android/issues/detail?id=34070) –

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