📚

BluetoothLeGatt(Google公開のサンプル)でscanが動作しない件。(2025/08/31現在)

に公開

なんとなんと。2025/08/31時点だと。もうBLE周りはがっさり変更しちまって。過去記事のままだと動かなくなったよ。
別記事で新しいソースを説明します。しばしお待ちを。

Abstract

  • Android公式のサンプルコードが動かないので、修正して動くようにした話。
  • 修正コードは下記githubにコミットしたよ。

~~github : https://github.com/rg687076/BluetoothLeGatt_ex.git~~

概要

Android公式のソースコードなのに動かないって orz
~~公式コード : https://github.com/android/connectivity-samples.git~~
最近AndroidでBLEを開発する必要があって、上記からソースコード一式を取得して動かしてみた。
なのにいつまでたっても、BLE一覧にデバイスが全く表示されない。どげんこと?

結論から言うと、権限不足。
下記対応で解決した。

  1. AndroidManifest.xmlに下記を追加。
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  2. ActivityのonCreate()に下記コードを追加。

onCreate()
        /* Bluetooth用権限が許可されていない場合はリクエスト. */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSIONS);~~
            }
        }
  1. Activityにパーミッション取得結果の関数を追加。
    private final static int REQUEST_PERMISSIONS = 1111;
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        /* 対象外なので、無視 */
        if (requestCode != REQUEST_PERMISSIONS) return;

        /* 権限リクエストの結果を取得する. */
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(), "aaaaaaaaaaa", Toast.LENGTH_LONG).show();
            finish();
        }
    }

できた。

ソードコードは下記。
~~https://github.com/rg687076/BluetoothLeGatt_ex.git~~

Discussion