package com.rftransceiver.activity; import android.annotation.TargetApi; import android.app.ListActivity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanResult; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import com.rftransceiver.R; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import butterknife.ButterKnife; import butterknife.InjectView; /** * Created by rantianhua on 15-5-21. */ public class SearchActivity extends ListActivity implements View.OnClickListener{ @InjectView(R.id.rl_loading_dialog_bluetooth_connect) RelativeLayout rlLoading; @InjectView(R.id.btn_cancel_discovery) Button btnCancel; public static Connectlistener connectlistener = null; private BluetoothAdapter adapter = null; private BluetoothAdapter.LeScanCallback leScanCallback = null; private LeDeviceListAdapter listAdapter = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_bluetooth_connect); initView(); final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); adapter = bluetoothManager.getAdapter(); listAdapter = new LeDeviceListAdapter(); setListAdapter(listAdapter); } private void initLeScanCallback() { leScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int i, byte[] bytes) { if(device == null) return; runOnUiThread(new Runnable() { @Override public void run() { listAdapter.addDevice(device); listAdapter.notifyDataSetChanged(); } }); } }; } private void initView() { ButterKnife.inject(this); showLoading(false); btnCancel.setOnClickListener(this); } private void showLoading(boolean b) { rlLoading.setVisibility(b ? View.VISIBLE : View.INVISIBLE); } @Override public void onDestroy() { super.onDestroy(); cancelSearch(); if(connectlistener != null) { connectlistener = null; } listAdapter.clear(); listAdapter = null; } @Override protected void onListItemClick(ListView l, View v, int position, long id) { final BluetoothDevice device = listAdapter.getDevice(position); if (device == null) return; connectlistener.startConnect(device); finish(); } //扫描蓝牙设备 private void searchDevices() { showLoading(true); initLeScanCallback(); new Handler(Looper.myLooper()).postDelayed(new Runnable() { @Override public void run() { cancelSearch(); } }, 10000); adapter.startLeScan(leScanCallback); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_cancel_discovery: if(btnCancel.getText().equals(getResources().getString(R.string.start_search))) { searchDevices(); btnCancel.setText(R.string.cancel_discovery); break; }else{ cancelSearch(); btnCancel.setText(R.string.start_search); break; } } } //stop to search device private void cancelSearch() { rlLoading.setVisibility(View.INVISIBLE); btnCancel.setText(getString(R.string.start_search)); adapter.stopLeScan(leScanCallback); } //回调接口,开启蓝牙连接(客户端连接) public interface Connectlistener{ void startConnect(BluetoothDevice device); } // 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<>(); mInflator = SearchActivity.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; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; // General ListView optimization code. if (view == null) { view = mInflator.inflate(R.layout.listitem_device, null); viewHolder = new ViewHolder(); viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } BluetoothDevice device = mLeDevices.get(i); final String deviceName = device.getName(); if (deviceName != null && deviceName.length() > 0) viewHolder.deviceName.setText(deviceName); else viewHolder.deviceName.setText(R.string.unknown_device); viewHolder.deviceAddress.setText(device.getAddress()); return view; } } static class ViewHolder { TextView deviceName; TextView deviceAddress; } }