2016/10/21

Android Studio で Update&Restart がうまくいかない時の対処方法

Unity LauncherUbuntu 16.04 LTS に Android Studio を登録してから、"Update&Restart" を押しても Update が行われなくなってしまいました。

Android Studio が終了するものの、その後何も起こらず、手動で起動してもアップデートされていないのです。

で、調べてみたところ、既に報告がありました。

> 参考
>
> [Android Studio: "Update & Restart" doesn't work - Stack Overflow](http://stackoverflow.com/questions/25379665/android-studio-update-restart-doesnt-work)

Android Studio を起動する時に余計なオプションをつけると、うまくいかないようです。

また、`android-studio` のインストールされているディレクトリの書き込み権限がない場合も同じような問題が起こります。
こちらはエラーメッセージにその旨が表示されるのでわかりやすいです。

2016/10/20

Android で Wi-Fi 機能の有効・無効の変化をイベントとして取得する

2016/10/19

Android で Wi-Fi 機能を有効・無効にする


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

Wi-Fi 機能の有効・無効を切り替えるには、`WifiManager.setWifiEnabled()` を実行します。

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

// 有効にする
wm.setWifiEnabled(true);

// 無効にする
wm.setWifiEnabled(false);
```

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

```xml

```

### 現実的な実装
実際は、以下のように Wi-Fi の状態を確認してから使用することが多くなると思います以下のコードを実行する場合は、`android.permission.ACCESS_WIFI_STATE` パーミッションも設定する必要があります。

```java
// Click する度に On/OFF を切り替える
@Override
public void onClick(View v) {
    WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
    
    if (wm.isWifiEnabled()) {
        // Wi-Fi が有効な場合は無効にする
        wm.setWifiEnabled(false);
    } else {
        // 有効にしている最中は意味がないので、状態を確認
        // ただし、WIFI_STATE_ENABLING 中に setWifiEnabled() を呼んでも問題はない
        if (wm.getWifiState() != WifiManager.WIFI_STATE_ENABLING) {
            wm.setWifiEnabled(true)
        }
    }
}
```

参考
[穀風: Android で Wi-Fi 機能が現在有効かどうか調べる](http://kokufu.blogspot.jp/2016/10/android-wi-fi_60.html)

Android で Wi-Fi 機能が現在有効かどうか調べる


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

Wi-Fi 機能の ON/OFF を調べます。
また、Wi-Fi の ON/OFF 切り替え時には状態があり、より正確な制御をするためには、状態を確認する必要があります。

### コード

```java
// Activity 等の Context 内で

// Wi-Fi ON/OFF の取得
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
boolean isWifiEnabled = wm.isWifiEnabled();

// 状態の取得
// WifiManager.WIFI_STATE_DISABLED
// WifiManager.WIFI_STATE_DISABLING
// WifiManager.WIFI_STATE_ENABLED
// WifiManager.WIFI_STATE_ENABLING
// WifiManager.WIFI_STATE_UNKNOWN
int wifiState = wm.getWifiState()
```

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

```xml

```

### isWifiEnabled と wifiState との関係
`android.net.wifi.WifiManager` のソースコードAndroid 7.0 Nougatは以下のようになっています。
つまり、Wi-Fi の変化時、`isWifiEnabled` は `false` であり、細かい状態を `wifiState` から取得しなければなりません。

```java
public boolean isWifiEnabled() {
    return getWifiState() == WIFI_STATE_ENABLED;
}
```


### GUI上での表示
GUI 上では Wi-Fi の設定から確認可能な項目です。

設定 → 無線とネットワーク → Wi-Fi

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

ここ数日、Android の Wi-Fi まわりの実装をしていて、その際に必要になった情報をまとめておこうと思います。