Android 5.0/Lollipopの新機能によって、インターネット接続していないWi-Fiポインタに接続しても、モバイルデータ通信に切り替わってしまうようになりました。
→参考:Android 5.0(Lollipop)の機能紹介 : Wi-Fiでインターネットにアクセスできない場合はモバイルデータ通信に自動的に切り替える機能が追加 | ガジェット通信
やりかた
以下のようにすることで、インターネット接続していないWi-Fiポインタに接続することができます。
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] allNetwork = cm.getAllNetworks();
SocketFactory socketFactory = SocketFactory.getDefault();
for (Network network : allNetwork) {
NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(network);
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
// SocketFactoryの取得
socketFactory = network.getSocketFactory();
}
}
// Socketの生成
Socket socket = socketFactory.createSocket(IP_ADDRESS, PORT);
ちなみに
以下の方法でも接続できますが、requestNetwork
を実行するためにCHANGE_NETWORK_STATE
のパーミッションが必要となります。
→参考:Android 5.0 APIs | Android Developers
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// 接続されたときに呼ばれる
super.onAvailable(network);
// SocketFactoryの取得
SocketFactory socketFactory = socketFactory = network.getSocketFactory();
// Socketの生成
Socket socket = socketFactory.createSocket(IP_ADDRESS, PORT);
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
}
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
}
@Override
public void onLost(Network network) {
super.onLost(network);
}
});