LoginSignup
4
5

More than 3 years have passed since last update.

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

Posted at

はじめに

AndroidStudioの開発を始めたばかりで、電子工作とか以前にやっているとアクチュエータをスマホから動かしてみたい!IOTを自分で開発してみたい!ってたまに思う。
そこでBluetoothから始めてみようと思ったが、問題発生。
・意外にネットに落ちているソースが少ない
・あってもjava
・kotlinだとしても1年前とかでなんか仕様が噛み合わない
公式ドキュメントは参考になるが、難しいこと言ってて、困ったとき毎回時間とりそうw
なので、自分なりにまとめることにした。

使用環境

・AndroidStudio4.0
・APIレベル29
・Android端末:OPPO 2020 5A

目次

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

Bluetooth基礎知識

Bluetoothの種類

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

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

Bluetooth接続までのプロセス

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

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

パーミッション

Bluetoothを利用する。この時点で必要なものが以下の2つ
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

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

所感

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

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

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5