Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What is going on with this article?
@hishida

Android 5.0/Lollipopでインターネット接続していないWi-Fiポインタに接続する

More than 5 years have passed since last update.

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);
    }
});
17
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hishida
jrits
信頼と魅力のある先進のITをもとに、お客様のワークスタイル・イノベーションの実現を目指します。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
17
Help us understand the problem. What is going on with this article?