Android 没有蓝牙扫描结果

Android 没有蓝牙扫描结果,android,bluetooth-lowenergy,Android,Bluetooth Lowenergy,我正在尝试扫描该地区的任何可播放设备广播,并在android应用程序中以表格形式显示。然而,当Google Play Store的其他应用程序可以检测到任何可移动设备时,我的应用程序无法检测到任何可移动设备 public class MainActivity extends AppCompatActivity{ //Bluetooth Management private BluetoothAdapter btAdapter; private LeDeviceListAdapter mLeDe

我正在尝试扫描该地区的任何可播放设备广播,并在android应用程序中以表格形式显示。然而,当Google Play Store的其他应用程序可以检测到任何可移动设备时,我的应用程序无法检测到任何可移动设备

public class MainActivity extends AppCompatActivity{

//Bluetooth Management
private BluetoothAdapter btAdapter;
private LeDeviceListAdapter mLeDeviceListAdapter;
private boolean mScanning;

// Set the enable bluetooth code
private final static int REQUEST_ENABLE_BT = 0;

// LOG Messages
private final static String DEBUG_TAG = "";

private static final int SCAN_INTERVAL_MS = 10000;

//Handler
private Handler myHandler;

//Testing For ListView
static String[] words = {"one", "two", "three"};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myHandler = new Handler();
    //Check whether BLE is supported on the device(can selectively disable BLE-related features)
    if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){
        Toast.makeText(this, "ble_not_supported", Toast.LENGTH_SHORT).show();
        finish();
    }

    final BluetoothManager btManager =
            (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
    btAdapter = btManager.getAdapter();

    //Check if Bluetooth Adapter is present in the device
    if(btAdapter == null)
    {
        Toast.makeText(this, "Error : Bluetooth not supported", Toast.LENGTH_SHORT).show();
        Log.i(DEBUG_TAG, "No bluetooth available");
        finish();
        return;
    }

    ListView listView = (ListView) findViewById(R.id.ble_Device_List);
    listView.setAdapter(new BaseAdapter() {
        @Override
        public int getCount() {
            return 0;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return null;
        }
    });              
}

@Override
public void onResume() {
    super.onResume();

    // check for Bluetooth enabled on each resume
    if (btAdapter != null && !btAdapter.isEnabled()) {
        Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
    }

    //Initialise list view adapter
    mLeDeviceListAdapter = new LeDeviceListAdapter();

    ListView listView = (ListView) findViewById(R.id.ble_Device_List);
    listView.setAdapter(mLeDeviceListAdapter);

    scanLeDevice(true);
}


@Override
public void onPause() {
    super.onPause();
    scanLeDevice(false);
    mLeDeviceListAdapter.clear();
}

@Override
public void onStop() {
    super.onStop();

}

@Override
public void onRestart() {
    super.onRestart();


}

@Override
public void onDestroy() {
    super.onDestroy();

    btAdapter = null;
}

@Override
protected void onActivityResult(int request_enable_bt, int result_enable_bt, Intent data) {
    if (result_enable_bt == RESULT_OK) {
        //Display "Turn On" message
        Toast.makeText(this, "Turned On", Toast.LENGTH_SHORT).show();
        Log.i("DEBUG_TOAST", "Turn On Toast Success!");

        // Display device name and MAC Address
        BluetoothManager btManager =
                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        btAdapter = btManager.getAdapter();
        String address = btAdapter.getAddress();
        String name = btAdapter.getName();
        String toastText = name + " : " + address;
        Toast.makeText(this, toastText, Toast.LENGTH_LONG).show();

        Log.i("DEBUG_TOAST", "Device Name and Address Toast Success!");
    } else if (result_enable_bt == RESULT_CANCELED) {
        Toast.makeText(this, "Didn't Turn On", Toast.LENGTH_SHORT).show();
        Log.i("DEBUG_TOAST", "Turn Off Toast Success!");

        finish();
    }
    super.onActivityResult(request_enable_bt, result_enable_bt, data);
}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.main_menu, menu);
    if(!mScanning){
        menu.findItem(R.id.scan).setVisible(true);
        menu.findItem(R.id.stop).setVisible(false);
        menu.findItem(R.id.exit).setVisible(true);
        menu.findItem(R.id.info).setVisible(true);
        menu.findItem(R.id.refresh).setActionView(null);
        Log.i("DEBUG_TOAST", "Menu_mScanning = 0");
    }

    else{
        menu.findItem(R.id.scan).setVisible(false);
        menu.findItem(R.id.stop).setVisible(true);
        menu.findItem(R.id.exit).setVisible(true);
        menu.findItem(R.id.info).setVisible(true);
        menu.findItem(R.id.refresh).setActionView(
                R.layout.actionbar_indeterminate_progress);
        Log.i("DEBUG_TOAST", "Menu_mScanning = 1");
    }
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()){
        case R.id.scan:
              if(mLeDeviceListAdapter.getCount() >0)
              mLeDeviceListAdapter.clear();

            scanLeDevice(true);
            Log.i("DEBUG_TOAST", "Scan button pressed!");
            break;
        case R.id.stop:
            scanLeDevice(false);
            break;

        case R.id.info:
            Intent reminder_Intent = new Intent(MainActivity.this, Reminder.class);
            startActivity(reminder_Intent);
            break;

        case  R.id.exit:
            finish();
            break;
    }
    return true;
}

private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                 mLeDeviceListAdapter.addDevice(device);
                 mLeDeviceListAdapter.notifyDataSetChanged();
            }
        });
    }
};


private void scanLeDevice(final boolean enable) {
    if (enable) {
        Log.i("DEBUG_TOAST", "Scanning enabled!");
        // Stops scanning after a pre-defined scan period.
        myHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScanning = false;
                Log.i("DEBUG_TOAST", "scanLeEnable_mScanning = 0");
                btAdapter.stopLeScan(leScanCallback);
                invalidateOptionsMenu();
            }
        }, SCAN_INTERVAL_MS);

        mScanning = true;
        Log.i("DEBUG_TOAST", "scanLeEnable_mScanning = 1");

        btAdapter.startLeScan(leScanCallback);
    } else {
        mScanning = false;
        Log.i("DEBUG_TOAST", "scanLeNotEnable_mScanning = 0");

        btAdapter.stopLeScan(leScanCallback);
    }
    invalidateOptionsMenu();
}

//Adapter for holding devices found through scanning
private class LeDeviceListAdapter extends BaseAdapter {
    private ArrayList<BluetoothDevice> mLeDevices;
    private LayoutInflater mInflator;

    public LeDeviceListAdapter() {
        super();
        mLeDevices = new ArrayList<BluetoothDevice>();
        mInflator = MainActivity.this.getLayoutInflater();
    }

    public void addDevice(BluetoothDevice device) {
        if (mLeDevices.contains(device)) {
            mLeDevices.add(device);
        }
    }

    public BluetoothDevice getDevice(int position) {
        return mLeDevices.get(position);
    }

    public void clear() {
        mLeDevices.clear();
    }

    @Override
    public int getCount() {
        return mLeDevices.size();
    }

    @Override
    public Object getItem(int i) {
        return mLeDevices.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    public View getView(int position, View convertView, ViewGroup parent){
        ViewHolder viewHolder;

        if (convertView == null){
            mInflator =
                    (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            convertView = mInflator.inflate(R.layout.listitem_device, null);
            viewHolder = new ViewHolder();
            viewHolder.deviceAddress = (TextView) convertView.findViewById(R.id.device_address);
            Log.i("LISTVIEW_1", "1" );
            viewHolder.deviceName = (TextView) convertView.findViewById(R.id.device_name);
            convertView.setTag(viewHolder);
        }
        else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        BluetoothDevice device = mLeDevices.get(position);
        final String deviceName = device.getName();
        if(deviceName != null && deviceName.length()>0){
            viewHolder.deviceName.setText(deviceName);
        Log.i("LISTVIEW_1", "2" );
        }
        else
            viewHolder.deviceName.setText(R.string.unknown_device);
        viewHolder.deviceAddress.setText(device.getAddress());
        return convertView;
    }

}
    static class ViewHolder {
        TextView deviceAddress, deviceName;
    }
}
public类MainActivity扩展了AppCompatActivity{
//蓝牙管理
私人蓝牙适配器;
私人LEDEVICELISTAPTER MLEDVICELISTAPTER;
私有布尔扫描;
//设置启用蓝牙代码
私有最终静态int请求\u启用\u BT=0;
//日志消息
私有最终静态字符串DEBUG_TAG=“”;
专用静态最终整数扫描间隔=10000;
//处理者
私有处理器myHandler;
//ListView的测试
静态字符串[]单词={“一”、“二”、“三”};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myHandler=新处理程序();
//检查设备是否支持BLE(可选择性禁用BLE相关功能)
如果(!getPackageManager().hasSystemFeature(PackageManager.FEATURE\u BLUETOOTH\u LE)){
Toast.makeText(这是“ble_not_supported”,Toast.LENGTH_SHORT).show();
完成();
}
最终蓝牙经理=
(BluetoothManager)getSystemService(Context.BLUETOOTH\u服务);
btAdapter=btManager.getAdapter();
//检查设备中是否存在蓝牙适配器
if(btAdapter==null)
{
Toast.makeText(此“错误:不支持蓝牙”,Toast.LENGTH_SHORT.show();
Log.i(调试标签,“无蓝牙可用”);
完成();
返回;
}
ListView ListView=(ListView)findViewById(R.id.ble\u设备\u列表);
setAdapter(新的BaseAdapter(){
@凌驾
public int getCount(){
返回0;
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
返回null;
}
});              
}
@凌驾
恢复时公开作废(){
super.onResume();
//检查每个简历是否启用蓝牙功能
if(btAdapter!=null&&!btAdapter.isEnabled()){
Intent enableentent=新意图(BluetoothAdapter.ACTION\u REQUEST\u ENABLE);
startActivityForResult(启用意图、请求和启用);
}
//初始化列表视图适配器
mLeDeviceListAdapter=新的LeDeviceListAdapter();
ListView ListView=(ListView)findViewById(R.id.ble\u设备\u列表);
setAdapter(mLeDeviceListAdapter);
扫描设备(真实);
}
@凌驾
公共无效暂停(){
super.onPause();
扫描设备(假);
mLeDeviceListAdapter.clear();
}
@凌驾
公共void onStop(){
super.onStop();
}
@凌驾
公共void onRestart(){
super.onRestart();
}
@凌驾
公共空间{
super.ondestory();
btAdapter=null;
}
@凌驾
活动结果上的受保护无效(int请求\启用\ bt、int结果\启用\ bt、意图数据){
如果(结果\启用\ bt==结果\确定){
//显示“开启”信息
Toast.makeText(此“已打开”,Toast.LENGTH_SHORT).show();
Log.i(“调试土司”,“打开土司成功!”);
//显示设备名称和MAC地址
蓝牙经理=
(BluetoothManager)getSystemService(Context.BLUETOOTH\u服务);
btAdapter=btManager.getAdapter();
字符串地址=btAdapter.getAddress();
String name=btAdapter.getName();
字符串toastText=name+“:”+地址;
Toast.makeText(this,Toast-text,Toast.LENGTH_LONG).show();
Log.i(“DEBUG_TOAST”,“设备名称和地址TOAST Success!”);
}else if(结果\u启用\u bt==结果\u取消){
Toast.makeText(此“未打开”,Toast.LENGTH_SHORT.show();
Log.i(“调试土司”,“关闭土司成功!”);
完成();
}
super.onActivityResult(请求启用、结果启用、数据);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单.主菜单,菜单);
如果(!mScanning){
menu.findItem(R.id.scan).setVisible(true);
menu.findItem(R.id.stop).setVisible(false);
menu.findItem(R.id.exit).setVisible(true);
menu.findItem(R.id.info).setVisible(true);
menu.findItem(R.id.refresh).setActionView(null);
Log.i(“DEBUG_TOAST”,“Menu_mScanning=0”);
}
否则{
menu.findItem(R.id.scan).setVisible(false);
menu.findItem(R.id.stop).setVisible(true);
menu.findItem(R.id.exit).setVisible(true);
menu.findItem(R.id.info).setVisible(true);
menu.findItem(R.id.refresh).setActionView(
R.布局、操作栏(不确定的进度);
Log.i(“调试”、“菜单扫描=1”);
}
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
病例R.id.scan:
如果(mLeDeviceListAdapter.getCount()>0)
mLeDeviceListAdapter.clear();
扫描设备(真实);
Log.i(“DEBUG_TOAST”,“按下扫描按钮!”);
打破
案例R.id.stop:
扫描设备(假);
打破
案例R.id.info:
意图提醒\u意图=新意图(MainActivity.this,rementer.class);
startActivity(提醒和意图);
打破
案例R.id.exit:
完成();
打破
}
返回true;
}
private BluetoothAdapter.LeScanCallback LeScanCallback=新的BluetoothAdapter.LeScanCallback(){
@凌驾
public void onLeScan(最终BluetoothDevice设备,int rssi,字节[]扫描记录){
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
mLeDeviceListAdapter.addDevice(设备);
毫升