您的位置:首页 > 移动开发 > Android开发

Android蓝牙开发经验总结(一)

2015-12-16 19:13 369 查看
[code]转载请注明博客地址`http://blog.csdn.net/q1406689423/article/details/50331889`,谢谢!


一直以为在CSDN上面写日志的都是一些大牛,而且也觉得写博客是一种很好的学习总结的方法,但是也是由于自己没什么时间,也是觉得自己水平不够,没有什么可写的。但是还是有一个成为大牛的心,所以还是决定开始写日志。同时也算给别说一下自己解决问题的方法,另外 以后再做这一块也是一个参考。

这份工作应该算是我第一份从事编程的工作,刚开始来的时候以为是做Android前端的UI,自己本身对UI开发还算比较感兴趣,所以就悻悻地来了。来了才知道我们这公司是一个游戏公司,我需要做的不是UI方面,而是做蓝牙通信这一块,以前也没做过这一块,但是觉得应该不会太难,应该会有系统给提供的一些接口,直接调用就可以了。但是确实是自己想简单了,算上处理bug用了大半个月的时间了,而且本来建议是采用蓝牙4.0的开发的,但是老板说为了让覆盖的人群更广就没选,不懂技术的老板伤不起啊!在这就是想把经验向大家分享一下,希望可以帮到有需要的人。

不说废话了,开始进入正题!

首先说一下蓝牙开发的准备阶段,主要就是在网上找类似的源码,本来以为蓝牙的源码应该也是不少的,但是找了一下却并不像自己想的那样,而且看着是符合自己需求的那种,点开发现却是要有积分之类的,其实挺坑的。找了很久之后,最后在一个论坛里发现一个人给的地址,是github上的一个源码,点开之后是直接可以聊天的那种,正好符合自己的需求。看了看github上的介绍,才发现原来是AndroidSDK上面原生的例子,感觉自己走了很多弯路啊!在此推荐给有意于蓝牙开发的同学一个提醒!

Github上的下载地址:https://github.com/ALLENnan/BluetoothChat

应该是这个网址,以前的没记下,写这篇日志的时候又在上面找了一下,应该是这个!

但是这里面的结构不是很清晰,而且是把三个连接状态下的线程都写在一个Service服务类,我自己感觉这样写是不怎么好的,一是结构不太清晰,二来感觉也不太容易维护,所以就进行了一些拆分。

首先来看一下主类BluetoothChat的作用:

[code] @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(D) Log.e(TAG, "+++ ON CREATE +++");
        // Set up the window layout
        setContentView(R.layout.main);
        // Get local Bluetooth adapter
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // If the adapter is null, then Bluetooth is not supported
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
    }


在Oncreate方法里面获得了一个BluetoothAdapter的对象,这个对象很重要,是实现蓝牙各种功能的基础,至于用法什么大家可以查看官方API进行了解,后面也会用到。需要注意的是Android api18以上获得BluetoothAdapter对象的方法不同了,大家可以查阅官方文档,这里不再赘述。

[code] @Override
    public void onStart() {
        super.onStart();
        if(D) Log.e(TAG, "++ ON START ++" );

        // If BT is not on, request that it be enabled.
        // setupChat() will then be called during onActivityResult
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);

        // Otherwise, setup the chat session
        } else {
            if (mChatService == null) setupChat();
        }
    }


我们看到,在onstart方法里面进行了打开蓝牙的操作,其实直接调用mBluetoothAdapter的enable()方法也可以实现这样的效果!

[code]@Override
    public synchronized void onResume() {
        super.onResume();
        if(D) Log.e(TAG, "+ ON RESUME +");

        // Performing this check in onResume() covers the case in which BT was
        // not enabled during onStart(), so we were paused to enable it...
        // onResume() will be called when ACTION_REQUEST_ENABLE activity returns.
        if (mChatService != null) {
            // Only if the state is STATE_NONE, do we know that we haven't started already
            if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
              // Start the Bluetooth chat services
              mChatService.start();
            }
        }
    }


在onResume方法里面我们就可以看到源码mChatService开始启动了,但是我改动之后的是将服务分为了两个线程,也是因为我们的项目的需要,就是拆分为一个用来主动连接的线程、一个用来接收的线程。

先写到这了,明天继续哈~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: