热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安卓——蓝牙listView搜索以及点击事件

一;点击事件。1;打开关闭蓝牙;2;扫描附近蓝牙的点击事件。二;关于蓝牙设备listView展示1;listView适配器2;通过layout找到实例化ListView对

一;点击事件。
1;打开关闭蓝牙;
这里写图片描述
2;扫描附近蓝牙的点击事件。
这里写图片描述
二;关于蓝牙设备listView展示
1;listView适配器
2;通过layout找到实例化ListView对象
3;ListView对象加载适配器
4;即可进行点击事件
这里写图片描述
三;关于ListView适配器(在这个案例中我们使用的是BaseAdapter)
这里写图片描述
关于适配器的处理核心代码都在getView这个方法中,对于ListView中的Item操作。
这里写图片描述
四;关于搜索蓝牙设备的广播事件
1;注册广播事件
这里写图片描述
2;发现广播后的回调方法
这里写图片描述
3;广播的注销
这里写图片描述

五;关于传限;特别注意的是第三条,高于4.0的安卓系统则需要加上这条传限
这里写图片描述

完成代码;

"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"match_parent"
tools:cOntext="com.zw.findbluetest.MainActivity" >

android:id="@+id/openBlue"
android:OnClick="openBlue"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="打开蓝牙" />

android:id="@+id/closeBlue"
android:OnClick="closeBlue"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="关闭蓝牙" />

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >


<TextView
android:id="@+id/Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
/>

<TextView
android:id="@+id/Address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="10sp"
/>


LinearLayout>
package com.zw.findbluetest;

import android.support.v7.app.ActionBarActivity;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {


public BluetoothAdapter mBluetoothAdapter;

private BluetoothSocket btSocket;
private ConnectThread connectThread;

// 蓝牙BLE列表适配器
private LeDeviceListAdapter mLeDeviceListAdapter_dound;
private LeDeviceListAdapter mLeDeviceListAdapter_isConnect;
private ListView bleDev_lvBound;
private ListView bleDev_lvConnect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//搜索时显示圈圈
setContentView(R.layout.activity_main);
//初始化;
mLeDeviceListAdapter_dound = new LeDeviceListAdapter(this);
mLeDeviceListAdapter_isCOnnect= new LeDeviceListAdapter(this);

bleDev_lvBound = (ListView) findViewById(R.id.listView_bound);
bleDev_lvBound.setAdapter(mLeDeviceListAdapter_dound);//加载listView适配器
bleDev_lvCOnnect= (ListView) findViewById(R.id.listView_isConnect);
bleDev_lvConnect.setAdapter(mLeDeviceListAdapter_isConnect);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 获取所有已经绑定的蓝牙设备
Set devices = mBluetoothAdapter.getBondedDevices();
if (devices.size() > 0) {
for (BluetoothDevice bluetoothDevice : devices) {
// 扫描到设备则添加到适配器
mLeDeviceListAdapter_dound.addDevice(bluetoothDevice);
// 数据改变并更新列表
mLeDeviceListAdapter_dound.notifyDataSetChanged();
}
}
/**
* 已配对listView的点击事件
*/

bleDev_lvBound.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
if (mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.cancelDiscovery();
}
BluetoothDevice device = mLeDeviceListAdapter_dound.getDevice(position);
cOnnectThread= new ConnectThread(device);
System.out.println("连接中....");
connectThread.start();

Toast.makeText(MainActivity.this, "点击设备是"+ device.getName() + " " + device.getAddress(), Toast.LENGTH_LONG).show() ;
}
}) ;

// 注册用以接收到已搜索到的蓝牙设备的receiver
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter);

/**
* 可用listView的点击事件
*/

bleDev_lvConnect.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
if (mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.cancelDiscovery();
}
try {
BluetoothDevice device = mLeDeviceListAdapter_isConnect.getDevice(position);
Boolean returnValue = false;
Method createBondMethod;
if(device.getBondState() == BluetoothDevice.BOND_NONE) {
// 反射方法调用;
createBOndMethod= BluetoothDevice.class .getMethod("createBond");
System.out.println("开始配对");
returnValue = (Boolean) createBondMethod.invoke(device);
//mLeDeviceListAdapter_isConnect.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "点击设备是"+ device.getName() + " " + device.getAddress(), Toast.LENGTH_LONG).show() ;
}else if(device.getBondState() == BluetoothDevice.BOND_BONDED){
cOnnectThread= new ConnectThread(device);
connectThread.start();
}

} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}


private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {

String action = intent.getAction();
System.out.println(action);
// 获得已经搜索到的蓝牙设备
if (action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 搜索到的不是已经绑定的蓝牙设备
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
// 扫描到设备则添加到适配器
mLeDeviceListAdapter_isConnect.addDevice(device);
// 数据改变并更新列表
mLeDeviceListAdapter_isConnect.notifyDataSetChanged();
}
// 搜索完成
} else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
setProgressBarIndeterminateVisibility(false);
setTitle("搜索蓝牙设备");
}
}
};

//完成打开蓝牙按钮点击事件;
public void openBlue(View v){
//判断该设备是否是蓝牙设备
if(mBluetoothAdapter == null){
Toast.makeText(this,"本地蓝牙不可用",Toast.LENGTH_SHORT).show();
finish(); //退出应用
}
// 若蓝牙没打开
if(!mBluetoothAdapter.isEnabled()){
mBluetoothAdapter.enable(); //打开蓝牙,需要BLUETOOTH_ADMIN权限
Toast.makeText(this, "正在打开..", 0).show();
}
Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); //3600为蓝牙设备可见时间
startActivity(enable);
Intent searchIntent = new Intent(this, MainActivity.class);
startActivity(searchIntent);
}

//完成关闭蓝牙点击事件
public void closeBlue(View v){
if(mBluetoothAdapter.isEnabled()){//判断蓝牙是否打开
mBluetoothAdapter.disable();//关闭蓝牙
Toast.makeText(this, "正在关闭..", 0).show();
}else{
Toast.makeText(getApplicationContext(), "蓝牙未打开,先打开蓝牙", 0).show();
}
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//解除注册
unregisterReceiver(mReceiver);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

//扫描按钮的点计事件
public void findBlue(View v) {
setProgressBarIndeterminateVisibility(true);
setTitle("正在扫描....");
// 如果正在搜索,就先取消搜索
if (mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.cancelDiscovery();
}
// 开始搜索蓝牙设备,搜索到的蓝牙设备通过广播返回
mBluetoothAdapter.startDiscovery();
}
}
package com.zw.findbluetest;

import java.util.ArrayList;


import android.app.Activity;
import android.bluetooth.BluetoothDevice;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


/**
* 用于listView的配置;
* @author wen
*
*/

public class LeDeviceListAdapter extends BaseAdapter {

private ArrayList mLeDevices;
//LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化
//它的作用类似于findViewById()
private LayoutInflater mInflator;
private Activity mContext;//获得 LayoutInflater 实例的一种方法就是使用Activity;

public LeDeviceListAdapter(Activity c) {
super();
mCOntext= c;
mLeDevices = new ArrayList();
mInflator = mContext.getLayoutInflater();
}


public void addDevice(BluetoothDevice device) {
if (!mLeDevices.contains(device)) {
mLeDevices.add(device);
System.out.println(device.getName() + " " + device.getAddress());
}
}

// 获取子项中对应的设备
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 position) {
return mLeDevices.get(position);
}

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

@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder viewHolder;
// General ListView optimization code.
if (view == null) {
view = mInflator.inflate(R.layout.item, null);//实例化这个控件
viewHolder = new ViewHolder();
viewHolder.deviceAddress = (TextView) view.findViewById(R.id.Address);
viewHolder.deviceName = (TextView) view.findViewById(R.id.Name);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
//the Object stored in this view as a tag
}

// 对应的设备进行处理
BluetoothDevice device = mLeDevices.get(position);
final String deviceName = device.getName();
if (deviceName != null && deviceName.length() > 0) {
viewHolder.deviceName.setText(deviceName);
} else {
viewHolder.deviceName.setText("未知设备");
}
viewHolder.deviceAddress.setText(device.getAddress());

return view;
}

//将要显示的信息封装成一个类
final class ViewHolder {
TextView deviceName;
TextView deviceAddress;
}

}

推荐阅读
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
author-avatar
看吧看吧说你你不信
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有