2016/11/30

Android で Wi-Fi Access Point に接続する


> この記事は [Android の Wi-Fi 実装に関する情報のまとめ](http://kokufu.blogspot.jp/2016/10/android-wi-fi_19.html) の一部として書かれました

### コード
Wi-Fi Access Point に接続するには `WifiManager.enableNetwork()` を使用します。

既に登録済みの Access Point に接続する場合は、`WifiManager.getConfiguredNetworks()` を使って `WifiConfiguration` を取得します。

```java
`highlight: 13;
// Activity 等の Context の中で
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);

// targetSsid が既に登録済みの場合
WifiConfiguration targetConfig = null;
for (WifiConfiguration config : wm.getConfiguredNetworks()) {
    if (config.SSID.equals('"' + targetSsid + '"')) { // Quote を取る方向の方が正しいかもしれないが、わかりやすさ重視で
        targetConfig = config;
        break;
    }
}
if (targetConfig != null) {
    wm.enableNetwork(targetConfig.networkId, true);
} else {
    // 登録されてなかった
}
```

まだ登録されていない Access Point の場合は `WifiManager.addNetwork()` で登録してから使用します。

> 参考
>
> [穀風: Android で Wi-Fi Access Point を登録する](http://kokufu.blogspot.jp/2016/11/android-wi-fi-access-point_26.html)

```java
`highlight: 16;
// Activity 等の Context の中で
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);

// targetSsid が未登録の場合は新規登録を先に行う
// 以下は WPA の例
WifiConfiguration targetConfig = new WifiConfiguration();
targetConfig.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
targetConfig.SSID = '"' + targetSsid + '"';
targetConfig.preSharedKey = '"' + password + '"';

// 以下を実行しても targetConfig.networkId は更新されないので
// 返り値の networkId を使う
int networkId = wm.addNetwork(targetConfig);

if (networkId != -1) {
    wm.enableNetwork(networkId, true);
} else {
    // 登録失敗
}
```


### パーミッション
`WifiManager.enableNetwork()` を実行するには `android.permission.CHANGE_WIFI_STATE` パーミッションを AndroidManifest.xml で設定する必要があります。

```xml

```

また、 `WifiManager.getConfiguredNetworks()` を実行するには `android.permission.ACCESS_WIFI_STATE` パーミッションを AndroidManifest.xml で設定する必要があります。

```xml

```

2016/11/26

Android で登録済みの Wi-Fi Access Point を登録解除する

Android で Wi-Fi Access Point を登録する


> この記事は [Android の Wi-Fi 実装に関する情報のまとめ](http://kokufu.blogspot.jp/2016/10/android-wi-fi_19.html) の一部として書かれました

Wi-Fi Access Point を登録する方法です。

2016/11/25

Android で Wi-Fi ScanResult を WifiConfiguration に変換する方法

2016/11/24

Android の Wi-Fi Access Point を表す ScanResult, WifiConfiguration, WifiInfo の違い

2016/11/17

Ubuntu で Spell Hint をCTRL + ALT + H 以外のキーに割り当てる

Ubuntu で [fcitx](https://fcitx-im.org/wiki/Fcitx) を使っていると、CTRL + ALT + H は Spell Hint の切り替えに割り当てられています。
しかし、めったに使わない機能なので、IDE 等で使用したい場合は不便です。

2016/11/11

KeePass 2 on Ubuntu でクリップボードにコピーができない

Ubuntu で [KeePass](https://sourceforge.net/projects/keepass/)Ver 2.32 を便利に使っていたのですが、
いつの日か、ユーザ名やパスワードをコピーできなくなってしまいましたCtrl + c が動作しない。

KeePass のバグかと思っていたのですが、依存するライブラリの問題だったようです。

> 参考
> 
> [KeePass / Bugs / #1057 Copy to clipboard does not work at all (Linux mono)](https://sourceforge.net/p/keepass/bugs/1057/?limit=25)


i386 系の xsel をインストールすることで解決しました。

```console
`gutter: false;
$ sudo apt-get install  xsel:i386
```

2016/11/09

Android で付近の Wi-Fi Access Point を検索して一覧を取得する

2016/11/08

Android 6.0 以降で WifiManager.getScanResults() を普通に実行しても結果が空のリストになってしまう

2016/11/07

Android で 接続している Wi-Fi Access Point の情報を取得する


> この記事は [Android の Wi-Fi 実装に関する情報のまとめ](http://kokufu.blogspot.jp/2016/10/android-wi-fi_19.html) の一部として書かれました

現在接続している Wi-Fi Access Point の情報を取得する方法です。

Access Point の情報は `WifiInfo` にまとまっているので、これを取得します。

> 参考
> 
> [穀風: Android で Wi-Fi の接続状態を確認する](http://kokufu.blogspot.jp/2016/10/android-wi-fi-access-point_27.html)


### コード
```java
// Activity 等の Context の中で
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);

WifiInfo wifiInfo = wm.getConnectionInfo();

// 取得できる情報
// SSID
// BSSID
// Hidden SSID
// Ip Address
// MAC Address
// Frequency 
// RSSI
// Link Speed
// Network ID
// Supplicant State
```

接続していない場合、 `null` が返ってくる**のではなく**、`SupplicantState` が `INACTIVE` なインスタンスが返ってきます。


### パーミッション
このコードを実行するには `android.permission.ACCESS_WIFI_STATE` パーミッションを AndroidManifest.xml で設定する必要があります。

```xml

```