package com.nj.bluetooth;
import java.io.DataInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.UUID;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import com.nj.activity.task.TaskMainActivity;
import com.nj.activity.task.collect.ScanDataActivity;
import com.nj.activity.task.match.CheckDataActivity;
import com.nj.deamon.HandlerManager;
import com.nj.tool.ClsUtils;
import com.nj.tool.Constant;
import com.nj.activity.BlueToothTestActivity;
public class BlueToothService extends Service {
public static BluetoothDevice device;
private BluetoothSocket socket;
public static boolean isConnect = false;
private boolean isRuning = true;
private SharedPreferences sPreferences;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
sPreferences = getSharedPreferences(Constant.PREFERENCES_NAME, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
if(intent != null){
device = intent.getParcelableExtra("blueDevice");
}
if(device != null){
/**
* 自动设置匹配码
*/
boolean result = ClsUtils.pair(device.getAddress(), "0000", BluetoothAdapter.getDefaultAdapter());
if(!result){
ClsUtils.pair(device.getAddress(), "1234", BluetoothAdapter.getDefaultAdapter());
}
new LinkBlueTooth().execute(device);
}else{
Log.v("=======BlueToothService===device===", "="+device);
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
device = null;
isRuning = false;
isConnect = false;
}
class LinkBlueTooth extends AsyncTask<Object, Void, Boolean>{
@Override
protected void onPostExecute(Boolean result) {
if(!result){
Message message = new Message();
message.what = Constant.LINK_FAILE;
Handler handler = HandlerManager.getHandler(ScanDataActivity.class.getName());
if(handler != null){
message.obj = "主机已关";
handler.sendMessage(message);
}else if(handler == null){
handler = HandlerManager.getHandler(CheckDataActivity.class.getName());
if(handler != null){
message.obj = "主机已关";
handler.sendMessage(message);
}else {
handler = HandlerManager.getHandler(BlueToothTestActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}else{
handler = HandlerManager.getHandler(TaskMainActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}
}
}
}
}
super.onPostExecute(result);
}
@Override
protected Boolean doInBackground(Object... params) {
BluetoothDevice device = (BluetoothDevice) params[0];
// Log.v("====device====", device.getName());
try {
for(int i = 0;i < 3;i++){
/**
* 获取蓝牙连接
*/
Method method = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
socket = (BluetoothSocket) method.invoke(device, 1);
// socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket.connect();
isConnect = true;
Constant.lastBluetoothDevice = device;
Editor editor = sPreferences.edit();
editor.putString(Constant.lastBlueDevice, device.getAddress());
editor.commit();
Message message = new Message();
message.what = Constant.LINK_SUCCESS;
Handler handler = HandlerManager.getHandler(ScanDataActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}else{
handler = HandlerManager.getHandler(CheckDataActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}else{
handler = HandlerManager.getHandler(BlueToothTestActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}else{
handler = HandlerManager.getHandler(TaskMainActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}
}
}
}
readData();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return isConnect;
}
}
/**
* 读取数据
*/
private void readData(){
DataInputStream dInputStream = null;
Handler handle = null ;
try {
dInputStream = new DataInputStream(socket.getInputStream());
while (isRuning) {
String data = dInputStream.readLine();
// Log.v("======================data===================", "data="+data);
if(data == null || "".equals(data)){
continue;
}
handle = HandlerManager.getHandler(ScanDataActivity.class.getName());
// Log.v("======================handler===================", "handler="+handle);
//传递给 盘点采集 界面
if(handle != null){
Message msg = handle.obtainMessage();
msg.what = ScanDataActivity.task_collect_scan_msg;
msg.obj = data;
handle.sendMessage(msg);
}
//传递给 数据对比 界面
handle = HandlerManager.getHandler(CheckDataActivity.class.getName());
if(handle != null){
Message msg = handle.obtainMessage();
msg.what = CheckDataActivity.task_checkData_scan_msg;
msg.obj = data;
handle.sendMessage(msg);
}
}
} catch (Exception e) {
Message message = new Message();
message.what = Constant.TASK_COLLECT_CLOSE_SCAN;
Handler handler = HandlerManager.getHandler(ScanDataActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}else{
handler = HandlerManager.getHandler(CheckDataActivity.class.getName());
if(handler != null){
handler.sendMessage(message);
}
}
// message.what = com.nj.activity.BlueToothTestActivity.LINK_DISCON;
// com.nj.activity.BlueToothTestActivity.handler.sendMessage(message);
stopSelf();
}finally{
try {
if(dInputStream != null){
dInputStream.close();
}
} catch (Exception e2) {
}
}
}
}
package com.nj.tool;
/***********************************
* 蓝牙配对函数 * **************/
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.util.Log;
public class ClsUtils {
/**
* 涓庤澶囬厤瀵�鍙傝�婧愮爜锛歱latform/packages/apps/Settings.git
* /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
*/
static public boolean createBond(Class btClass, BluetoothDevice btDevice)
throws Exception {
Method createBondMethod = btClass.getMethod("createBond");
Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
return returnValue.booleanValue();
}
/**
* 涓庤澶囪В闄ら厤瀵�鍙傝�婧愮爜锛歱latform/packages/apps/Settings.git
* /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
*/
static public boolean removeBond(Class btClass, BluetoothDevice btDevice)
throws Exception {
Method removeBondMethod = btClass.getMethod("removeBond");
Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
return returnValue.booleanValue();
}
static public boolean setPin(Class btClass, BluetoothDevice btDevice,
String str) throws Exception {
try {
Method removeBondMethod = btClass.getDeclaredMethod("setPin",
new Class[] { byte[].class });
Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice,
new Object[] { str.getBytes() });
Log.e("returnValue", "" + returnValue);
} catch (SecurityException e) {
// throw new RuntimeException(e.getMessage());
e.printStackTrace();
} catch (IllegalArgumentException e) {
// throw new RuntimeException(e.getMessage());
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
/**
*
* @param clsShow
*/
static public void printAllInform(Class clsShow) {
try {
// 鍙栧緱鎵�湁鏂规硶
Method[] hideMethod = clsShow.getMethods();
int i = 0;
for (; i < hideMethod.length; i++) {
Log.e("method name", hideMethod[i].getName() + ";and the i is:" + i);
}
// 鍙栧緱鎵�湁甯搁噺
Field[] allFields = clsShow.getFields();
for (i = 0; i < allFields.length; i++) {
Log.e("Field name", allFields[i].getName());
}
} catch (SecurityException e) {
// throw new RuntimeException(e.getMessage());
e.printStackTrace();
} catch (IllegalArgumentException e) {
// throw new RuntimeException(e.getMessage());
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 配对
* @param address
* @param psw
* @return
*/
public static boolean pair(String address,String psw,BluetoothAdapter adapter){
boolean result = false;
BluetoothDevice device = adapter.getRemoteDevice(address);
if(device.getBondState() != BluetoothDevice.BOND_BONDED){
try {
setPin(device.getClass(),device, psw);
boolean flag = createBond(device.getClass(), device);
if(flag){
result = true;
}
} catch (Exception e) {
e.printStackTrace();
}
}else {
result = true;
}
return result;
}
}
分享到:
相关推荐
- **Android Bluetooth框架层**:位于Java层,包含`android.bluetooth`包中的各种类,如`BluetoothAdapter`, `BluetoothDevice`, `BluetoothGatt`等,提供了开发者友好的API。 - **蓝牙应用程序**:使用Android蓝牙...
Android Bluetooth 框架知识 Android Bluetooth 框架知识是指在 Android 系统中,关于 Bluetooth 技术的架构和实现细节。Android 4.2 和 4.3 中的 Bluetooth 框架知识是特别重要的,因为在这个版本中,Android 引入...
Android Bluetooth API主要包含在`android.bluetooth`包中,开发者可以使用`BluetoothAdapter`来管理设备的蓝牙功能,`BluetoothDevice`代表远程蓝牙设备,`BluetoothGatt`和`BluetoothGattCallback`用于BLE设备的...
在Android平台上,Bluetooth 4.0,也称为Bluetooth Low Energy (BLE) 或 Bluetooth Smart,是一种高效、低功耗的无线通信技术,广泛应用于健康监测、智能家居、运动追踪等物联网(IoT)设备。本案例“Android ...
"android bluetooth demo 蓝牙样例"是一个专为开发者设计的示例项目,它可以帮助初学者理解如何在Android应用中实现蓝牙功能。这个示例程序包含了完整的代码注释和解释,使得学习过程更加清晰易懂。 在Android中,...
在Android平台上,蓝牙(Bluetooth)是一种常见的无线通信技术,用于设备间的短距离数据交换。本文将深入探讨如何在Android应用中实现蓝牙文件传输,包括如何建立连接、发送和接收文件,以及显示传输进度。 首先,...
AndroidBluetooth Framework 是 Android 操作系统中的蓝牙协议栈,负责管理蓝牙设备的连接、数据传输和蓝牙 Profile 的管理。整个蓝牙系统可以分为四个层次:蓝牙嵌入式系统(BTE)、蓝牙应用(BTA)、蓝牙系统服务...
### Android Bluetooth FTP协议知识点 #### 一、简介 蓝牙文件传输配置文件(File Transfer Profile,简称FTP)定义了蓝牙设备支持文件传输用例模型所需的要求。这些要求通过定义终端用户服务以及实现蓝牙设备间...
Android Bluetooth HID调试和集成 Android系统中的蓝牙HID Profile是一种常用的Profile,它可以让Android设备与蓝牙键盘、鼠标等设备进行连接,但是在Google的Android系统中,HID Profile并没有被实现。幸运的是,...
"Android Bluetooth"这个主题涵盖了许多关键知识点,下面将详细讲解如何在Android应用程序中实现蓝牙功能。 首先,打开蓝牙服务是Android蓝牙编程的第一步。在Android中,我们需要使用`BluetoothAdapter`类来管理...
在Android系统中,蓝牙(Bluetooth)技术是一种广泛用于设备间短距离无线通信的接口,它允许用户连接各种设备,如耳机、键盘、鼠标、打印机、智能手表和其他移动设备。通过Android Bluetooth API,开发者可以构建...
### Android Bluetooth 简介 #### 一、概述 在Android平台上进行蓝牙开发,自2.0版本SDK开始提供支持。然而,需要注意的是,Android模拟器并不支持蓝牙功能的模拟,因此,在进行蓝牙相关的开发时,至少需要两部...
标题中的"BLUETOOTH_delphiandroid_delphibluetooth_AndroidBluetooth_learngc"表明这是一个关于使用Delphi开发Android应用程序,特别关注蓝牙通信技术的学习资源。Delphi是一款流行的RAD(快速应用开发)工具,它...
1. **蓝牙权限与配置**:在Android应用中使用蓝牙,首先需要在AndroidManifest.xml文件中声明`<uses-permission>`,如`android.permission.BLUETOOTH`和`android.permission.BLUETOOTH_ADMIN`,以确保应用有权限访问...
在Android系统中,蓝牙(Bluetooth)是一种无线通信技术,用于设备间的短距离数据交换和音频流传输。本文将深入探讨Android蓝牙的工作原理,包括其基本概念、架构、配对过程以及API的使用。 首先,我们要了解蓝牙的...
在Android系统中,Bluetooth OPP(Object Push Profile)是一种用于设备间传输小文件的协议,它允许用户方便地发送图片、联系人、日历事件等数据。这篇博客文章的附件是针对一个特定的Android设备(可能是Xiaomi设备...
在Android系统中,蓝牙(Bluetooth)技术是一种广泛用于设备间无线通信的标准,它允许设备进行数据交换和配对,例如连接耳机、智能手表、车载音响等。本篇将深入探讨在Android蓝牙开发过程中可能遇到的问题及如何...