蓝牙发送和接收文本数据

时间:2014-05-28 22:23:53

标签: java android eclipse bluetooth android-bluetooth

我是Android开发新手,我想创建一个使用蓝牙发送和接收文本的应用。我得到了关于发送文本逻辑上工作的所有内容,但是当我尝试在手机中测试它时,我无法看到界面。

这是Main Activity代码

import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBar; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup;   
import android.os.Build; 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.EditText; 
import android.widget.Button; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Set; import java.util.UUID;



public class MainActivity extends ActionBarActivity {


BluetoothAdapter mBluetoothAdapter;
  BluetoothSocket mmSocket;
  BluetoothDevice mmDevice;

  OutputStream mmOutputStream;
  InputStream mmInputStream;
  Thread workerThread;

  EditText myTextbox;
  TextView myLabel;

  byte[] readBuffer;
  int readBufferPosition;
  int counter;
  volatile boolean stopWorker;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      try {
          Button sendButton = (Button) findViewById(R.id.send);
          Button openButton = (Button) findViewById(R.id.open);
          myTextbox = (EditText) findViewById(R.id.editText);
          myLabel = (TextView) findViewById(R.id.textView);

          openButton.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  try {
                      findBT();
                      openBT();
                  } catch (IOException ex) {
                  }

              }
          });
          // send data typed by the user to be printed
          sendButton.setOnClickListener(new View.OnClickListener() {
              public void onClick(View v) {
                  try {
                      sendData();
                  } catch (IOException ex) {
                  }
              }
          });
      } catch (NullPointerException e) {
          e.printStackTrace();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

  // This will find a bluetooth device
  void findBT() {

      try {
          mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

          if (mBluetoothAdapter == null) {
              myLabel.setText("No bluetooth adapter available");
          }

          if (!mBluetoothAdapter.isEnabled()) {
              Intent enableBluetooth = new Intent(
                      BluetoothAdapter.ACTION_REQUEST_ENABLE);
              startActivityForResult(enableBluetooth, 0);
          }

          Set<BluetoothDevice> pairedDevices = mBluetoothAdapter
                  .getBondedDevices();
          if (pairedDevices.size() > 0) {
              for (BluetoothDevice device : pairedDevices) {

                  // Salaxy S4 is the name of the bluetooth device
                  if (device.getName().equals("Galaxy S4")) {
                      mmDevice = device;
                      break;
                  }
              }
          }
          myLabel.setText("Bluetooth Device Found");
      } catch (NullPointerException e) {
          e.printStackTrace();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

  // Tries to open a connection to the bluetooth device
  void openBT() throws IOException {
      try {
          // Standard SerialPortService ID
          UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
          mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
          mmSocket.connect();
          mmOutputStream = mmSocket.getOutputStream();
          mmInputStream = mmSocket.getInputStream();

          beginListenForData();

          myLabel.setText("Bluetooth Opened");
      } catch (NullPointerException e) {
          e.printStackTrace();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

  // After opening a connection to bluetooth device,
  // we have to listen and check if a data were sent to be printed.
  void beginListenForData() {
      try {
          final Handler handler = new Handler();

          // This is the ASCII code for a newline character
          final byte delimiter = 10;

          stopWorker = false;
          readBufferPosition = 0;
          readBuffer = new byte[1024];

          workerThread = new Thread(new Runnable() {
              public void run() {
                  while (!Thread.currentThread().isInterrupted()
                          && !stopWorker) {

                      try {

                          int bytesAvailable = mmInputStream.available();
                          if (bytesAvailable > 0) {
                              byte[] packetBytes = new byte[bytesAvailable];
                              mmInputStream.read(packetBytes);
                              for (int i = 0; i < bytesAvailable; i++) {
                                  byte b = packetBytes[i];
                                  if (b == delimiter) {
                                      byte[] encodedBytes = new byte[readBufferPosition];
                                      System.arraycopy(readBuffer, 0,
                                              encodedBytes, 0,
                                              encodedBytes.length);
                                      final String data = new String(
                                              encodedBytes, "US-ASCII");
                                      readBufferPosition = 0;

                                      handler.post(new Runnable() {
                                          public void run() {
                                              myLabel.setText(data);
                                          }
                                      });
                                  } else {
                                      readBuffer[readBufferPosition++] = b;
                                  }
                              }
                          }

                      } catch (IOException ex) {
                          stopWorker = true;
                      }

                  }
              }
          });

          workerThread.start();
      } catch (NullPointerException e) {
          e.printStackTrace();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

  /*
   * This will send data to be printed by the bluetooth
   */
  void sendData() throws IOException {
      try {

          // the text typed by the user
          String msg = myTextbox.getText().toString();
          msg += "\n";

          mmOutputStream.write(msg.getBytes());
          // tell the user data were sent
          myLabel.setText("Data Sent");

      } catch (NullPointerException e) {
          e.printStackTrace();
      } catch (Exception e) {
          e.printStackTrace();
      }

  }
}

这是我的Fragment_main

 
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res/com.example.bt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="top"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.bt.MainActivity$PlaceholderFragment" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Enter Text Here" />

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <Button
        android:id="@+id/open"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/send"
        android:layout_alignBottom="@+id/send"
        android:layout_alignRight="@+id/linearLayout1"
        android:text="Open" />

    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout1"
        android:layout_marginTop="15dp"
        android:layout_toLeftOf="@+id/button1"
        android:text="Send" />

    <TextView
        android:id="@+id/recievedText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/send"
        android:layout_below="@+id/send"
        android:layout_marginTop="20dp"
        android:text="Received Text" />

    <TextView
        android:id="@+id/rtArea"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/recievedText"
        android:layout_alignParentBottom="true"
        android:layout_below="@+id/recievedText"
        android:layout_marginTop="20dp"
        android:text="Received Text Will be Displayed Here..." />

</RelativeLayout>

我的Manifest

 
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <supports-screens android:anyDensity="true" />

    <uses-permission android:name="android.permissions.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.bt.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

所以我想知道:

  1. 为什么我看不到界面并测试我的代码?
  2. 如何在应用内部接收文字?
  3. 感谢所有帮助人员。

1 个答案:

答案 0 :(得分:0)

一次一步。

setContentView(R.layout.activity_main);

将设置视图的内容,我假设它在Fragment_main中定义的应该是fragment_main作为XML文件。所以如果你把它改成

setContentView(R.layout. fragment_main);

您应该能够看到用户界面。