質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

アンドロイドアプリで接続先wifiの設定を切替えるには

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 6,862

score 178

AndroidStudio2.3.3にて、指定のwifi(SSIDをWEPキーで認証)の接続状態を調べ、
「オン」「オフ」状態を画面に表示し、ボタンを押すことにより、接続を切替えるアプリを作成
しようとしております。

・ssid:SSID
・password:password

■AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="wifi.sample.goodroid.mywifi01">

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="15" />

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".WiFiActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


■WiFiActivity

package wifi.sample.goodroid.mywifi01;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ToggleButton;
import android.app.Activity;

public class WiFiActivity extends Activity implements OnClickListener{

    private ToggleButton toggle;
    private WifiManager Wifi;

    @SuppressLint("WifiManagerLeak")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wi_fi);

        // WifiManagerのインスタンスを取得する
        Wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);

        //WiFi機能をONにする
        WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
        if (wifiManager.isWifiEnabled() == false) {
            wifiManager.setWifiEnabled(true);
        }


        //WEPのSSID設定
        String ssid = "SSID";
        WifiConfiguration config = new WifiConfiguration();
        config.SSID = "\"" + ssid + "\"";
        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
        config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
        config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
        config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
        config.wepKeys[0] = "\"password\"";
        config.wepTxKeyIndex = 0;
        int networkId = wifiManager.addNetwork(config); // 失敗した場合は-1となります
        wifiManager.saveConfiguration();
        wifiManager.updateNetwork(config);




        // トグルボタンのインスタンスを取得する
        toggle = (ToggleButton) findViewById(R.id.toggleButton1);

        // トグルボタンの状態初期化
        if(Wifi.isWifiEnabled()){

            // 現在のWifiがONだった場合、トグルボタンをONに切り替える
            toggle.setChecked(true);

        }else{

            // 現在のWifiがOffだった場合、トグルボタンをOFFに切り替える
            toggle.setChecked(false);
        }

    }

    @Override
    public void onClick(View v) {

        if(Wifi.isWifiEnabled()){
            // 現在のWifiがONだった場合、OFFに切り替える
            Wifi.setWifiEnabled(false);

        }else{
            // 現在のWifiがOFFだった場合、ONに切り替える
         //   Wifi.setWifiEnabled(true);

            //WiFi機能をONにする
            WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
            if (!wifiManager.isWifiEnabled()) {
                wifiManager.setWifiEnabled(true);
            }

            //WEPのSSID設定
            String ssid = "SSID";
            WifiConfiguration config = new WifiConfiguration();
            config.SSID = "\"" + ssid + "\"";
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
            config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
            config.wepKeys[0] = "\"password\"";
            config.wepTxKeyIndex = 0;
            int networkId = wifiManager.addNetwork(config); // 失敗した場合は-1となります
            wifiManager.saveConfiguration();
            wifiManager.updateNetwork(config);

            //SSIDに接続する
        //    WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
        //    int networkId = 0; // 上記設定で取得できたものを使用
            String targetSSID = "SSID";
// WiFi機能が無効の状態で呼び出されるとSSID検索の所でnullとなるので念のため例外処理を行なう
            try {
                // ssidの検索を開始
                wifiManager.startScan();
                for (ScanResult result : wifiManager.getScanResults()) {
                    // Android4.2以降よりダブルクォーテーションが付いてくるので除去
                    String resultSSID = result.SSID.replace("\"", "");
                    if (resultSSID.equals(targetSSID)) {
                        // 接続を行う
                        if (networkId > 0) {
                            // 先に既存接続先を無効にしてから接続します
                            for (WifiConfiguration c0 : wifiManager.getConfiguredNetworks()) {
                                wifiManager.enableNetwork(c0.networkId, false);
                            }
                            wifiManager.enableNetwork(networkId, true);
                        }
                        break;
                    }
                }
            } catch (NullPointerException e) {
                // 適切な例外処理をしてください。
            }

        }
     }

}


■activity_wi_fi.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ToggleButton
        android:id="@+id/toggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ToggleButton"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="82dp" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:text="Wi-Fi状態"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="24dp"
        android:layout_marginTop="37dp" />

</RelativeLayout>


*WiFiActivityの箇所を変更する事により、ボタンの「オン」「オフ」により、
登録したssidのwifiが接続、切断ができるようにしたいのですが、どのようにしたら
良いかご教授いただきたくお願い致します。

アプリを開いた際、wifiに接続はできるのですが(OFFの場合、接続ONになる)、ボタンの「ON」「OFF」での制御がうまくいかなく困っています。
「public void onClick(View v) {」の処理でボタンのON.OFFの処理命令を記載しようとしておりますが、うまくいかなく困っています。

どうかご教授、宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

私が以前練習の為作ったwifiの状態表示/切り替えアプリのソース(圧縮)ですが参考になれば。

ダウンロード用のパスワード:sample

アップロード先

作成の時に参考にしたHP

WiFi接続情報を取得する - Androidプログラマへの道 ~ Moonlight 明日香 ~

Android の Wi-Fi 実装に関する情報のまとめ | 穀風

回答そのものでなくてすいません・・

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 15:22

    横から失礼します
    サンプルコードを動かすことに躍起になっているように見えますが、
    肝心のコード自体は読んでみましたか?
    読んでみて何をやっているのか理解できるのであれば、
    自分のコードを修正してみて、自分のコードを動かしてしまえば良いと思いませんか?

    また私がこのような状態に遭遇した場合、新しくプロジェクトを作って、
    リソース周りとクラスの中身だけコピー、importは現状に合わせて張り直すという手段をとります。

    キャンセル

  • 2017/09/27 10:04

    私も他の方のコードを取り込む場合は、abs123さんの指摘と同じ手段を取ります。

    ComponentInfo{org.test.myapplication.App2/org.test.myapplication.App2.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "org.test.myapplication.App2.MainActivity"

    「App2にMainActivityなんてクラスは無い」ってエラーなんだけど、
    kumakumatan氏がどういった立場の方かは分かりませんが、
    文章を見る限り最低でも中学生以上なのは類推出来ます。
    正直言って簡単な英語を読めない(又は全く読む気が無い)なら諦めた方が身の為かと思います。

    それと、これ以上回答する気はもはやありません、これにて失礼致します。
    この一連の質問をご覧になっている方々、お目汚し失礼致しました。

    キャンセル

  • 2017/09/27 16:22

    何度も申し訳ございませんでした。
    良く見ると、プロジェクト名を「org.test.myapplication.App2」に指定しておりましたので、
    エラーになったと思います。実際のディレクトリ構造から「org.test.myapplication」がプロジェクト名
    なので、「.App2」をカットすると事で解決しました。
    いただいたサンプルコードを基にこれから勉強していきたいと思います。

    本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る