質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

0回答

1534閲覧

androidにおけるBLE開発時にセントラルのscanCallBackが呼ばれない問題について

Tera0724

総合スコア18

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2022/10/31 10:50

編集2022/10/31 14:37

現在、android端末2台を使用してBLE通信の実装(central機のスキャンまで)を行おうと考えております。
内容としては、
片方の端末をペリフェラル端末としてアドバタイジング発信を行う。
もう片方の端末をセントラル端末としてスキャンさせてペリフェラル端末を見つける。
スキャンした情報をlogとして出力する。

まずはセントラル端末でのスキャンまでを最初のゴールと考えて開発を行いました。
各ソースコードは以下となります。

セントラル側

MainActivity.java

1package com.webserva.wings.android.beacon_central; 2 3import android.Manifest; 4import android.bluetooth.BluetoothAdapter; 5import android.bluetooth.BluetoothDevice; 6import android.bluetooth.BluetoothManager; 7import android.bluetooth.le.BluetoothLeScanner; 8import android.bluetooth.le.ScanCallback; 9import android.bluetooth.le.ScanResult; 10import android.bluetooth.le.ScanFilter; 11import android.bluetooth.le.ScanSettings; 12import android.content.Context; 13import android.content.Intent; 14import android.content.pm.PackageManager; 15import android.os.Build; 16import android.os.Bundle; 17import android.os.ParcelUuid; 18import android.util.Log; 19import android.view.View; 20import android.widget.TextView; 21 22import androidx.appcompat.app.AppCompatActivity; 23import androidx.core.app.ActivityCompat; 24 25import java.util.ArrayList; 26import java.util.List; 27import java.util.UUID; 28 29public class MainActivity extends AppCompatActivity { 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 35 BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 36 BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter(); 37 // on Bluetooth 38 if (!mBluetoothAdapter.isEnabled()) { 39 Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 40 startActivity(enableBtIntent); 41 } 42 final BluetoothLeScanner bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); 43 44 //requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 0); 45 final ScanCallback scanCallback = new ScanCallback() { 46 @Override 47 public void onScanResult(int callbackType, ScanResult result) { 48 super.onScanResult(callbackType, result); 49 Log.d(MainActivity.class.getName(), "callbackType=" + callbackType); 50 BluetoothDevice bluetoothDevice = result.getDevice(); 51 Log.d(MainActivity.class.getName(), "address: " + bluetoothDevice.getAddress()); 52 checkPermission(); 53 Log.d(MainActivity.class.getName(), "name: " + bluetoothDevice.getName()); 54 } 55 56 @Override 57 public void onBatchScanResults(List<ScanResult> results) { 58 super.onBatchScanResults(results); 59 } 60 61 @Override 62 public void onScanFailed(int errorCode) { 63 Log.e("test", "scan error"); 64 super.onScanFailed(errorCode); 65 } 66 }; 67 findViewById(R.id.start_button).setOnClickListener(new View.OnClickListener() { 68 @Override 69 public void onClick(View v){ 70 71 ScanFilter scanFilter = new ScanFilter.Builder() 72 .setServiceUuid(new ParcelUuid(UUID.fromString("65432461-1EFE-4ADB-BC7E-9F7F8E27FDC1"))) 73 .setDeviceName("rk3288") 74 .build(); 75 76 ArrayList scanFilterList = new ArrayList(); 77 scanFilterList.add(scanFilter); 78 ScanSettings scanSettings = new ScanSettings.Builder(). 79 setScanMode(ScanSettings.SCAN_MODE_BALANCED) 80 .build(); 81 82 checkPermission(); 83 bluetoothLeScanner.startScan(scanFilterList, scanSettings, scanCallback); 84 TextView scanText = findViewById(R.id.scan_flag); 85 scanText.setText("scanning"); 86 } 87 }); 88 89 findViewById(R.id.stop_button).setOnClickListener(new View.OnClickListener() { 90 @Override 91 public void onClick(View view) { 92 checkPermission(); 93 bluetoothLeScanner.stopScan(scanCallback); 94 TextView scanText = findViewById(R.id.scan_flag); 95 scanText.setText("stop"); 96 } 97 }); 98 } 99 private void checkPermission() { 100 ArrayList<String> requestPermissions = new ArrayList<>(); 101 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { 102 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { 103 requestPermissions.add(Manifest.permission.BLUETOOTH_CONNECT); 104 } 105 } 106 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADVERTISE) != PackageManager.PERMISSION_GRANTED) { 107 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { 108 requestPermissions.add(Manifest.permission.BLUETOOTH_ADVERTISE); 109 } 110 } 111 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED){ 112 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){ 113 requestPermissions.add(Manifest.permission.BLUETOOTH_SCAN); 114 } 115 } 116 if (!requestPermissions.isEmpty()) { 117 ActivityCompat.requestPermissions(this, requestPermissions.toArray(new String[0]), 101); 118 } 119 } 120}

AndroidManifest.xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools"> 4 <uses-permission android:name="android.permission.BLUETOOTH"/> 5 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 6 <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/> 7 <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/> 8 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 9 <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> 10 <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> 11 <application 12 android:allowBackup="true" 13 android:dataExtractionRules="@xml/data_extraction_rules" 14 android:fullBackupContent="@xml/backup_rules" 15 android:icon="@mipmap/ic_launcher" 16 android:label="@string/app_name" 17 android:roundIcon="@mipmap/ic_launcher_round" 18 android:supportsRtl="true" 19 android:theme="@style/Theme.Beacon_central" 20 tools:targetApi="31"> 21 <activity 22 android:name=".MainActivity" 23 android:exported="true"> 24 <intent-filter> 25 <action android:name="android.intent.action.MAIN" /> 26 27 <category android:name="android.intent.category.LAUNCHER" /> 28 </intent-filter> 29 30 <meta-data 31 android:name="android.app.lib_name" 32 android:value="" /> 33 </activity> 34 </application> 35 36</manifest>

上記ソースコードについて、ペリフェラル側のアプリについてはログを確認する限りでは問題なくonStartSuccessへ進んだため問題なくアドバタイジングが開始されたと考えております。
ただ、セントラル側に関してはlogにscanCallbackによるログが出力されません。
ログについて、一部以下に示します。

log

1234D/EGL_emulation: app_time_stats: avg=1322.56ms min=6.82ms max=8910.30ms count=7 5D/BluetoothAdapter: isLeEnabled(): ON 6D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=4 mScannerId=0 7W/Choreographer: Frame time is 4.309642 ms in the future! Check that graphics HAL is generating vsync timestamps using the correct timebase. 8W/System: A resource failed to call close.

私はこれまでandroidアプリの開発はあまり関わってこなかったため原因がわかりません。
上記について、解消方法をご教授していただきたいです。
参考にした資料については以下に示します。
ソースコードについて読みにくくなっていて申し訳ありません。
宜しくお願い致します。

参考資料1
参考資料2
参考資料3

**補足情報**
Android Studio Dolphin
検証端末:Android OS 7.0
Java

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/10/31 11:26

件名が BEL になってます…。 「~について」では詳細が分かりませんので、セントラルのコールバックが呼ばれない、とかの具合にピンポイントで何が問題なのかを書いたほうが良いと思います。
Tera0724

2022/10/31 14:07

ご指摘ありがとうございます。 修正させていただきます。
jimbe

2022/10/31 15:45

http://taisukeoe.github.io/blog/2015/12/24/android-ble/ によりますと >Android 6.0から、以下のpermission(ACCESS_FINE_LOCATIONでも可)が必要になる上に、更にユーザーに明示的に位置情報使用許可 をもらう必要が有ります(iOSっぽいですね)。 > ><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> とのことで ACCESS_COARSE_LOCATION のチェック・取得が checkPermission() に必要そうですが、如何でしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問