欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现的简单蓝牙程序示例

程序员文章站 2024-03-03 18:47:28
本文实例讲述了android实现的简单蓝牙程序。分享给大家供大家参考,具体如下: 我将在这篇文章中介绍了的android蓝牙程序。这个程序就是将实现把手机变做电脑ppt播...

本文实例讲述了android实现的简单蓝牙程序。分享给大家供大家参考,具体如下:

我将在这篇文章中介绍了的android蓝牙程序。这个程序就是将实现把手机变做电脑ppt播放的遥控器:用音量加和音量减键来控制ppt页面的切换。

遥控器服务器端

首先,我们需要编写一个遥控器的服务器端(支持蓝牙的电脑)来接收手机端发出的信号。为了实现这个服务器端,我用到了一个叫做bluecove(专门用来为蓝牙服务的!)的java库。

以下是我的remotebluetoothserver类:

public class remotebluetoothserver{
  public static void main(string[] args) {
    thread waitthread = new thread(new waitthread());
    waitthread.start();
  }
}

在主方法中创建了一个线程,用于连接客户端,并处理信号。

public class waitthread implements runnable{
  /** constructor */
  public waitthread() {
  }
  @override
  public void run() {
    waitforconnection();
  }
  /** waiting for connection from devices */
  private void waitforconnection() {
    // retrieve the local bluetooth device object
    localdevice local = null;
    streamconnectionnotifier notifier;
    streamconnection connection = null;
    // setup the server to listen for connection
    try {
      local = localdevice.getlocaldevice();
      local.setdiscoverable(discoveryagent.giac);
      uuid uuid = new uuid(80087355); // "04c6093b-0000-1000-8000-00805f9b34fb"
      string url = "btspp://localhost:" + uuid.tostring() + ";name=remotebluetooth";
      notifier = (streamconnectionnotifier)connector.open(url);
    } catch (exception e) {
      e.printstacktrace();
      return;
    }
        // waiting for connection
    while(true) {
      try {
        system.out.println("waiting for connection...");
            connection = notifier.acceptandopen();
        thread processthread = new thread(new processconnectionthread(connection));
        processthread.start();
      } catch (exception e) {
        e.printstacktrace();
        return;
      }
    }
  }
}

在waitforconnection()中,首先将服务器设为可发现的,并为这个程序创建了uuid(用于同客户端通信);然后就等待来自客户端的连接请求。当它收到一个初始的连接请求时,将创建一个processconnectionthread来处理来自客户端的命令。以下是processconnectionthread的代码:

public class processconnectionthread implements runnable{
  private streamconnection mconnection;
  // constant that indicate command from devices
  private static final int exit_cmd = -1;
  private static final int key_right = 1;
  private static final int key_left = 2;
  public processconnectionthread(streamconnection connection)
  {
    mconnection = connection;
  }
  @override
  public void run() {
    try {
      // prepare to receive data
      inputstream inputstream = mconnection.openinputstream();
      system.out.println("waiting for input");
      while (true) {
        int command = inputstream.read();
        if (command == exit_cmd)
        {
          system.out.println("finish process");
          break;
        }
        processcommand(command);
      }
    } catch (exception e) {
      e.printstacktrace();
    }
  }
  /**
   * process the command from client
   * @param command the command code
   */
  private void processcommand(int command) {
    try {
      robot robot = new robot();
      switch (command) {
        case key_right:
          robot.keypress(keyevent.vk_right);
          system.out.println("right");
          break;
        case key_left:
          robot.keypress(keyevent.vk_left);
          system.out.println("left");
          break;
      }
    } catch (exception e) {
      e.printstacktrace();
    }
  }
}

processconnectionthread类主要用于接收并处理客户端发送的命令。需要处理的命令只有两个:key_right和key_left。我用java.awt.robot来生成电脑端的键盘事件。

以上就是服务器端所需要做的工作。

遥控器客户端

这里的客户端指的其实就是android手机。在开发手机端代码的过程中,我参考了 android dev guide中bluetooth chat这个程序的代码,这个程序在sdk的示例代码中可以找到。

要将客户端连接服务器端,那么必须让手机可以扫描到电脑,devicelistactivity 类的工作就是扫描并连接服务器。bluetoothcommandservice类负责将命令传至服务器端。这两个类与bluetooth chat中的内容相似,只是删除了bluetooth chat中的bluetoothcommandservice中的acceptthread ,因为客户端不需要接受连接请求。connectthread用于初始化与服务器的连接,connectedthread 用于发送命令。

remotebluetooth 是客户端的主activity,其中主要代码如下:

protected void onstart() {
  super.onstart();
  // if bt is not on, request that it be enabled.
    // setupcommand() will then be called during onactivityresult
  if (!mbluetoothadapter.isenabled()) {
    intent enableintent = new intent(bluetoothadapter.action_request_enable);
    startactivityforresult(enableintent, request_enable_bt);
  }
  // otherwise set up the command service
  else {
    if (mcommandservice==null)
      setupcommand();
  }
}
private void setupcommand() {
  // initialize the bluetoothchatservice to perform bluetooth connections
    mcommandservice = new bluetoothcommandservice(this, mhandler);
}

onstart()用于检查手机上的蓝牙是否已经打开,如果没有打开则创建一个intent来打开蓝牙。setupcommand()用于在按下音量加或音量减键时向服务器发送命令。其中用到了onkeydown事件:

public boolean onkeydown(int keycode, keyevent event) {
  if (keycode == keyevent.keycode_volume_up) {
    mcommandservice.write(bluetoothcommandservice.vol_up);
    return true;
  }
  else if (keycode == keyevent.keycode_volume_down){
    mcommandservice.write(bluetoothcommandservice.vol_down);
    return true;
  }
  return super.onkeydown(keycode, event);
}

此外,还需要在androidmanifest.xml加入打开蓝牙的权限的代码。

<uses-permission android:name="android.permission.bluetooth_admin" />
  <uses-permission android:name="android.permission.bluetooth" />

以上就是客户端的代码。

将两个程序分别在电脑和手机上安装后,即可实现用手机当作一个ppt遥控器了!

ps:关于androidmanifest.xml详细内容可参考本站在线工具:

android manifest功能与权限描述大全:

http://tools.jb51.net/table/androidmanifest

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。