当前位置: 首页 > 面试题库 >

蓝牙发送和接收文本数据

东郭臻
2023-03-14
问题内容

我是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. 我如何在应用程序内部接收文本?

感谢所有的帮助人员。


问题答案:

一步一步来。

setContentView(R.layout.activity_main);

将设置视图的内容,我假设您在Fragment_main中定义的视图应为fragment_main作为其XML文件。因此,如果将其更改为

setContentView(R.layout. fragment_main);

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



 类似资料:
  • 实现蓝牙发送和接收数据的demo。文件包含两个工程,一个接收,一个发送。 [Code4App.com]

  • 我想知道我们是否可以将2个蓝牙设备连接到Android设备,并在Android中实时共享数据?i、 e我有一个传感器连接到Android设备,我想流式传输或收听或广播从传感器接收到的数据到耳机(连接到同一个Android设备)。在Android中可能吗??请提出建议。提前谢谢。 我想通过经典蓝牙收听音频流。有可能把Android设备变成接收器吗?目前,我们使用HFP模式和经典蓝牙进行通信。 场景:

  • 我正在尝试在android设备中通过蓝牙发送文件。我做了发现,连接,并做了一个蓝牙插座。问题是当我在蓝牙套接字的输出流中写入字节数组时,接收方没有接收到任何东西,尽管它接受正在发送的东西。

  • 我写了一个通过蓝牙发送/接收文件的应用程序,但我想把这个应用程序设置为默认的应用程序发送和接收文件! 移动设备向我的手机发送文件时的说明;我的应用程序获取文件,并与它一起工作之后,保存在我想要的时间和地点。

  • 我在Python 3上创建了简单的蓝牙RFCOMM服务器 这是我的代码: 当我从android设备应用程序发送数据时,比如BlueTerm、BlueTerm2、Bluetooth Terminal(…)我从PyCharm获得了截图 我的文本数据前面的符号是什么意思?我怎么能只打印我的字符串?

  • 在尝试发送存储在变量中的数据时,我遇到了一个问题。我希望变量是一个介于0和10之间的int,但我收到的是255或254作为值。请帮帮我 下面是我的代码: