#はじめに
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タグ内に、以下のコードを宣言
<!-- 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" />
#有効化手順
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
プログラムの解釈は筆者の考えです。
間違っていたり誤解を生む可能性があります。
#所感
今回は有効化しかあっていないので、徐々に拡張して記事にしていく。
LEDをスマホアプリから光らせたり、RasPiでアクチュエータ制御したりと色々できそう。
Qiita初心者で見づらかったら申し訳ないです。
指摘してくれると嬉しいです。