PlatformException (PlatformException(startScan, Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@bae2447b: GattService registerScanner, java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@bae2447b: GattService registerScanner
时间: 2023-09-24 13:11:14 浏览: 66
这是一个异常信息,看起来与Android蓝牙扫描权限有关。在Android应用开发中,如果要使用蓝牙功能,需要在应用的AndroidManifest.xml文件中添加相应的权限声明。这个错误信息提示你的应用在使用蓝牙扫描时没有添加BLUETOOTH_SCAN权限,建议你检查一下你的应用是否已经添加了这个权限声明。如果没有,可以在AndroidManifest.xml文件中添加以下代码:
```
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
```
同时,需要注意的是,在Android 6.0及以上版本中,蓝牙扫描权限是属于危险权限范畴,需要动态请求用户授权。如果你的应用是在Android 6.0及以上版本上运行的,还需要在代码中动态请求蓝牙扫描权限。
相关问题
Android BLE蓝牙扫描代码 不会出现BtGatt.GattService is scanning too frequently警告
在 Android 中使用 BLE 扫描功能时,可以通过设置扫描参数来避免出现 `BtGatt.GattService is scanning too frequently` 的警告。在代码中,可以通过设置 `ScanSettings` 对象的 `setReportDelay()` 方法来设置扫描间隔,从而避免扫描过于频繁。具体的代码如下所示:
```java
// 创建一个 ScanSettings 对象,用于设置扫描参数
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // 设置扫描模式
.setReportDelay(5000) // 设置扫描间隔为 5 秒
.build();
// 创建一个 ScanFilter 对象,用于设置过滤条件
ScanFilter filter = new ScanFilter.Builder()
.setDeviceName("MyDevice") // 设置设备名称
.build();
// 开始扫描
BluetoothLeScanner scanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
scanner.startScan(Collections.singletonList(filter), settings, scanCallback);
```
在上面的代码中,`setReportDelay(5000)` 方法用于设置扫描间隔为 5 秒,可以根据需要进行调整。需要注意的是,`setReportDelay()` 方法的单位是毫秒。设置好扫描参数后,可以通过 `startScan()` 方法来开始扫描。在回调函数 `scanCallback` 中,可以获取到扫描结果并进行相应的处理。需要注意的是,扫描结束后需要调用 `stopScan()` 方法来停止扫描,以释放相关资源。
wifiManager.startScan已被弃用
是的,从Android 9(API级别28)开始,`WifiManager.startScan()`已被标记为过时。取而代之的是`WifiManager.startScan()`方法的替代方法`WifiManager.getScanResults()`。
以下是一个更新后的示例代码:
```java
public class WifiScanner extends AppCompatActivity {
private WifiManager wifiManager;
private List<ScanResult> scanResults;
private StringBuilder stringBuilder = new StringBuilder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wifi_scanner);
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
Button scanButton = findViewById(R.id.scanButton);
scanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
scanWifi();
}
});
TextView wifiListTextView = findViewById(R.id.wifiListTextView);
wifiListTextView.setMovementMethod(new ScrollingMovementMethod());
}
private void scanWifi() {
stringBuilder = new StringBuilder();
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
wifiManager.startScan();
Toast.makeText(this, "Scanning WiFi ...", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
scanResults = wifiManager.getScanResults();
for (ScanResult scanResult : scanResults) {
stringBuilder.append("SSID: ")
.append(scanResult.SSID)
.append(" , BSSID: ")
.append(scanResult.BSSID)
.append(" , RSSI: ")
.append(scanResult.level)
.append("\n\n");
}
TextView wifiListTextView = findViewById(R.id.wifiListTextView);
wifiListTextView.setText(stringBuilder.toString());
}
}, 5000); // 5 seconds delay
}
}
```
在此示例中,我们使用了`WifiManager.getScanResults()`方法来获取扫描结果。我们还使用了`Handler`来添加5秒的延迟,以便给WiFi扫描一些时间来完成。一旦扫描完成,我们遍历每个扫描结果,并将它们附加到`StringBuilder`中,最后将其显示在TextView中。
虽然`WifiManager.startScan()`仍然可以在Android 10及更低版本中使用,但我们建议使用`WifiManager.getScanResults()`,以确保代码在未来的Android版本中仍然可以正常工作。