android bluetooth

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;
	}
}

 

你可能感兴趣的:(BlueTooth)