本文我们将通过学习Android的蓝牙聊天示例应用程序来介绍蓝牙开发包的使用,该示例程序完整的包含了蓝牙开发的各个部分,将实现两个设备通过蓝牙进行连接并聊天。
  l
  前面我们说过,在使用蓝牙API时就需要开启某些权限,同时我们还可以从l文件中到应用程序启动时所进入的界面Activity等信息,因此下面我们首先打开l文件,代码如下:
复制到剪贴板  Java代码
1.<manifest xmlns:android="schemas.android/apk/res/android"   package="ample.android.BluetoothChat"   android:versionCode="1"   android:versionName="1.0">   >   <uses-sdk minSdkVersion="6" />   >   <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />   <uses-permission android:name="android.permission.BLUETOOTH" />   <application android:label="@string/app_name"   android:icon="@drawable/app_icon" 
>   >   <activity android:name=".BluetoothChat"   android:label="@string/app_name"   android:configChanges="orientation|keyboardHidden">   <intent-filter>   <action android:name="android.intent.action.MAIN" />   <category android:name="android.intent.category.LAUNCHER" />   </intent-filter>   </activity>      <activity android:name=".DeviceListActivity"   android:label="@string/select_device"   android:theme="@android:style/Theme.Dialog"   android:configChanges="orientation|keyboardHidden" />   </application>   </manifest>     
首先minSdkVersion用于说明该应用程序所需要使用的最小SDK版本,这里设置为6,也就是说最小需要使用android1.6版本的sdk,同时Ophone则需要使用oms2.0版本,然后打开了BLUETOOTH和BLUETOOTH_ADMIN两个蓝牙操作相关的权限,最后看到了两个Activity的声明,他们分别是BluetoothChat(默认主Activity)和DeviceListActivity(显示设备列表),其中DeviceListActivity风格被定义为一个对话框风格,下面我们将分析该程序的每个细节。
  BluetoothChat
  首先,程序启动进入BluetoothChat,在onCreate函数中对窗口进行了设置,代码如下:
复制到剪贴板  Java代码
1.// 设置窗口布局   requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);   setContentView(R.layout.main);   getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);   
这里可以看到将窗口风格设置为自定义风格了,并且指定了自定义title布局为custom_title,其定义代码如下:
复制到剪贴板  Java代码
1.<RelativeLayout xmlns:android="schemas.android/apk/res/android"   andro
id:layout_width="match_parent"   android:layout_height="match_parent"   android:gravity="center_vertical"   >   <TextView android:id="@+id/title_left_text"   android:layout_alignParentLeft="true"   android:ellipsize="end"   android:singleLine="true"   style="?android:attr/windowTitleStyle"   android:layout_width="wrap_content"安卓intent用法   android:layout_height="match_parent"   android:layout_weight="1"   />   <TextView android:id="@+id/title_right_text"   android:layout_alignParentRight="true"   android:ellipsize="end"   android:singleLine="true"   android:layout_width="wrap_content"   android:layout_height="match_parent"   android:textColor="#fff"   android:layout_weight="1"   />   </RelativeLayout>     
该布局将title设置为一个相对布局RelativeLayout,其中包含了两个TextView,一个在左边一个在右边,分别用于显示应用程序的标题title和当前的蓝牙配对链接名称,如下图所示。
其中左边显示为应用程序名称"BluetoothChat",右边显示一个connected:scort则表示当前配对成功正在进行聊天的链接名称。整个聊天界面的布局在l中实现,代码如下:
复制到剪贴板  Java代码
1.<LinearLayout xmlns:android="schemas.android/apk/res/android"   android:orientation="vertical"   android:layout_width="match_parent"   android:layout_height="match_parent"   >      <ListView android:id="@+id/in"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:stackFromBottom="true"   android:transcriptMode="alwaysScroll"   android:layout_weight="1"   />      <LinearLayout   android:orientation="horizontal"   android:layout_width="match_parent"   android:layout_height="wrap_content"   >   <EditText android:id="@+id/edit_text_out"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_weight="1"   android:layout_gravity="bottom"   />   <Button android:id="@+id/button_send"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="@string/send"   />   </LinearLayout>   </LinearLayout>     
整个界面的布局将是一个线性布局LinearLayout,其中包含了另一个ListView(用于显示聊天的对话信息)和另外一个线性布局来实现一个发送信息的窗口,发送消息发送框有一个输入框和一个发送按钮构成。整个界面如下图所示。
布局好界面,下面我们需要进入编码状态,首先看BluetoothChat所要那些成员变量,如下代码所示:
复制到剪贴板  Java代码
1.public class BluetoothChat extends Activity {   // Debugging   private static final String TAG = "BluetoothChat";   private static final boolean D = true;   //从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;   // 从BluetoothChatService Handler接收消息时使用的键名(键-值模型)   public static final String DEVICE_NAME = "device_name";   public static final String TOAST = "toast";   // Intent请求代码(请求链接,请求可见)   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;   // 链接的设备的名称 
 private String mConnectedDeviceName = null;   // Array adapter for the conversation thread   private ArrayAdapter<String> mConversationArrayAdapter;   // 将要发送出去的字符串   private StringBuffer mOutStringBuffer;   // 本地蓝牙适配器   private BluetoothAdapter mBluetoothAdapter = null;   // 聊天服务的对象   private BluetoothChatService mChatService = null;   //......   
其中Debugging部分则将用于我们在调试程序时通过log打印日志用,其他部分我们都加入了注释,需要说明的是BluetoothChatService ,它是我们自己定义的一个用来管理蓝牙的端口监听,链接,管理聊天的程序,后面我们会介绍。在这里需要说明一点,这些代码都出自google的员工之手,大家在学习时,可以借鉴很多代码编写的技巧和风格,这都将对我们有非常大的帮助。
  然后,我们就需要对界面进行一些设置,如下代码将用来设置我们自定义的标题title需要显示的内容:
复制到剪贴板  Java代码
1.// 设置自定义title布局   mTitle = (TextView) findViewById(R.id.title_left_text);   mTitle.setText(R.string.app_name);   mTitle = (TextView) findViewById(R.id.title_right_text);   
左边的TextView被设置为显示应用程序名称,右边的则需要我们在链接之后在设置更新,目前则显示没有链接字样,所以这里我们暂不设置,进一步就需要获取本地蓝牙适配器BluetoothAdapter了,因为对于有关蓝牙的任何操作都需要首先获得该蓝牙适配器,获取代码非常简单,如下:
复制到剪贴板  Java代码
1.// 得到一个本地蓝牙适配器   mBluetoothAdapter =&DefaultAdapter();   // 如果适配器为null,则不支持蓝牙   if (mBluetoothAdapter == null) {   Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();   finish();   return;   }   getDefaultAdapter()函数用于获取本地蓝牙适配器,然后检测是否为null,如果为null则表示没有蓝牙设备的支持,将通过toast告知用户。   在onStart()
函数中,我们将检测蓝牙是否被打开,如果没有打开,则请求打开,否则就可以设置一些聊天信息的准备工作,代码如下:   @Override   public void onStart() {   Start();   if(D) Log.e(TAG, "++ ON START ++");   // 如果蓝牙没有打开,则请求打开   // setupChat() will then be called during onActivityResult   if (!mBluetoothAdapter.isEnabled()) {   Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);   startActivityForResult(enableIntent, REQUEST_ENABLE_BT);   // 否则,设置聊天会话   } else {   if (mChatService == null) setupChat();   }   }   

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。