小Demo是搜索蓝牙设备显示到ListView中的,布局和代码都简单清楚明了。
1.首先创建XML
main_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.yipai.scanandcontrol.MainActivity">
<span class="hljs-tag"><<span class="hljs-title">TextView
android:id="@+id/blueName"
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“已连接的设备名称” />
<span class="hljs-tag"><<span class="hljs-title">Button
android:id="@+id/scan"
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“搜索蓝牙设备” />
<span class="hljs-tag"><<span class="hljs-title">ListView
android:id="@+id/result"
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<span class="hljs-tag"></<span class="hljs-title">ListView</span>></span>
</LinearLayout>
2.创建ListView中的Item布局
list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/device_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24dp"/>
<TextView android:id="@+id/device_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12dp"/>
</LinearLayout>
3.Main_Activity.java
public class MainActivity extends AppCompatActivity {
//蓝牙适配器
private BluetoothAdapter mBluetoothAdapter;
//搜索BUTTON
private Button scan;
//搜索结果List
private ListView resultList;
//搜索状态的标示
private boolean mScanning;
//扫描时长
private static final long SCAN_PERIOD = 5000;
//请求启用蓝牙请求码
private static final int REQUEST_ENABLE_BT = 1;
//蓝牙适配器
private BlueToothDeviceAdapter mBlueToothDeviceAdapter;
//蓝牙适配器List
private List<BluetoothDevice> mBlueList = new ArrayList<>();
private Context context;
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = <span class="hljs-keyword">this</span>;
<span class="hljs-comment">//初始化蓝牙适配器</span>
<span class="hljs-keyword">final</span> BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
<span class="hljs-comment">//初始化适配器</span>
mBlueToothDeviceAdapter = <span class="hljs-keyword">new</span> BlueToothDeviceAdapter(mBlueList,context);
inint();
}
}
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">inint</span>() {
scan = (Button) findViewById(R.id.scan);
resultList = (ListView) findViewById(R.id.result);
scan.setOnClickListener(<span class="hljs-keyword">new</span> View.OnClickListener() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(View view) {
<span class="hljs-comment">//如果点击了搜索,清空适配器,开始搜索蓝牙设备</span>
// mBluetoothAdapter.startLeScan(mLeScanCallback);
scanLeDevice(true);
}
});
}
<span class="hljs-javadoc">/**
* 设备搜索
*
*<span class="hljs-javadoctag"> @param</span> enable 是否正在搜索的标示
*/</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">scanLeDevice</span>(<span class="hljs-keyword">final</span> <span class="hljs-keyword">boolean</span> enable) {
<span class="hljs-keyword">if</span> (enable) {
mHandler.postDelayed(<span class="hljs-keyword">new</span> Runnable() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
<span class="hljs-keyword">if</span> (mScanning) {
mScanning = <span class="hljs-keyword">false</span>;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
}, SCAN_PERIOD);
mScanning = <span class="hljs-keyword">true</span>;
mHandler.sendEmptyMessage(<span class="hljs-number">1</span>);
mBluetoothAdapter.startLeScan(mLeScanCallback);
}
}
<span class="hljs-comment">// Hander</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> Handler mHandler = <span class="hljs-keyword">new</span> Handler() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleMessage</span>(Message msg) {
<span class="hljs-keyword">switch</span> (msg.what) {
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: <span class="hljs-comment">// Notify change</span>
mBlueToothDeviceAdapter.notifyDataSetChanged();
<span class="hljs-keyword">break</span>;
}
}
};
<span class="hljs-comment">// Device scan callback.</span>
<span class="hljs-keyword">private</span> BluetoothAdapter.LeScanCallback mLeScanCallback =
<span class="hljs-keyword">new</span> BluetoothAdapter.LeScanCallback() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onLeScan</span>(<span class="hljs-keyword">final</span> BluetoothDevice device, <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> rssi, <span class="hljs-keyword">final</span> <span class="hljs-keyword">byte</span>[] scanRecord) {
runOnUiThread(<span class="hljs-keyword">new</span> Runnable() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
<span class="hljs-comment">//获取到蓝牙设备</span>
<span class="hljs-keyword">if</span> (!mBlueList.contains(device)){
mBlueList.add(device);
Log.e(<span class="hljs-string">"tag"</span>, <span class="hljs-string">"mLeScanCallback 搜索结果 "</span> + device.getAddress());
}
<span class="hljs-comment">//List加载适配器</span>
<span class="hljs-keyword">if</span> (mBlueToothDeviceAdapter.isEmpty()) {
Log.e(<span class="hljs-string">"tag"</span>, <span class="hljs-string">"mLeDeviceListAdapter为空"</span>);
} <span class="hljs-keyword">else</span> {
resultList.setAdapter(mBlueToothDeviceAdapter);
}
mHandler.sendEmptyMessage(<span class="hljs-number">1</span>);
}
});
}
};
}
4.BlueToothDeviceAdapter.java
public class BlueToothDeviceAdapter extends BaseAdapter {
<span class="hljs-keyword">private</span> List<BluetoothDevice> mBluelist;
<span class="hljs-keyword">private</span> LayoutInflater layoutInflater;
<span class="hljs-keyword">public</span> <span class="hljs-title">BlueToothDeviceAdapter</span>(List<BluetoothDevice> list, Context context) {
mBluelist = list;
layoutInflater = LayoutInflater.from(context);<span class="hljs-comment">//context :要使用当前的Adapter的界面对象 layoutInflater: 布局装载器对象</span>
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getCount</span>() {
<span class="hljs-keyword">return</span> mBluelist.size();
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> Object <span class="hljs-title">getItem</span>(<span class="hljs-keyword">int</span> i) {
<span class="hljs-keyword">return</span> mBluelist.get(i);
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">long</span> <span class="hljs-title">getItemId</span>(<span class="hljs-keyword">int</span> i) {
<span class="hljs-keyword">return</span> i;
}
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> View <span class="hljs-title">getView</span>(<span class="hljs-keyword">int</span> i, View view, ViewGroup viewGroup) {
<span class="hljs-javadoc">/**
* 文艺式,避免两个耗时操作,第一个就是创建concerView对象,和findviewbyid
*/</span>
<span class="hljs-comment">//2.创建ViewHlder</span>
ViewHolder viewHolder;
<span class="hljs-comment">//3.判断concerView是否为空</span>
<span class="hljs-keyword">if</span> (view == <span class="hljs-keyword">null</span>) {
<span class="hljs-comment">//实例化ViewHolder</span>
viewHolder = <span class="hljs-keyword">new</span> ViewHolder();
<span class="hljs-comment">//View对象还没有被实例化过,缓存池中没有缓存,那么就创建一个convertView对象</span>
view = layoutInflater.inflate(R.layout.list_item, <span class="hljs-keyword">null</span>);
<span class="hljs-comment">//把findviewbyid找的的保存到 viewHolder 中</span>
viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);
viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
<span class="hljs-comment">//通过setTag将 viewHolder 和 convertview 进行绑定</span>
view.setTag(viewHolder);
} <span class="hljs-keyword">else</span> {
<span class="hljs-comment">//可以直接通过 viewHolder 来找到对象所对应的控件</span>
viewHolder = (ViewHolder) view.getTag();
}
BluetoothDevice blueDevice = mBluelist.get(i);
<span class="hljs-keyword">final</span> String deviceName = blueDevice.getName();
<span class="hljs-keyword">if</span> (deviceName != <span class="hljs-keyword">null</span> && deviceName.length() > <span class="hljs-number">0</span>) {
viewHolder.deviceName.setText(blueDevice.getName());
} <span class="hljs-keyword">else</span> {
viewHolder.deviceName.setText(<span class="hljs-string">"未知设备"</span>);
}
viewHolder.deviceAddress.setText(blueDevice.getAddress());
<span class="hljs-keyword">return</span> view;
}
<span class="hljs-comment">//创建内部类ViewHlder</span>
class ViewHolder {
<span class="hljs-javadoc">/**
* 避免重复的findviewbyId
*/</span>
TextView deviceName;
TextView deviceAddress;
}
}
全部代码都在这里了,没什么技术含量,看一看就能够明白。
链接: https://pan.baidu.com/s/1BSpNCYaQ-IwN7sFwRTIj5g 密码: kekw 百度云Demo