【问题标题】:Scan bluetooth devices not working on Android Things DP3扫描无法在 Android Things DP3 上运行的蓝牙设备
【发布时间】:2017-04-23 01:29:21
【问题描述】:

扫描无法在 Android Things DP3 上运行的蓝牙设备。任何想法/解决方法?未采取行动 BluetoothDevice.ACTION_FOUND。

我已在 Android 6.0 中添加了 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限,但仍无法正常工作。 https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

还有 android.permission.BLUETOOTH_ADMIN、android.permission.BLUETOOTH

我已经检查过,ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION over Android >=6.0 需要运行时权限,但由于 Android Things 限制它会给出错误。

private void checkPermission() {

    List<String> permissionsList = new ArrayList<String>();
    List<String> permissionsNeeded = new ArrayList<String>();

    // app
    permissionsList.add(Manifest.permission.ACCESS_FINE_LOCATION);
    permissionsList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    permissionsList.add(Manifest.permission.ACCESS_WIFI_STATE);
    permissionsList.add(Manifest.permission.SET_TIME_ZONE);
    // AndroidThingsLib
    permissionsList.add(Manifest.permission.BLUETOOTH_ADMIN);
    permissionsList.add(Manifest.permission.BLUETOOTH);
    permissionsList.add(Manifest.permission.CHANGE_WIFI_STATE);
    permissionsList.add(Manifest.permission.INTERNET);
    permissionsList.add(Manifest.permission.ACCESS_NETWORK_STATE);

    for (int i = 0; i < permissionsList.size(); i++){
        if (checkSelfPermission(permissionsList.get(i)) == PackageManager.PERMISSION_GRANTED) {
            permissionsNeeded.add(permissionsList.get(i));
            updateDataLogs(SourceEnum.System, "GRANTED: " + permissionsList.get(i));
        } else {
            permissionsNeeded.add(permissionsList.get(i));
            updateDataLogs(SourceEnum.Error, "NOT GRANTED: " + permissionsList.get(i));
        }
    }

    if (permissionsList.size()>0){
        requestPermissions(permissionsNeeded.toArray(new String[permissionsNeeded.size()]),5678);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 5678){
        for (int i = 0; i < permissions.length; i++){
            updateDataLogs(SourceEnum.Error, permissions[i] + " result " + grantResults[i]);
        }
    }
}
private void enableBluetoothScan() {
    updateDataLogs(SourceEnum.System, "enableBluetoothScan");

    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(mReceiver, filter);

    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (bluetoothAdapter.isEnabled()){
        bluetoothAdapter.startDiscovery();
    } else {
        updateDataLogs(SourceEnum.Error, "Bluetooth Adapter not enabled");
    }
}

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            updateDataLogs(SourceEnum.System, "DISCOVERY STARTED");
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            updateDataLogs(SourceEnum.System, "DISCOVERY FINISHED");
        } else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (device.getBondState() != BluetoothDevice.BOND_BONDED)    {
                updateDataLogs(SourceEnum.System, "NEW DEVICE " + device.getName());
            }
        }
    }
};

【问题讨论】:

    标签: bluetooth android-things


    【解决方案1】:

    Platform Overview 中所述,Android Things 不支持运行时权限授予,因为设备可能没有交互式显示屏来显示对话框。相反,对于清单中请求的所有权限,Android Things 会使用安装时权限模型。这意味着调用 requestPermissions() 之类的方法不是必需的,也不会帮助您。

    关于当前预览中遇到的问题,以下摘自Release Notes

    应用程序请求的危险权限在下次设备重启之前不会被授予。这包括新应用安装和现有应用中的新元素。

    目前,当您的应用请求危险权限(如位置权限)时,您需要在安装后(一次性)重启设备,以便在启动期间授予这些权限。

    【讨论】:

      【解决方案2】:

      感谢您的解释,我已经解决了这个问题。因为您尚未将问题标记为已解决:

      build.gradle(应用程序;感谢12):

      apply plugin: 'com.android.application'
      
      android {
          compileSdkVersion 24
          <!-- update this to your version of the Android SDK Tools -->
          buildToolsVersion "25.0.3"
          defaultConfig {
              minSdkVersion 24
          }
      }
      
      dependencies {
          <!-- update this to your version of Android Things -->
          provided 'com.google.android.things:androidthings:0.4-devpreview'
      }
      

      AndroidManifest.xml(感谢12):

      <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=" . . . ">
      
          <!-- required for getState in startDiscovery -->
          <uses-permission android:name="android.permission.BLUETOOTH"/>
          <!-- required for startDiscovery -->
          <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
          <!-- required for the IntentFilter ACTION_FOUND -->
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
      
          <!-- change to your label -->
          <application android:label="Intel Edison">
              <uses-library android:name="com.google.android.things"/>
      
              <!-- change to the name of your Main Activity -->
              <activity android:name=".HomeActivity">
                  <!-- Launch activity as default from Android Studio -->
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN"/>
                      <category android:name="android.intent.category.LAUNCHER"/>
                  </intent-filter>
      
                  <!-- Launch activity automatically on boot -->
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN"/>
                      <category android:name="android.intent.category.IOT_LAUNCHER"/>
                      <category android:name="android.intent.category.DEFAULT"/>
                  </intent-filter>
              </activity>
          </application>
      </manifest>
      

      HomeActivity.java:

      IntentFilter filter = new IntentFilter();
      filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
      filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
      filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
      filter.addAction(BluetoothDevice.ACTION_FOUND);
      filter.addAction(BluetoothDevice.ACTION_NAME_CHANGED);
      registerReceiver(mReceiverBT, filter);
      
      BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
      boolean started = mBtAdapter.startDiscovery();
      if (false == started) {
          <!-- in that case, catch BluetoothAdapter.STATE_ON in the receiver and start the Bluetooth Discovery then -->
          mBtAdapter.enable();
      }
      

      使用此代码,我的应用程序在启动英特尔 Edison 开发板后立即启动,并且能够发现附近的蓝牙设备。备注:

      • 在此板上,Android Things 需要 69 秒(开发者预览版 4)或 82 秒(开发者预览版 3)来启动我的应用。
      • 在 logcat 中,我看到“未授予 android.permission.ACCESS_COARSE_LOCATION 打包权限……因为它之前没有安装”。我找不到解决办法。报告于Issue 62514750
      • 实际上,您可能根本不需要任何“危险”许可——例如,我对 ACTION_FOUND 什么都不做——因为在我的场景中 ACTION_NANE_CHANGED 总是在这里被触发;报告于Issue 62524160

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2020-06-03
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多