收费的

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_35414804/article/details/53352205

小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">&lt;<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">&lt;<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">&lt;<span class="hljs-title">ListView

android:id="@+id/result"
android:layout_width=“match_parent”
android:layout_height=“match_parent”>

<span class="hljs-tag">&lt;/<span class="hljs-title">ListView</span>&gt;</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&lt;BluetoothDevice&gt; mBluelist;
<span class="hljs-keyword">private</span> LayoutInflater layoutInflater;

<span class="hljs-keyword">public</span> <span class="hljs-title">BlueToothDeviceAdapter</span>(List&lt;BluetoothDevice&gt; 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> &amp;&amp; deviceName.length() &gt; <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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值