Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
蓝牙扫描无法工作android studio api 29_Android_Api_Android Studio_Bluetooth - Fatal编程技术网

蓝牙扫描无法工作android studio api 29

蓝牙扫描无法工作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

我有一个用android studio制作的应用程序,它连接到我开发的安抚风速仪。在我把它提交给谷歌之前,一切都很顺利。他们拒绝了,说我需要targetSdkVersion 29。当我使用targetSdkVersion 29构建它时,应用程序不再扫描。但当我使用targetSdkVersion 26构建它时,它就可以工作了

AndroidManifest.xml

    <?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(假);
无效操作菜单();
}
}