Android 蓝牙开发实例--蓝牙聊天程序的设计和实现

这篇博客详细介绍了如何在Android 2.0及以上版本使用官方API开发蓝牙聊天程序,包括蓝牙设备连接过程、聊天室效果图、蓝牙通信时序图,以及关键类如BluetoothChat.java、BluetoothChatService.java的功能和源码解析。通过对源码的详细解释,帮助初学者理解蓝牙通信的实现机制。
摘要由CSDN通过智能技术生成
               

作者在这里介绍的这个实例是Google SDK中提供的一个蓝牙聊天程序,简单但信息量巨大,非常适合初学者学习蓝牙方面的知识。

在学习这个实例前请读者仔细阅读并理解Socket的工作原理和实现机制,作者的这篇博客中有详细的介绍:

http://blog.csdn.net/dlutbrucezhang/article/details/8577810


在 Android1.x 的时候,相关 API 非常不完善,还不能简单的使用 Bluetooth 开发,有一个开源项目可以帮助程序员使用、开发蓝牙,支持直接方法 bluetooth 协议栈。在 Android2 以后,框架提供了一些官方 API 来进行蓝牙的通信,但目前的程序也比较不完善。本文主要讨论 Android2 后的 Bluetooth 通信的 API 使用方法。

首先看聊天室的效果图:




蓝牙设备连接的过程如下图所示:



下面这张图展示的是蓝牙聊天的时序图:



接下来将贴出源码并对源码做出详细的解释说明:

BluetoothChat.java

例程的主 Activity 。 onCreate() 得到本地 BluetoothAdapter 设备,检查是否支持。 onStart() 中检查是否启用蓝牙,并请求启用,然后执行 setupChat() 。 setupChat() 中先对界面中的控件进行初始化增加点击监听器等,然创建 BluetoothChatService 对象,该对象在整个应用过程中存在,并执行蓝牙连接建立、消息发送接受等实际的行为。

import android.app.Activity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.KeyEvent;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.Window;import android.view.View.OnClickListener;import android.view.inputmethod.EditorInfo;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;/** * This is the main Activity that displays the current chat session. */public class BluetoothChat extends Activity {    // Debugging    private static final String TAG = "BluetoothChat";    private static final boolean D = true;    // Message types sent from the BluetoothChatService Handler    public static final int MESSAGE_STATE_CHANGE = 1;    public static final int MESSAGE_READ = 2;    public static final int MESSAGE_WRITE = 3;    public static final int MESSAGE_DEVICE_NAME = 4;    public static final int MESSAGE_TOAST = 5;    // Key names received from the BluetoothChatService Handler    public static final String DEVICE_NAME = "device_name";    public static final String TOAST = "toast";    // Intent request codes    private static final int REQUEST_CONNECT_DEVICE = 1;    private static final int REQUEST_ENABLE_BT = 2;    // Layout Views    private TextView mTitle;    private ListView mConversationView;    private EditText mOutEditText;    private Button mSendButton;    // Name of the connected device    private String mConnectedDeviceName = null;    // Array adapter for the conversation thread    private ArrayAdapter<String> mConversationArrayAdapter;    // String buffer for outgoing messages    private StringBuffer mOutStringBuffer;    // Local Bluetooth adapter    private BluetoothAdapter mBluetoothAdapter = null;    // Member object for the chat services    private BluetoothChatService mChatService = null;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if(D) Log.e(TAG, "+++ ON CREATE +++");        // Set up the window layout        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);        setContentView(R.layout.main);        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);        // Set up the custom title        mTitle = (TextView) findViewById(R.id.title_left_text);        mTitle.setText(R.string.app_name);        mTitle = (TextView) findViewById(R.id.title_right_text);        // Get local Bluetooth adapter        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();        // If the adapter is null, then Bluetooth is not supported        if (mBluetoothAdapter == null) {            Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();            finish();            return;        }    }    @Override    public void onStart() {        super.onStart();        if(D) Log.e(TAG, "++ ON START ++");        // If BT is not on, request that it be enabled.        // setupChat() will then be called during onActivityResult        if (!mBluetoothAdapter.isEnabled()) {            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);        // Otherwise, setup the chat session        } else {            if (mChatService == null) setupChat();        }    }    @Override    public synchronized void onResume() {        super.onResume();        if(D) Log.e(TAG, "+ ON RESUME +");        // Performing this check in onResume() covers the case in which BT was        // not enabled during onStart(), so we were paused to enable it...        // onResume() will be called when ACTION_REQUEST_ENABLE activity returns.        if (mChatService != null) {            // Only if the state is STATE_NONE, do we know that we haven't started already            if (mChatService.getState() == BluetoothChatService.STATE_NONE) {              // Start the Bluetooth chat services              mChatService.start();            }        }    }    private void setupChat() {        Log.d(TAG, "setupChat()");        // Initialize the array adapter for the conversation thread        mConversationArrayAdapter = new ArrayAdapter<String>(this, R.layout.message);        mConversationView = (ListView) findViewById(R.id.in);        mConversationView.setAdapter(mConversationArrayAdapter);        // Initialize the compose field with a listener for the return key        mOutEditText = (EditText) findViewById(R.id.edit_text_out);        mOutEditText.setOnEditorActionListener(mWriteListener);        // Initialize the send button with a listener that for click events        mSendButton = (Button) findViewById(R.id.button_send);        mSendButton.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                // Send a message using content of the edit text widget                TextView view = (TextView) findViewById(R.id.edit_text_out);                String message = view.getText().toString();                sendMessage(message);            }        });        // Initialize the BluetoothChatService to perform bluetooth connections        mChatService = new BluetoothChatService(this, mHandler);        // Initialize the buffer for outgoing messages        mOutStringBuffer = new StringBuffer("");    }    @Override    public synchronized void onPause() {        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值