2015-12-23 7 views
9

मैं एंड्रॉइड 5.0 टैबलेट को एक इंट्रानेट से कनेक्ट करने का तरीका ढूंढ रहा हूं जिसमें सुरक्षा कारणों से इंटरनेट कनेक्शन नहीं है।NetworkRequest.builder() के साथ वाईफाई नेटवर्क को कैसे निर्दिष्ट करें। SetNetworkSpecifier (string)

समस्या कैप्टिव पोर्टल सुरक्षा है जो Google 4.4/5.0 के बाद एंड्रॉइड में निर्मित है। इंटरनेट कनेक्शन की जांच के लिए android connectivitycheck पर एक कॉल किया जाता है, जब यह कॉल विफल रहता है तो वाईफाई नेटवर्क को काम नहीं कर रहा है और इससे बचा जाता है। लगभग लंगड़ा।

दूसरों एक ही मुद्दे में समाप्त हो गया है और कुछ एंड्रॉयड 5 में शुरू की गई एक नई एपीआई का उपयोग कर सुझाव देते हैं, देखें: Android 5.0 Lollipop and 4.4 KitKat ignores my WiFi network, enableNetwork() is useless

इस पर दस्तावेज़ीकरण बहुत अस्पष्ट है:

NetworkRequest.Builder.setNetworkSpecifier(String networkSpecifier) 

"व्याख्या इस स्ट्रिंग का वाहक विशिष्ट है और इसका उपयोग करने वाले वाहक अपने विवरण दस्तावेज करना चाहिए। उदाहरण के लिए, ब्लूटूथ कुछ प्रकार की डिवाइस आईडी का उपयोग कर सकता है जबकि वाईफाई एसएसआईडी और/या बीएसएसआईडी का उपयोग कर सकता है। सेलुलर कैरियर स्पैन का उपयोग कर सकता है "

मैंने कोशिश की और यह काम नहीं करता है। मुख्य समस्या यह है कि एक बार जब मैं setNetworkSpecifier() का उपयोग करता हूं तो कोई नेटवर्क नहीं मिलता है। मैंने bssid (मैक) और एपी के ssid का उपयोग करने का प्रयास किया।

ऐसा लगता है कि फ़िल्टर काम कर रहा है लेकिन यह स्पष्ट नहीं है कि इसे कैसे काम करना चाहिए। अगर मैं setNetworkSpecifier() कॉल 1 नेटवर्क छोड़ देता हूं, लेकिन यह निर्धारित करना संभव नहीं है कि कौन सा है। कम से कम यह मेरे कोड काम करता है।

तो एसएसआईडी और बीएसएसआईडी काम नहीं करता है तो मुझे यहां क्या रखा जाना चाहिए?

मेरा कोड यहां है।

private void connect(String ssid, Context context) { 
    Log.i(TAG, "try connect to! " + ssid); 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI). 
       removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED). 
       removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET 

       setNetworkSpecifier(ssid). //<--- here is the problem 
       build(); 
     ConnectivityManager.NetworkCallback callback 
      = new ConnectivityManager.NetworkCallback() { 
       @Override 
       public void onAvailable(Network network) { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         Log.i(TAG, "onAvailable " + network.toString() + " " + network.getClass().getName()); 
       } 
      } 

      @Override 
      public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { 
       try { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         Log.i(TAG, "onCapabilitiesChanged " + networkCapabilities.getLinkDownstreamBandwidthKbps()); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { 
       try { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         Log.i(TAG, "onLinkPropertiesChanged " + linkProperties.getInterfaceName()); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     Log.i(TAG, "requestNetwork "); 
     // cm.requestNetwork(nr, callback); 
     cm.registerNetworkCallback(nr, callback); 
    } 
} 

उत्तर

0

पहले धोखाधड़ी हमेशा एक विकल्प है और नेटवर्क के साथ काम करने के लिए लोगों को फोन में अपनी सेटिंग्स बदलने की आवश्यकता होती है। धोखा इस तरह चला जाता है। वाईफ़ाई-> उन्नत-> अनचेक।

हालांकि, मुझे यकीन है कि वह उत्तर नहीं है जिसे आप ढूंढ रहे हैं। इसलिए मैंने आपके लिए थोड़ा सा शोध किया और पाया कि क्या आवश्यक था। आपको कमांड ignoreNetwork() को कॉल करने की आवश्यकता है। इस आदेश के बारे में अधिक जानने के लिए यह निम्न स्रोत लिंक पर ACTION_CAPTIVE_PORTAL_SIGN_IN के अंतर्गत है।

स्रोत: http://developer.android.com/reference/android/net/ConnectivityManager.html#ACTION_CAPTIVE_PORTAL_SIGN_IN

http://developer.android.com/reference/android/net/CaptivePortal.html#ignoreNetwork()

1

मैं निम्नलिखित कोड एंड्रॉयड स्टूडियो में एक सैमसंग S5 (SM-G900V), एपीआई 23 (6.0.1) पर चल रहे डिबग।

void inspectNetworks() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     Network[] ns = connectivity.getAllNetworks(); 
     for (Network n : ns) { 
      NetworkCapabilities c = connectivity.getNetworkCapabilities(n); 
      Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint 
     } 
    } 
} 

मैंने पाया कि Wi-Fi नेटवर्क किसी भी networkSpecifier बिल्कुल नहीं था:

in Android Studio Debug view, mNetworkSpecifier = null

शायद WIFI -transport नेटवर्क के लिए networkSpecifier भविष्य में लागू किया जाएगा ...रिकॉर्ड के लिए, मैंने पाया कि networkSpecifier1 पर इस विशेष फोन पर मौजूदा CELLULAR -transport नेटवर्क दोनों के लिए सेट किया गया था।

अभी तक, ऐसा लगता है कि वाई-फाई नेटवर्क का अनुरोध करते समय addCapability पर कॉल के साथ जितना संभव हो उतना सटीक विकल्प है।

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