1. 程式人生 > >安卓——藍芽listView搜尋以及點選事件

安卓——藍芽listView搜尋以及點選事件

一;點選事件。
1;開啟關閉藍芽;
這裡寫圖片描述
2;掃描附近藍芽的點選事件。
這裡寫圖片描述
二;關於藍芽裝置listView展示
1;listView介面卡
2;通過layout找到例項化ListView物件
3;ListView物件載入介面卡
4;即可進行點選事件
這裡寫圖片描述
三;關於ListView介面卡(在這個案例中我們使用的是BaseAdapter)
這裡寫圖片描述
關於介面卡的處理核心程式碼都在getView這個方法中,對於ListView中的Item操作。
這裡寫圖片描述
四;關於搜尋藍芽裝置的廣播事件
1;註冊廣播事件
這裡寫圖片描述
2;發現廣播後的回撥方法
這裡寫圖片描述
3;廣播的登出
這裡寫圖片描述

五;關於傳限;特別注意的是第三條,高於4.0的安卓系統則需要加上這條傳限
這裡寫圖片描述

完成程式碼;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.zw.findbluetest.MainActivity" >

     <Button
        android:id
="@+id/openBlue" android:onClick="openBlue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="開啟藍芽" /> <Button android:id="@+id/closeBlue"
android:onClick="closeBlue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="關閉藍芽" /> <Button android:id="@+id/findBlue" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="findBlue" android:layout_below="@+id/openBlue" android:text="搜尋藍芽裝置" /> <TextView android:id="@+id/tv_1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/findBlue" android:layout_marginTop="10dp" android:layout_marginBottom="5dp" android:text="已配對裝置" /> <ListView android:id="@+id/listView_bound" android:layout_below="@+id/tv_1" android:layout_width="wrap_content" android:layout_height="wrap_content" ></ListView> <TextView android:id="@+id/tv_2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/listView_bound" android:layout_marginTop="25dp" android:layout_marginBottom="5dp" android:text="可用裝置" /> <ListView android:id="@+id/listView_isConnect" android:layout_below="@+id/tv_2" android:layout_width="wrap_content" android:layout_height="wrap_content" ></ListView> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<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<BluetoothDevice> 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<BluetoothDevice> mLeDevices;
    //LayoutInflater是用來找res/layout/下的xml佈局檔案,並且例項化
    //它的作用類似於findViewById()
    private LayoutInflater mInflator;
    private Activity mContext;//獲得 LayoutInflater 例項的一種方法就是使用Activity;

    public LeDeviceListAdapter(Activity c) {
        super();
        mContext = c;
        mLeDevices = new ArrayList<BluetoothDevice>();
        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;
    }

}

相關推薦

——listView搜尋以及事件

一;點選事件。 1;開啟關閉藍芽; 2;掃描附近藍芽的點選事件。 二;關於藍芽裝置listView展示 1;listView介面卡 2;通過layout找到例項化ListView物件 3;ListView物件載入介面卡 4;即可進行點選事件

actionbar上的搜尋按鈕沒反應如何解決

雖然搜尋按鈕出來了,但點選卻沒有反應,這又出bug了! 按照上一篇的思路,因為繼承關係改變了,所以其實這裡的開頭也不是android也是app 能點選展開搜尋框的程式碼如下(僅僅是示例,這是我的專案的

4.0響應滑鼠左右事件

4.0的更新說明裡:為了方便起見,後面滑鼠按鈕被自動對映到KEYCODE_BACK,KEYCODE_FORWARD鍵,應用程式可以處理這些按鍵,支援滑鼠按鈕的基礎和前進導航。 我現在的機器插上滑鼠後左右鍵都是KEYCODE_FORWARD,我想吧右鍵改為KEYCODE_

自定義:Toast 以及Toast的出場動畫 以及Toast上新增圖片 以及事件

安卓自定義Toast: 1.自定義一個類:CustomToast 繼承自:Toast 2.在CustomToast類中 新增一個靜態 mCustomToast 物件 private static CustomToast mCustomToast; 3.在CustomToast類中 新

通訊之聊天小程式

安卓 藍芽聊天小程式 一、簡述   記--簡單的藍芽聊天小程式。使用的是傳統藍芽開發。(某些手機由於Android版本原因需要新增新的許可權)        兩臺裝置開啟藍芽,一臺裝置設定藍芽可見性,另一臺裝置進行連線,然後互相收發資訊。

個人進階之路——模組

今天學習一下專案中的藍芽的基礎知識 Android系統包含了對藍芽網路協議棧的支援,使得安卓裝置能無線連線其他藍芽裝置交換資料。 應用程式框架提供訪問藍芽功能的APIs,使得應用程式能夠通過無線連線其他藍芽裝置,實現點對點,或者點對多點的無線互動 通過使用

4.0以上連線多臺裝置並接收裝置資料

前沿: 在我之前寫的程式碼中都沒有實現藍芽連線多個裝置,由於時間的原因沒有進行更改。 iOS端實現 藍芽多個連線確實比安卓的方便,本身利用官方的Demo就可以實現多臺連線,只不過自己利用view加以區分就可以。 到此藍芽4.0之前是通過scoket連線多臺

Bluetooth基本操作- (獲取附近裝置-1)

1、效果圖 2、AndroidManifest.xml新增如下程式碼 //所有手機需要的許可權,藍芽功能才能正常使用 <uses-permission android:name="android.permission.BLUET

BLE裝置開發

 前段時間做了一個有關於安卓藍芽BLE裝置的開發專案,主要的功能包括了搜尋藍芽ble裝置和ble裝置的資料讀寫等等,本篇部落格用於記錄安卓藍芽ble裝置的通訊的細節。  其實關於BLE裝置的通訊在API中已經講地比較清楚了,這裡只是做一個總結,如果要進行BLE

框架彙總

1.  從藍芽資料和控制信令流程層次圖看藍芽底層協議棧 2. Android Version1 藍芽框架 3.  從庫的角度看安卓藍芽架構 4.   Android N  藍芽框架 5. +---------------------------------

連線操作步驟。。。慢慢來不急

使用藍芽API,Android應用程式可以執行以下操作: 掃描其他藍芽裝置查詢配對藍芽裝置的本地藍芽介面卡建立RFCOMM通道通過服務發現連線到其他裝置向其他裝置傳輸資料管理多個連線---------------------------------------------

串列埠例子修改

BluetoothChatService.java的第49行             private static final UUID MY_UUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");  

unity 2017.3 (二)訂閱及資料解析

接上篇,我們寫到了連線藍芽,之後我們就需要訂閱藍芽的資訊了。訂閱藍芽訊息最後一個引數是一個回撥,它會傳回三個資訊分別是地址、UUID和資料,這個資料是串列埠通訊中常用的byte[],出於專案需要,我要進行一次資料轉換。    /// <summary> /

技術之中央BluetoothGatt和周邊BluetoothGattServer的實現

BluetoothAdapter.LeScanCallback  Class Overview:回撥介面被用於傳輸LE掃描後的結果; 詳情請查看: onLescan(BluetoothDevice , int , byte[]) 是通過startLeScan(Blu

Listview與Button事件衝突看事件分發機制

題目有點長。其實實現Listview的時候大家都可能會碰到這樣的一個問題,那就是Listview的OnItemClickListener點選事件與Button(或者checkbox)的touch(或者click)事件衝突的問題。 宣告一下,非常感謝郭大師的這篇blog: h

Animation實現APP引導使用者動畫

    首先宣告本人也是學生目前是實習生,不是技術大牛,只是分享一下自己寫過的小Demo,望大家指點,共同進步,謝謝。 第一次寫部落格 不知道,從哪裡入手,有點迷啊,我直接上程式碼和效果圖了 效果圖如下 首先我用到了約束佈局,如果低版本的開發工具需要

防止誤退,首次提示,短時間內再次退出應用

//記錄使用者首次點選返回鍵的時間 private long firstTime=0; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEY

中如何給按鈕新增音效

前言 有很多製作精良的APP都自帶點選音效,那麼如何簡單的來實現這一效果,這裡需要使用到的一個概念叫做SoundPool,這個類主要用於播放一些比較小的音訊檔案,因為比較方便,通常用在遊戲裡比較多。 程式碼 閒話不多說,我們現在需要做一個功

cocos中的觀察者模式 以及"事件"的註冊和分發(個人理解)

一、控制元件的點選事件註冊與完成 在學習cocos引擎時,感覺觸控事件用的比較頻繁。 於是對各種觸控事件做一些小小的總結: cocos中的控制元件(按鈕,精靈,各種容器等)。在實際開發中發現他們都是可以新增點選事件的,可以通過設定setTouchEnabled()來開啟點

Android recyclerView items的側滑刪除以及事件處理

最近專案中需要實現銀行卡側滑刪除以及選擇預設無法刪除的效果,需求效果圖如下: 其實就是一個自定義的列表實現,這裡我用的是recyclerView首先需要自定義DeleteBankRecyclerView繼承RecyclerView,需要注意的是item的點選和