当前位置: 代码迷 >> Android >> Android实现积极连接蓝牙耳机
  详细解决方案

Android实现积极连接蓝牙耳机

热度:55   发布时间:2016-04-27 23:56:42.0
Android实现主动连接蓝牙耳机
在Android程序中可以实现自动扫描蓝牙、配对蓝牙、建立数据通道。蓝牙分不同类型,这篇文字只讨论如何与蓝牙耳机连接。
大致可以分三步:

一、扫描蓝牙设备:
1、注册并监听广播:
BluetoothAdapter.ACTION_DISCOVERY_STARTEDBluetoothDevice.ACTION_FOUNDBluetoothAdapter.ACTION_DISCOVERY_FINISHED

启动扫描:

BluetoothAdapter.getDefaultAdapter().startDiscovery();


对扫描的结果按类型进行筛选,只保留我们需要的蓝牙耳机:

		if(device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET				|| device.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE){//蓝牙耳机}


二、配对指定的蓝牙设备:
这个跟配对普通蓝牙一样,方法如下:
	public static  boolean createBond(BluetoothDevice btDevice){		boolean result = false;		try{			Method m = btDevice.getClass().getDeclaredMethod("createBond",new Class[]{});			m.setAccessible(true);			Boolean originalResult = (Boolean) m.invoke(btDevice);			result = originalResult.booleanValue();		}catch(Exception ex){		}		return result;	}


等配对完成之后就是要建立数据连接;

三、建立数据连接:

if you SDK between 11 and 16.call a2dp.connectSink(btDevice) or a2dp.connect(btDevice)

private static IBluetoothA2dp getIBluetoothA2dp() {    IBluetoothA2dp ibta = null;    try {        final Class serviceManager = Class.forName("android.os.ServiceManager");        final Method getService = serviceManager.getDeclaredMethod("getService", String.class);        final IBinder iBinder = (IBinder) getService.invoke(null, "bluetooth_a2dp");        final Class iBluetoothA2dp = Class.forName("android.bluetooth.IBluetoothA2dp");        final Class[] declaredClasses = iBluetoothA2dp.getDeclaredClasses();        final Class c = declaredClasses[0];        final Method asInterface = c.getDeclaredMethod("asInterface", IBinder.class);        asInterface.setAccessible(true);        ibta = (IBluetoothA2dp) asInterface.invoke(null, iBinder);    } catch (final Exception e) {        Log.e("Error " + e.getMessage());    }    return ibta;}

参考:http://stackoverflow.com/questions/8467178/working-around-a2dp-and-hfp-limitations-of-android-pre-honeycomb

如果API大于16需要用如下的方法:

	private void initA2dpService(){//		Intent i = getExplicitIntent(mContext,new Intent(IBluetoothA2dp.class.getName()));//5.0以上系统需要显示intent		Intent i = new Intent(IBluetoothA2dp.class.getName());		boolean success = mContext.bindService(i, mConnection, Context.BIND_AUTO_CREATE);		if (success) {		} else {		}	}	public ServiceConnection mConnection = new ServiceConnection() {		@Override		public void onServiceConnected(ComponentName name, IBinder service) {			try {				mA2dpService = IBluetoothA2dp.Stub.asInterface(service);			} catch (Exception e) {				e.printStackTrace();			}		}		@Override		public void onServiceDisconnected(ComponentName name) {			// TODO Auto-generated method stub		}	};	    public Intent getExplicitIntent(Context context, Intent implicitIntent) {        // Retrieve all services that can match the given intent        PackageManager pm = context.getPackageManager();        List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);        // Make sure only one match was found        if (resolveInfo == null || resolveInfo.size() != 1) {            return null;        }        // Get component info and create ComponentName        ResolveInfo serviceInfo = resolveInfo.get(0);        String packageName = serviceInfo.serviceInfo.packageName;        String className = serviceInfo.serviceInfo.name;        ComponentName component = new ComponentName(packageName, className);        // Create a new intent. Use the old one for extras and such reuse        Intent explicitIntent = new Intent(implicitIntent);        // Set the component to be explicit        explicitIntent.setComponent(component);        return explicitIntent;    }

建立连接:mA2dpService.connect(device);
断开连接:mA2dpService.disconnect(device);

参考:http://stackoverflow.com/questions/14705167/how-connect-paired-bluetooth-a2dp-device-on-android-4-2-using-reflection

http://blog.csdn.net/qs_csu/article/details/45114251
  相关解决方案