当前位置:首页 > 开发 > 移动开发 > 正文

Android实现主动连接蓝牙耳机

发表于: 2015-07-15   作者:gqdy365   来源:转载   浏览:
摘要: 在Android程序中可以实现自动扫描蓝牙、配对蓝牙、建立数据通道。蓝牙分不同类型,这篇文字只讨论如何与蓝牙耳机连接。 大致可以分三步: 一、扫描蓝牙设备: 1、注册并监听广播: BluetoothAdapter.ACTION_DISCOVERY_STARTED BluetoothDevice.ACTION_FOUND BluetoothAdapter.ACTION_DIS
在Android程序中可以实现自动扫描蓝牙、配对蓝牙、建立数据通道。蓝牙分不同类型,这篇文字只讨论如何与蓝牙耳机连接。
大致可以分三步:

一、扫描蓝牙设备:
1、注册并监听广播:
BluetoothAdapter.ACTION_DISCOVERY_STARTED
BluetoothDevice.ACTION_FOUND
BluetoothAdapter.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

Android实现主动连接蓝牙耳机

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
第一种连接方式,使用反射类,连接不成功; Method m = null; try { m = btDev.getClass().getMetho
蓝牙耳机连接笔记本电脑Think E430C 有线耳机用起来很不方便,现在都流行使用蓝牙耳机,那么怎么使
蓝牙耳机连接笔记本电脑Think E430C 有线耳机用起来很不方便,现在都流行使用蓝牙耳机,那么怎么使
Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可
Android中如何实现蓝牙的配对与连接 又是很长一段时间没写博客了,一是空余时间比较少,二是感觉学
一,连接步骤 1、双击蓝牙按钮,如下图:    2、添加设备    3、打开android手机的蓝牙以及设备
一,连接步骤 1、双击蓝牙按钮,如下图:    2、添加设备    3、打开android手机的蓝牙以及设备
最近闲来无事,刚好有妹子问蓝牙方面的问题,于是楼主恬不知耻地去研究Android的蓝牙机制。 蓝牙是
新年第一篇。 最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看
分类: 外围设备, 便携音像 第一眼看过去你还会以为诺基亚转行卖糖果了,其实不然,这是诺基亚10月份
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号