페어링 된 장치 목록을 얻는 방법을 알고 있지만 연결되었는지 어떻게 알 수 있습니까?
내 휴대폰의 블루투스 장치 목록에 나열되고 연결 상태가 표시되므로 가능해야합니다.
답변
AndroidManifest에 블루투스 권한 추가,
<uses-permission android:name="android.permission.BLUETOOTH" />
그런 다음을 듣고 텐트 필터를 사용 ACTION_ACL_CONNECTED
, ACTION_ACL_DISCONNECT_REQUESTED
및 ACTION_ACL_DISCONNECTED
방송 :
public void onCreate() {
...
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mReceiver, filter);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
... //Device found
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
... //Device is now connected
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
... //Done searching
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
... //Device is about to disconnect
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
... //Device has disconnected
}
}
};
몇 가지 참고 :
- 응용 프로그램 시작시 연결된 장치 목록을 검색 할 수있는 방법이 없습니다. Bluetooth API는 QUERY를 허용하지 않고 대신 변경 사항을 수신 할 수 있습니다.
- 위의 문제를 해결하는 방법은 알려진 / 페어링 된 모든 장치 목록을 검색 한 다음 각 장치에 연결을 시도하는 것입니다 (연결되어 있는지 확인하기 위해).
- 또는 백그라운드 서비스에서 Bluetooth API를 감시하고 나중에 응용 프로그램에서 사용할 수 있도록 장치 상태를 디스크에 쓸 수 있습니다.
답변
제 사용 사례에서는 블루투스 헤드셋이 VoIP 앱에 연결되어 있는지 확인하고 싶었습니다. 다음 솔루션이 저에게 효과적이었습니다.
public static boolean isBluetoothHeadsetConnected() {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
&& mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}
물론 Bluetooth 권한이 필요합니다.
<uses-permission android:name="android.permission.BLUETOOTH" />
답변
그의 답변에 대해 Skylarsutton에게 큰 감사를 표합니다. 나는 그의 답변으로 이것을 게시하고 있지만 나는 코드를 게시하고 있기 때문에 나는 댓글로 답할 수 없다. 나는 이미 그의 대답을 찬성했기 때문에 어떤 점도 찾고 있지 않습니다. 앞으로 지불하십시오.
어떤 이유로 BluetoothAdapter.ACTION_ACL_CONNECTED는 Android Studio에서 확인할 수 없습니다. Android 4.2.2에서 더 이상 사용되지 않았을까요? 다음은 그의 코드를 수정 한 것입니다. 등록 코드는 동일합니다. 수신자 코드가 약간 다릅니다. 앱의 다른 부분이 참조하는 Bluetooth 연결 플래그를 업데이트하는 서비스에서 이것을 사용합니다.
public void onCreate() {
//...
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(BTReceiver, filter);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
//Do something if connected
Toast.makeText(getApplicationContext(), "BT Connected", Toast.LENGTH_SHORT).show();
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
//Do something if disconnected
Toast.makeText(getApplicationContext(), "BT Disconnected", Toast.LENGTH_SHORT).show();
}
//else if...
}
};
답변
이 는, isConnected의 BluetoothDevice 시스템 API의 기능에 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java
제한된 (페어링 된) 장치가 현재 연결되어 있는지 알고 싶다면 다음 기능이 잘 작동합니다.
public static boolean isConnected(BluetoothDevice device) {
try {
Method m = device.getClass().getMethod("isConnected", (Class[]) null);
boolean connected = (boolean) m.invoke(device, (Object[]) null);
return connected;
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
답변
이 코드는 헤드셋 프로필 용이며 다른 프로필에서도 작동 할 것입니다. 먼저 프로필 리스너 (Kotlin 코드)를 제공해야합니다.
private val mProfileListener = object : BluetoothProfile.ServiceListener {
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
if (profile == BluetoothProfile.HEADSET)
mBluetoothHeadset = proxy as BluetoothHeadset
}
override fun onServiceDisconnected(profile: Int) {
if (profile == BluetoothProfile.HEADSET) {
mBluetoothHeadset = null
}
}
}
그런 다음 블루투스를 확인하는 동안 :
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}
onSeviceConnected가 호출 될 때까지 약간의 시간이 걸립니다. 그 후에 다음에서 연결된 헤드셋 장치 목록을 얻을 수 있습니다.
mBluetoothHeadset!!.connectedDevices
답변
BluetoothAdapter.getDefaultAdapter().isEnabled
-> 블루투스가 열려있을 때 true를 반환합니다.
val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager
audioManager.isBluetoothScoOn
-> 장치가 연결되면 true를 반환합니다.
답변
연결 이벤트를 수신하지 않고 장치의 연결 상태를 가져 오는 방법을 찾고있었습니다. 나를 위해 일한 것은 다음과 같습니다.
BluetoothManager bm = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
List<BluetoothDevice> devices = bm.getConnectedDevices(BluetoothGatt.GATT);
int status = -1;
for (BluetoothDevice device : devices) {
status = bm.getConnectionState(device, BLuetoothGatt.GATT);
// compare status to:
// BluetoothProfile.STATE_CONNECTED
// BluetoothProfile.STATE_CONNECTING
// BluetoothProfile.STATE_DISCONNECTED
// BluetoothProfile.STATE_DISCONNECTING
}