kotlinでのBluetooth開発　～有効化編～

#はじめに
AndroidStudioの開発を始めたばかりで、電子工作とか以前にやっているとアクチュエータをスマホから動かしてみたい！ＩＯＴを自分で開発してみたい！ってたまに思う。
そこでBluetoothから始めてみようと思ったが、問題発生。
・意外にネットに落ちているソースが少ない
・あってもjava
・kotlinだとしても１年前とかでなんか仕様が噛み合わない
[公式ドキュメント](https://developer.android.com/guide/topics/connectivity/bluetooth?hl=ja)は参考になるが、難しいこと言ってて、困ったとき毎回時間とりそうｗ
なので、自分なりにまとめることにした。

###使用環境
・AndroidStudio4.0
・APIレベル29
・Android端末：OPPO 2020 5A


#目次
・Bluetooth基礎知識
・設定
・処理の加え方
・所感

#Bluetooth基礎知識

###Bluetoothの種類
AndroidStudioでは、実は２種類の仕様がある。消費電力量の違い。
両者は結構変更点が多く、互換性はない。
・Classic Bluetooth
　　　　ストリーミングや端末間通信をするような電力を多めに使うための規格
・Bluetooth Low Energy
　　　　低電力消費に特化した規格

今回はClassic
データをやり取りするようなプロダクトのときは、とりあえずClassicでおｋ



###Bluetooth接続までのプロセス
1.ペアリングできる端末の検索
2.接続のリスエストの送信
3.ボンディングプロセス
　　　セキュリティキーの交換をして、そのキーはキャッシュに保存される。
4.チャンネル
　　　データのやり取りができるようになる
ボンディングは維持されるので、次回からは検出したら自動接続。

あまり理解してないので、殴り書き。



###パーミッション
Bluetoothを利用する。この時点で必要なものが以下の２つ
・**BLUETOOTH**
　　接続のリクエスト、接続の受け入れ、データ転送のため
・**ACCESS_FINE_LOCATION**
　　ユーザの位置情報を取得のため
>注意：
APIレベル28以下　→　ACCESS_COARSE_LOCATION
APIレベル29以上　→　ACCESS_FINE_LOCATION

必要であれば次のパーミッションも記述する。
・**BLUETOOTH_ADMIN**
　　アプリで検出、Bluetooth設定を操作「PowerManager」、などなど。
　　ほとんどのアプリでは、検出の時にしかこのパーミッションは使わない。
　　例外で「PowerManager」そのほかの設定の操作は触れるべきではないとのこと。
  



#設定
ココからコーディング。
manifestタグ内に、以下のコードを宣言

```AndroidManifest.xml
    <!-- Bluetooth使うなら必須 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <!-- 検出用 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
```


#有効化手順

```MainActivity.kt
 
class MainActivity : AppCompatActivity() {
    val REQUEST_ENABLE_BT = 1
    // BluetoothAdapter を取得
    val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 端末がBluetoothサポートされてる？
        if (bluetoothAdapter == null) {
            Toast.makeText(applicationContext, R.string.not_support, Toast.LENGTH_LONG).show()
            finish()
            return
        }

        // bluetoothは　有効になってる？
        // 無効なら有効にしていいか許可をとるダイアログを表示する。
        if (bluetoothAdapter?.isEnabled == false) {
            val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
        }
    }

    // 有効化処理メソッド
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when(resultCode){
            RESULT_OK ->{
                Toast.makeText(applicationContext, R.string.valid, Toast.LENGTH_LONG).show()
                Log.d("qwert", "有効")
            }
            RESULT_CANCELED ->{
                Toast.makeText(applicationContext, R.string.not_valid, Toast.LENGTH_LONG).show()
                Log.d("qwert", "無効")
            }
        }
    }
}

```
無効だったとき
startActivityForResult()で、有効化するためのメソッドonActivityResult()を呼び出す。

onActivityResult()内のresultCodeには
ユーザが許可　→　RESULT_OK
ユーザが拒否　→　RESULT_CANCELED

![messageImage_1606960145307.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/620df7ed-1ecb-e9ac-1167-7a164691a328.jpeg)



>プログラムの解釈は筆者の考えです。
間違っていたり誤解を生む可能性があります。




#所感
今回は有効化しかあっていないので、徐々に拡張して記事にしていく。
ＬＥＤをスマホアプリから光らせたり、RasPiでアクチュエータ制御したりと色々できそう。

Qiita初心者で見づらかったら申し訳ないです。
指摘してくれると嬉しいです。