2

Только что обновил мой андроид до зефира и понял, что он работает не очень хорошо. Я только что создали приложение, которое сообщает Устройства и услуги (Доступные с UUID,) через классический Bluetooth:Android Marshmallow [API 23]: Bluetooth UUID возвращает NULL

Я проверил его в:

API 16

enter image description here

API 22

enter image description here

API 23

enter image description here

manifiest разрешений My являются:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

И если вы хотите, чтобы проверить код приложения:

Я бегу из идей, поэтому любая помощь будет принята с благодарностью

Спасибо!

ответ

0

Чтобы предоставить пользователям более полную защиту данных, начиная с этой версии, Android удаляет программный доступ к локальному идентификатору оборудования для приложений с использованием API Wi-Fi и Bluetooth. Теперь методы WifiInfo.getMacAddress() и BluetoothAdapter.getAddress() возвращают постоянное значение 02:00:00:00:00:00.

Чтобы получить доступ к аппаратному идентификаторам соседних внешних устройств через Bluetooth и Wi-Fi сканирование, ваше приложение должно теперь ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION разрешение на:

WifiManager.getScanResults(); 
BluetoothDevice.ACTION_FOUND; 
BluetoothLeScanner.startScan(); 

так это функция обновления, добавьте эти три метода вы можете получить UUID

+0

Спасибо за ваш ответ, но как вы можете видеть в манифесте есть эти разрешения уже есть. И если вы проверите приложение, вы можете глубже взглянуть на ситуацию. еще раз спасибо – Lug

0

После головных болей и часов исследований, ответ создать сокет не с CreateInsecureRfcommSocketToServiceRecord, но вместо сCreateRfcommSocketToServiceRecord и а по умолчанию UUID, как "00001101-0000-1000-8000-00805F9B34FB"

0

Я должен представить, что у вас такая же проблема, как и у меня, для SDK 23 вы должны заставить пользователя подтвердить, что они разрешают ACCESS_COARSE_LOCATION. (Я предполагаю, что вы выполняете поиск в BLE)

посмотрите на консольный журнал, и я предполагаю, что вы найдете очень сложную ошибку, которая выглядит так, выделенная синим цветом.

java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results 
       at android.os.Parcel.readException(Parcel.java:1627) 
       at android.os.Parcel.readException(Parcel.java:1579) 
       at android.bluetooth.IBluetoothGatt$Stub$Proxy.startScan(IBluetoothGatt.java:772) 
       at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.onClientRegistered(BluetoothLeScanner.java:324) 
       at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:56) 
       at android.os.Binder.execTransact(Binder.java:453) 

Оказывается, что вам необходимо получить разрешение пользователя (например, приложение IOS), поэтому вам нужно добавить в некоторый код в вас инициализации, как этот

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
     if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ 
      if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION)){ 
       if (DEBUG) Log.i(TAG, "EXPLANATION NEEDED"); 
       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setTitle("Warning Permission Needed"); 
       builder.setMessage("If you don't enable the location for this app then we can not connect to the controller"); 
       builder.setPositiveButton("Change", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
          requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION); 
         } 
        } 
       }); 
       AlertDialog dialog = builder.create(); 
       dialog.show(); 
      }else{ 
       requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_LOCATION); 
      } 
     } 
    } 

Здесь вы должны обращаться, что делать, если пользователь не читает сообщение, а клики отрицают. поэтому проверьте возвращение в поле ниже методе

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == REQUEST_LOCATION){ 
     if (grantResults[0] != PackageManager.PERMISSION_GRANTED){ 
      // ask the question again as they denied the permission 
     } 
    } 

} 

В конце концов, что вы это все вдруг снова работать, если ваша проблема была, как моя

Смежные вопросы