Требуется разрешение android.permission.BLUETOOTH_SCAN в классе ThreadAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Требуется разрешение android.permission.BLUETOOTH_SCAN в классе Thread

Сообщение Anonymous »

Я создаю приложение для Android, которое использует Bluetooth для подключения к третьему устройству.В моем проекте я пытаюсь подключиться к устройству в классе потока следующим образом:
public class BTClient extends Thread {
UUID MY_UUID = UUID.fromString("00001101-0000");

private BluetoothAdapter _adapter;

private BluetoothSocket _btStream;
private String _connectionString;

//private OnSocketClosedErrorListener _socketClosedErrorListener;

private BluetoothDevice _device;

public BluetoothDevice getDevice() {
return _device;
}

private BTComms _comms;

public BTComms getComms() {
return _comms;
}

private boolean _isConnected = false;

public boolean IsConnected() {
return _isConnected;
}

public boolean _isValidBlueToothAddress = false;

public void IsValidBlueToothAddress() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_isValidBlueToothAddress = _adapter.checkBluetoothAddress(_connectionString);
}
}

private Vector eventSubscribers = new Vector();

/*This is an array of objects that implement the ConnectedListener interface. Right now the only class that
implements it is ConnectListenerImpl class and it implements the Connected method*/
private void OnConnected() {
@SuppressWarnings("unchecked")
//Create a new Vector with exactly same elements as eventSubscribers
Vector handler = (Vector) eventSubscribers.clone();
Iterator iter = handler.iterator();
while (iter.hasNext()) {
iter.next().Connected(new ConnectedEvent(this));
}
}

public void addConnectedEventListener(ConnectedListener listener) {
eventSubscribers.add(listener);
}

public void removeConnectedEventListener(ConnectedListener listener) {
eventSubscribers.remove(listener);
}

@SuppressLint("MissingPermission")
public BTClient(BluetoothAdapter adapter, String connectionString/*, OnSocketClosedErrorListener listener*/) throws IOException {
// _socketClosedErrorListener = listener;
//Initialize the class variables
_adapter = adapter; //Assign the adaptor
// Initializing all other variables to null
_isConnected = false;
_comms = null;
_btStream = null;
_device = null;
_connectionString = connectionString;
IsValidBlueToothAddress();
//Get a device for the given BT MAC address
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_device = _adapter.getRemoteDevice(_connectionString);
}
/* try {*/
//Create a Secure RFComm Bluetooth socket for secure outgoing connection with device
//using a given "UUID--using well known UUID SPP suggested by Android??"

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream = _device.createRfcommSocketToServiceRecord(MY_UUID);
}
if (_btStream != null) { //Attempt to connect to a remote device...Needs an exception check here to
//see if it fails
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream.connect();
}
_isConnected = true;
}
/*} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}

@Override
public void run() {
//Needs to call this to be sure enough to cancel a discovery service
//since it is heavy weight service
//if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_adapter.cancelDiscovery();
//}
if (_isConnected)
StartCommunication();
else
System.out.println("Can't connect to the BioHarness.");
}

private void StartCommunication() {
//Create a new commmunication thread and run it
_comms = new BTComms(_btStream/*, _socketClosedErrorListener*/);
_comms.start();

//Calls Connected method which calls ReceivedPacketMethod that prints information on the phone's text box based on the message type
OnConnected();
}

public void Close() {
if (_btStream != null) {
try {
if (_comms != null)
_comms.Close();
if (_btStream != null)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
_isConnected = false;
//_btStream = null;
}
}

Теперь этот код работает, когда я использовал Android 8, но теперь мне нужно использовать этот код в новой ОС Android, поэтому, когда я пытаюсь подключиться к устройству, приложение возвращает мне следующую ошибку:
FATAL EXCEPTION: Thread-3
Process: it.rmountain, PID: 10445
java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@b09f4322: AdapterService cancelDiscovery
at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
at android.os.Parcel.createException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2393)
at android.os.Parcel.readException(Parcel.java:2335)
at android.bluetooth.IBluetooth$Stub$Proxy.cancelDiscovery(IBluetooth.java:3192)
at android.bluetooth.BluetoothAdapter.cancelDiscovery(BluetoothAdapter.java:1876)
at zephyr.android.BioHarnessBT.BTClient.run(BTClient.java:119)

Код строки в BtClient.java следующий:
_adapter.cancelDiscovery();

Как это исправить?
ИЗМЕНИТЬ
Это мой файл AndroidManifest











Подробнее здесь: https://stackoverflow.com/questions/791 ... read-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»