蓝牙扫描无法工作android studio api 29
我有一个用android studio制作的应用程序,它连接到我开发的安抚风速仪。在我把它提交给谷歌之前,一切都很顺利。他们拒绝了,说我需要targetSdkVersion 29。当我使用targetSdkVersion 29构建它时,应用程序不再扫描。但当我使用targetSdkVersion 26构建它时,它就可以工作了 AndroidManifest.xml蓝牙扫描无法工作android studio api 29,android,api,android-studio,bluetooth,Android,Api,Android Studio,Bluetooth,我有一个用android studio制作的应用程序,它连接到我开发的安抚风速仪。在我把它提交给谷歌之前,一切都很顺利。他们拒绝了,说我需要targetSdkVersion 29。当我使用targetSdkVersion 29构建它时,应用程序不再扫描。但当我使用targetSdkVersion 26构建它时,它就可以工作了 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?&g
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.windgauge"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.windgauge.ScanActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.windgauge.DeviceActivity" android:label="@string/app_name" />
</application>
</manifest>
ScanActivity.java
package com.windgauge;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.windgauge.util.BleUtil;
import com.windgauge.util.ScannedDevice;
import java.util.ArrayList;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.RuntimePermissions;
@RuntimePermissions
public class ScanActivity extends AppCompatActivity implements BluetoothAdapter.LeScanCallback {
private BluetoothAdapter mBTAdapter;
private DeviceAdapter mDeviceAdapter;
private boolean mIsScanning;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_scan);
Button scan = findViewById(R.id.scan);
scan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ScanActivityPermissionsDispatcher.startScanWithPermissionCheck(ScanActivity.this);
}
});
init();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopScan();
}
@Override
public void onLeScan(final BluetoothDevice newDeivce, final int newRssi,
final byte[] newScanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mDeviceAdapter.update(newDeivce, newRssi, newScanRecord);
}
});
}
private void init() {
// BLE check
if (!BleUtil.isBLESupported(this)) {
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
finish();
return;
}
// BT check
BluetoothManager manager = BleUtil.getManager(this);
if (manager != null) {
mBTAdapter = manager.getAdapter();
}
if (mBTAdapter == null) {
Toast.makeText(this, R.string.bt_unavailable, Toast.LENGTH_SHORT).show();
finish();
return;
}
if (!mBTAdapter.isEnabled()) {
Toast.makeText(this, R.string.bt_disabled, Toast.LENGTH_SHORT).show();
finish();
return;
}
// init listview
ListView deviceListView = (ListView) findViewById(R.id.list);
mDeviceAdapter = new DeviceAdapter(this, R.layout.listitem_device,
new ArrayList<ScannedDevice>());
deviceListView.setAdapter(mDeviceAdapter);
deviceListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterview, View view, int position, long id) {
ScannedDevice item = mDeviceAdapter.getItem(position);
if (item != null) {
Intent intent = new Intent(view.getContext(), DeviceActivity.class);
BluetoothDevice selectedDevice = item.getDevice();
intent.putExtra(DeviceActivity.EXTRA_BLUETOOTH_DEVICE, selectedDevice);
startActivity(intent);
// stop before change Activity
stopScan();
}
}
});
stopScan();
}
@NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
void startScan() {
if ((mBTAdapter != null) && (!mIsScanning)) {
mBTAdapter.startLeScan(this);
mIsScanning = true;
setProgressBarIndeterminateVisibility(true);
invalidateOptionsMenu();
}
}
private void stopScan() {
if (mBTAdapter != null) {
mBTAdapter.stopLeScan(this);
}
mIsScanning = false;
setProgressBarIndeterminateVisibility(false);
invalidateOptionsMenu();
}
}
package com.windgauge;
导入android.Manifest;
导入android.bluetooth.BluetoothAdapter;
导入android.bluetooth.bluetooth设备;
导入android.bluetooth.BluetoothManager;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.view;
导入android.view.Window;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.Button;
导入android.widget.ListView;
导入android.widget.Toast;
导入androidx.appcompat.app.appcompat活动;
导入com.windgauge.util.BleUtil;
导入com.windgauge.util.ScannedDevice;
导入java.util.ArrayList;
导入权限.dispatcher.NeedsPermission;
导入权限.dispatcher.RuntimePermissions;
@运行时权限
公共类ScanActivity扩展AppCompatActivity实现BluetoothAdapter.LeScanCallback{
私人蓝牙适配器;
专用设备适配器mDeviceAdapter;
私有布尔错扫描;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE\u不确定\u进度);
setContentView(R.layout.activity\u扫描);
按钮扫描=findViewById(R.id.scan);
scan.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
ScanActivityPermissionsDispatcher.startScanWithPermissionCheck(ScanActivity.this);
}
});
init();
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
停止扫描();
}
@凌驾
仅限公共无效扫描(最终蓝牙设备newDeivce、最终int newRssi、,
最终字节[]newscan记录){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
mDeviceAdapter.update(newdevce、newRssi、newScanRecord);
}
});
}
私有void init(){
//支票
如果(!BleUtil.isBLESupported(此)){
Toast.makeText(不支持这个,R.string.ble_,Toast.LENGTH_SHORT).show();
完成();
返回;
}
//BT支票
BluetoothManager=BleUtil.getManager(this);
if(manager!=null){
mBTAdapter=manager.getAdapter();
}
if(mBTAdapter==null){
Toast.makeText(this,R.string.bt_不可用,Toast.LENGTH_SHORT).show();
完成();
返回;
}
如果(!mBTAdapter.isEnabled()){
Toast.makeText(这个,R.string.bt_被禁用,Toast.LENGTH_SHORT.show();
完成();
返回;
}
//初始化列表视图
ListView deviceListView=(ListView)findViewById(R.id.list);
mDeviceAdapter=新设备适配器(此,R.layout.listitem_设备,
新的ArrayList());
setAdapter(mDeviceAdapter);
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView AdapterView,视图视图,整型位置,长id){
ScannedDevice item=mDeviceAdapter.getItem(位置);
如果(项!=null){
Intent Intent=新意图(view.getContext(),DeviceActivity.class);
BluetoothDevice selectedDevice=item.getDevice();
intent.putExtra(DeviceActivity.EXTRA\u BLUETOOTH\u设备,所选设备);
星触觉(意向);
//更改前停止活动
停止扫描();
}
}
});
停止扫描();
}
@NeedsPermission(Manifest.permission.ACCESS\u\u位置)
void startScan(){
如果((mBTAdapter!=null)&(!扫描错误)){
mBTAdapter.startescan(本);
错误扫描=正确;
SetProgressBarInDeterminateVibility(真);
无效操作菜单();
}
}
私有void stopScan(){
如果(mBTAdapter!=null){
mBTAdapter.stopLeScan(本);
}
错误扫描=错误;
SetProgressBarInDeterminateVibility(假);
无效操作菜单();
}
}