2011-10-31 11 views
6

WifiManager.enableNetwork() öğesini çağırırken arama ipi yerel kodda bekliyorum görüyorum. Şimdiye kadar, bu sadece Android 3.2.1 çalıştıran Motorola Xoom tablet üzerinde asmak mümkün olmuştur. Diğer telefonlarda ve tabletlerde (hepsi Froyo veya Gingerbread kullanıyordum) test ettim ve problemi görmedim. Xoom, test etmem gereken tek çift çekirdekli cihazdır (ve ben sorunu 2 farklı Xoom'da yeniden ürettim), bu yüzden WifiManager'la arayüz oluştururken bazı çok ince Android iş parçacığı gereksinimleriyle uğraştığımı hissediyorum. Benim çağıran iş parçacığı asılı Yığın izleme: daha önce olsaydıKonu WifiManager.enableNetwork üzerinde asılı()

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 

başvurum bilinen bir WiFi erişim noktasına bağlamak bazı testler çalışırken, daha sonra (orjinal erişim noktasına cihazı yeniden bağlamak bağlıdır). Bağlantı kurulmadan önce, wifi'nin etkinleştirildiğini doğruladık ve erişim noktası SSID'nin bulunduğunu doğrulamak için bir tarama gerçekleştirdik. bağlantı kurmak için bu kod bir AsyncTask çalışan ve şöyle görünür olduğu:

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

Bu kod Android Gingerbread açık kaynak kodunda Wifi ayarları menüsü koduna dayanmaktadır. Eksik olduğum WifiManager.enableNetwork() ile ilgili bir şey var mı? Belirli bir iş parçacığında çalıştırılmak zorunda mı? UI iş parçacığında enableNetwork() işlevinin çağrılmasını (mantığı yayın alıcısına taşıyarak) denemeyi denedim. Bu biraz yardımcı görünüyordu, ama hala asmak mümkün oldu. Belki bu Honeycomb'a özgü bir şey midir? Şu anda, bu 2 Xoom test için kullanabileceğim tek Honeycomb cihazlarıdır, bu yüzden sahip olduğum tek veri noktalarıdır.

G

Bu gerçekten 3. * (anlaşılan) özgü bir firmware konudur
+0

Bunun üzerinde bir şans var mı? Aynı sorunu aldım. Sadece connectNetwork yerine bunun yerine kullanılması gereken bazı bilgiler bulundu, ancak bunun için henüz resmi bir AIDL yok, bu yüzden ona hacklemeniz gerekecek :( – pprzemek

+0

Evet, tam olarak bunu yapmak zorundaydım. "API'ler (sadece Petek için ve daha sonra) ve o zamandan beri hiç sorunum olmadı. –

+0

[bug report] (http://code.google.com/p/android/issues/detail?id=34070). –

cevap

1

.

Bunun bir Asus Transformer TF101 ve Sony Tablet S'de (her ikisi de 3. * ile olan) olduğunu gördüm.

3.0'dan başlayarak, Wi-Fi'a bağlanmak için yeni ağlar vardır; bunlar, şebeke içinde enableNetwork kullanılmasını gerektirmez (tüm ağları etkinleştirmek için geçerli olanı etkinleştirir). Bu API'ler üzerinde

Daha ben 4,0 kaynak kodundan ne toplayabilir: Onlar "@hide" Onlar Hala belgelenmese

  • Ayarlar uygulaması tarafından kullanılan
  • ile işaretlenmişlerdir

    • 4.1
    • itibariyle Onlar

    Benim tavsiye denemek ve bu API'leri kullanmaktır 3. * ve 4. * çalışma zamanı arasında biraz değişti yansıma yoluyla. Ayarlar uygulamasında kullandıkları için çalışıyorlar.

  • +0

    HTC Jetsream, Samsung Galaxy Tab 10.1, Asus RF101, Sony Tablet S ve Motorola Xoom'da ne olduğunu bildiğimden firmware sorunu olup olmadığından emin değilim.Petcomb'da genel bir hata gibi görünüyor - Birden çok rapor buldum android sorunları içinde wifiManager yöntemi senkronizasyonu etrafında db.Honeycomb gibi sesler, birden çok iş parçacığı siler, ekleyebilir, etkinleştirebilir ve kaydedemez. Bkz. [Issue] (http://code.google.com/p/android/issues/detail?id=34070) –