The following code shows how to do Bluetooth Communication.
Code revised from
Android Recipes:A Problem-Solution Approach
http://www.apress.com/9781430234135
ISBN13: 978-1-4302-3413-5
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.java2s.myapplication3.app" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="java2s.com" android:theme="@style/AppTheme" > <activity android:name="com.java2s.myapplication3.app.MainActivity" android:label="java2s.com" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
res\layout\main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Enter Your Email:" /> <EditText android:id="@+id/emailField" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/label" android:singleLine="true" android:inputType="textEmailAddress" /> <Button android:id="@+id/scanButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="Connect and Share" /> <Button android:id="@+id/listenButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_above="@id/scanButton" android:text="Listen for Sharers" /> </RelativeLayout>
ExchangeActivity.java
/**/* ww w. ja v a 2s . co m*/ * Created on May 19, 2010 by Dave Smith * Wireless Designs, LLC * */ package com.java2s.myapplication3.app; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private static final UUID MY_UUID = UUID.fromString("311cb9fa-9066-5f58-945e-ef56d1ae16ec"); private static final String SEARCH_NAME = "bluetooth.recipe"; BluetoothAdapter mBtAdapter; BluetoothSocket mBtSocket; Button listenButton, scanButton; EditText emailField; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("Activity"); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.activity_main); mBtAdapter = BluetoothAdapter.getDefaultAdapter(); if(mBtAdapter == null) { Toast.makeText(this, "Bluetooth is not supported.", Toast.LENGTH_SHORT).show(); finish(); return; } if (!mBtAdapter.isEnabled()) { Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE); } emailField = (EditText)findViewById(R.id.emailField); listenButton = (Button)findViewById(R.id.listenButton); listenButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Make sure the device is discoverable first if (mBtAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivityForResult(discoverableIntent, REQUEST_DISCOVERABLE); return; } startListening(); } }); scanButton = (Button)findViewById(R.id.scanButton); scanButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mBtAdapter.startDiscovery(); setProgressBarIndeterminateVisibility(true); } }); } @Override public void onResume() { super.onResume(); //Register the activity for broadcast intents IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter); filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mReceiver, filter); } @Override public void onPause() { super.onPause(); unregisterReceiver(mReceiver); } @Override public void onDestroy() { super.onDestroy(); try { if(mBtSocket != null) { mBtSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } private static final int REQUEST_ENABLE = 1; private static final int REQUEST_DISCOVERABLE = 2; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode) { case REQUEST_ENABLE: if(resultCode != Activity.RESULT_OK) { Toast.makeText(this, "Bluetooth Not Enabled.", Toast.LENGTH_SHORT).show(); finish(); } break; case REQUEST_DISCOVERABLE: if(resultCode == Activity.RESULT_CANCELED) { Toast.makeText(this, "Cannot listen unless we are discoverable.", Toast.LENGTH_SHORT).show(); } else { startListening(); } break; default: break; } } private void startListening() { AcceptTask task = new AcceptTask(); task.execute(MY_UUID); setProgressBarIndeterminateVisibility(true); } //AsyncTask to accept incoming connections private class AcceptTask extends AsyncTask<UUID,Void,BluetoothSocket> { @Override protected BluetoothSocket doInBackground(UUID... params) { String name = mBtAdapter.getName(); try { //While listening, set the discovery name to a specific value mBtAdapter.setName(SEARCH_NAME); BluetoothServerSocket socket = mBtAdapter.listenUsingRfcommWithServiceRecord("BluetoothRecipe", params[0]); BluetoothSocket connected = socket.accept(); //Reset the BT adapter name mBtAdapter.setName(name); return connected; } catch (IOException e) { e.printStackTrace(); mBtAdapter.setName(name); return null; } } @Override protected void onPostExecute(BluetoothSocket socket) { if(socket == null) { return; } mBtSocket = socket; ConnectedTask task = new ConnectedTask(); task.execute(mBtSocket); } } //AsyncTask to receive a single line of data and post private class ConnectedTask extends AsyncTask<BluetoothSocket,Void,String> { @Override protected String doInBackground(BluetoothSocket... params) { InputStream in = null; OutputStream out = null; try { //Send your data out = params[0].getOutputStream(); out.write(emailField.getText().toString().getBytes()); //Receive the other's data in = params[0].getInputStream(); byte[] buffer = new byte[1024]; in.read(buffer); //Create a clean string from results String result = new String(buffer); //Close the connection mBtSocket.close(); return result.trim(); } catch (Exception exc) { return null; } } @Override protected void onPostExecute(String result) { Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); setProgressBarIndeterminateVisibility(false); } } // The BroadcastReceiver that listens for discovered devices private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if(TextUtils.equals(device.getName(), SEARCH_NAME)) { //Matching device found, connect mBtAdapter.cancelDiscovery(); try { mBtSocket = device.createRfcommSocketToServiceRecord(MY_UUID); mBtSocket.connect(); ConnectedTask task = new ConnectedTask(); task.execute(mBtSocket); } catch (IOException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "Error connecting to remote", Toast.LENGTH_SHORT).show(); } } //When discovery is complete } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setProgressBarIndeterminateVisibility(false); } } }; }