由于是公司项目,有些东西,我会保留,请您见谅。版权所有,违者必究。

非常抱歉,将近两个月没有写Android每一天了。主要是最近忙着毕业的事情和公司蓝牙灯项目的事情。今天我就共享一下劳动成果,希望对您有一点点帮助。

今天开始蓝牙智能灯项目的编写,一步步,从开始到结束。为了讲解详细,因此会分几节进行讲解。由于是单兵做战,就按照单兵做战的来。

一、简单需求

a) 经典蓝牙通信

具有打开开蓝,关闭蓝牙及搜索蓝牙设备基本功能,可选着蓝牙设备进行自动配对连接,保存已连接蓝牙设备,下次进入自动连接。连接成功后可进行数据交互和蓝牙状态改变监听;

b) 开关

基本的开灯关灯功能;

c) 调光

调节当前亮度;

d) 调色

具有调色圆环,通过在圆环上滑动取出相应位置颜色值,编码后发出使灯改变为相应颜色;

e) 延时关灯

用户可以滑动时间条,选择等待时间,到时间后会自动关灯,无需用户再次操作;

f) 音乐律动

随音乐有规律改变颜色值及亮度;

g) 摇一摇

摇一摇开灯关灯,及随机变色;

h) 七彩灯

小游戏功能的随机颜色改变;

i) 闹钟任务

用户可添加闹钟事件,定时开灯播放音乐叫醒用户,也可定时关灯。

j) 其他情景模式

阅读模式,浪漫模式等,且用户可添加自己的模式;

k) 菜单功能

设置密码,更改灯名,退出程序,关于我们及系统设置。

二、需求分析

a) 功能a是贯穿整个项目的通信基础,无界面,重点是通信逻辑;

b) 功能b/c/d/e可以放到一个页面里,为用户最常用的最基本的功能;

c) 功能f/g/h/j为特效功能,可以单独放到一个页面里面;

d) 闹钟任务单独一页;

e) 菜单功能为框架功能;

三、UI框架

常见UI框架,类似微信,类似扣扣,类似百度,类似QQ音乐,等等;

从需求分析,页数比较少且无需多层次交互,故选着类似微信的滑屏,简化;

实现方式:ViewPager+Fragment

四、开发环境

Windows 10 + JDK1.8 + Android Studio 1.4(没线买Mac啊)

五、项目结构

其中:

activity里放置用到的Activity

adapter里为适配器

ai为接口

bean是模型

Fragment里放置相应的显示内容

Library放置用到的其它的开源库等等(放在这里,是为了可以修改源码,定制开发)

Net里放置的为线程池操作等通信功能

Service是服务

Util为实用工具类和常量

View里为自定义控件

这是最简单最弱智的代码结构组织了,请原谅我的弱智。哈哈

六、项目框架源码

基于以上内容分析,搭建项目框架(步骤如下:)

新建一个项目选择:Tabbed Activity

项目自动生成后,添加AppContext.java类,源码如下:主要是为了管理全局内容,并防止系统崩溃;

AppContext.java

/**
 * @author Leo
 * @detail 程序入口点 处理程序异常和全局内容
 * @time 2015-10-29
 */
public class AppContext extends Application {
    /**
     * 以下为单例模式
     */
    private volatile static AppContext mAppContext = null;

public static AppContext getInstance() {
        if (mAppContext == null) {
            synchronized (AppContext.class) {
                if (mAppContext == null) {
                    mAppContext = new AppContext();
                }
            }
        }
        return mAppContext;
    }

/**
     * 以下为uncaught exception的处理代码 防止程序崩溃
     */
    private Thread.UncaughtExceptionHandler mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    private Thread.UncaughtExceptionHandler mUncaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            if (!handleException(ex) && mDefaultHandler != null) {
                mDefaultHandler.uncaughtException(thread, ex);
            } else {
                restartApplication();
            }
            System.exit(0);
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    };

/**
     * 处理异常
     *
     * @param ex
     * @return
     */
    private boolean handleException(Throwable ex) {
        if (ex == null) {
            return false;
        }
        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        Looper.prepare();
                        Toast.makeText(getApplicationContext(), R.string.error_info, Toast.LENGTH_SHORT).show();
                        Looper.loop();
                    }
                }
        ).start();
        return true;
    }

/**
     * 重启程序
     */
    private void restartApplication() {
        Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }
}

添加SplashActivity.java用于判断蓝牙是否支持,公司宣传等等,加入了点击跳过功能;

/**
 * @author Leo
 * @detail 程序进入时的首页面主要做公司宣传程序版本数据加载操作
 * @time 2015-10-30
 */
public class SplashActivity extends AppCompatActivity {
    public static final long DELAY = 1500;//等待时延
    private Handler mHandler = new Handler();//控制Handler

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        BluetoothSPP bt = BluetoothSPP.getInstance();
        if (!bt.isBluetoothAvailable()) {
            Toast.makeText(this, R.string.default_text, Toast.LENGTH_LONG).show();
            finish();
        } else {
            mHandler.postDelayed(mRunnable, DELAY);//DELAY后发出线程
            if (!bt.isBluetoothEnabled()) {
                bt.enable();
            }
        }
    }

/**
     * 要执行的线程
     */
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            startTheActivity();
        }
    };

/**
     * 启动主Activity
     */

private void startTheActivity() {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }

/**
     * 扑捉触屏事件 用户可以点击屏幕快速进入
     *
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //return super.onTouchEvent(event);
        int action = event.getAction();
        if (action == MotionEvent.ACTION_UP) {
            mHandler.removeCallbacks(mRunnable);
            startTheActivity();
        }
        return true;
    }
}

注意:这里使用的蓝牙通信是开源的BluetoothSPP项目(https://github.com/akexorcist/Android-BluetoothSPPLibrary/)

然后是MainActivity.java

我对生成的代码进行了修改:把Adapter单独放到adapter里,Fragment单独放到fragment里

/**
 * @author Leo
 * @detail 项目框架主界面 具有滑动切换功能 各类功能在各自Fragment里
 * @time 2015-10-29
 */
public class MainActivity extends AppCompatActivity {
    private SectionsStatePagerAdapter mSectionsStatePagerAdapter;//页面适配器
    //private SectionsPagerAdapter mSectionsPagerAdapter;//页面适配器
    private ViewPager mViewPager;//滑动控件
    private Toolbar mToolbar;//页面名称显示

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         init();//初始化数据和控件
    }

/**
     * 初始化操作
     */
    private void init() {
        //设置ToolBar
        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        mToolbar.setSubtitle(getString(R.string.subtitle_disconnected));
        setSupportActionBar(mToolbar);
        //获取页面适配器
        mSectionsStatePagerAdapter = new SectionsStatePagerAdapter(getSupportFragmentManager());
        mSectionsStatePagerAdapter.addPage(MainFragment.getInstance());
        mSectionsStatePagerAdapter.addPage(SceneFragment.getInstance());
        //mSectionsPagerAdapter.addPage(TimerFragment.getInstance());
        mSectionsStatePagerAdapter.addPage(StatusFragment.getInstance());
        //设置ViewPager
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsStatePagerAdapter);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return true;
        //return super.onOptionsItemSelected(item);
    }

}

SectionsPagerAdapter.java

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    private ArrayList<Fragment> pages;//保存页面

public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
        pages = new ArrayList<>();//生成
    }

@Override
    public Fragment getItem(int position) {
        return pages.get(position);
    }

@Override
    public int getCount() {
        return pages.size();
    }

/**
     * 此接口是为了添加页面
     *
     * @param page
     */
    public void addPage(Fragment page) {
        this.pages.add(page);
    }
}

各个Fragment的代码我就不发出来了,后续继续更新

欧了,框架搭建完成,效果如下:

时间差不多了,明天继续。明天任务蓝牙通信,后台运行,菜单(显示图标)。

总结:完成一个项目,首先是需求,需求确定后就是UI框架了,然后就是对要做的项目进行知识点预演,查找解决方案,因为有些代码,别人已经帮我们写好了,我们没有必要再去做重复的工作,再说咱们自己做的也不一定就比别人做的好,既然是开源,可以直接拿来用,如果有问题,我们可以对其时行更正。come on.本项目中,应用了开源的BluetoothSpp进行蓝牙通信。

第四天 魔小灯(蓝牙智能灯)1相关推荐

  1. 蓝牙智能灯带(天猫精灵生态)方案

    系统简介 灯带是指把LED灯用特殊的加工工艺焊接在铜线或者带状柔性电路板上面,再连接上电源发光,因其发光时形状如一条光带而得名.灯带发光颜色多变.可调光.可控制颜色变化.可选择单色和RGB的效果,带给 ...

  2. 【安信可LoRa模组专题②】快速搭建远程控制灯LoRa智能灯控【51单片机篇】

    本LoRa模组系列博客学习由 安信可科技 - 官方博客 技术分享,如有疑问请留言或联系邮箱. [安信可LoRa模组专题①]安信可LoRa快速入门指南 [安信可LoRa模组专题②]快速搭建远程控制灯Lo ...

  3. 微信小程序控制onenet智能灯

    文章目录 前言 1.理论基础 2.远程控制led 2.1 实验材料 2.2 实验步骤 3.配置微信小程序 3.1理论基础 3.2 实验步骤 3.2.1 找到对应的api文档 3.2.2 撸微信小程序代 ...

  4. 许久未更新,记录下普通灯改造智能灯

    改造计划 前期准备 所需材料 一个5v供电的台灯 一块esp32开发板 杜邦线 电烙铁及剥线设备 预实施方案 通过点灯科技开源平台,使用arduino编译器进行软件测试. 预计开发周期4小时.准备时间 ...

  5. 【毕业设计】基于ZigBee的智能灯控系统 -物联网 单片机 stm32

    文章目录 1 简介 2 系统结构 系统功能 相关器件 Zigbee芯片 CC2530 LED发光二极管 人体红外感应模块 光敏电阻传感器 3 实现效果 5 相关部分代码 6 最后 1 简介 Hi,大家 ...

  6. 智能灯控(基于ZigBee)

    时间:2017年12月 阶段:大二上学期 背景:单片机原理与应用课设 名称:智能灯控 摘要 本系统实现了多方式控灯功能,有按键控灯.串口指令控灯.点对点无线射频控灯.AI模式控灯.其中AI模式控灯是通 ...

  7. 蓝牙模块智能灯控应用方案

    当今是信息高速发展的时代,经济.文化的流行与传播都离不开信息.信息的传递直接影响着人们生活的方方面面,信息的传递方式又各有不同,如有线传输.无线传输等:而无线传输还可按协议不同分为:蓝牙.WIFI.z ...

  8. 蓝牙MESH网关_智能蓝牙Mesh灯控,让你一机掌控亮与暗

    随着物联网在人们日常生活中的广泛应用和日益成熟,智能家居已然呈星星之火之势,智能照明作为智能家居的重要组成部分,现在市场上的智能照明产品也随处可见,如智能LED灯.而对于智能LED灯来说,一套好的智能 ...

  9. 智能蓝牙Mesh灯控,让你一机掌控亮与暗

    随着物联网在人们日常生活中的广泛应用和日益成熟,智能家居已然呈星星之火之势,智能照明作为智能家居的重要组成部分,现在市场上的智能照明产品也随处可见,如智能LED灯.而对于智能LED灯来说,一套好的智能 ...

最新文章

  1. Google148亿元收购Fitbit,抢占苹果、三星可穿戴设备市场地盘
  2. bootsrap Glyphicons 字体图标
  3. 2014届华为校园招聘机试题2
  4. linux格式化ext4分区工具,linux学习笔记-磁盘分区、格式化与挂载
  5. 【AI视野·今日NLP 自然语言处理论文速览 第十一期】Mon, 21 Jun 2021
  6. 字符串的相关方法 2101 0310
  7. hdu 3037 Lucas定理
  8. Redis解决秒杀中的超卖问题
  9. 美团将主办 ICDAR2019「中文门脸招牌文字识别」比赛,并公开首个真实场景招牌图像数据集...
  10. 苹果公司首次公布iOS 13和iPadOS 13安装量 都有一颗尝鲜的心
  11. C语言预定义宏的使用
  12. 【Daily Scrum】
  13. 课下测试ch17ch18
  14. 简单 fibonacci 函数
  15. 读书笔记--对象、实例、原型、继承 1
  16. 决策树的实现及可视化方法总结
  17. java中正则验证邮箱手机格式
  18. 转载[UGUI]深入理解Canvas Scaler
  19. 简单的微信使用技巧,你需要掌握的技巧
  20. iOS-使用CoreLocation定位

热门文章

  1. iDigital2019数字营销广告主峰会
  2. android 5.1 截屏开发,mate7升级安卓5.1后怎么没有指关节截屏?
  3. 挑战程序设计竞赛(第二章习题总结)
  4. OpenStack Stein版搭建详解
  5. 服务器c盘有个inetpub文件夹,? 东芝笔记本c40a如何删除c盘的inetpub文件夹?[多图]...
  6. Python错误 TypeError: ‘NoneType‘ object is not subscriptable解决方案汇总
  7. 小米3要启动android,小米3自动开关机实现的详细设置教程(图文)
  8. 基于Search Guard的Elasticsearch安全认证和授权配置
  9. php正则教程,PHP 正则表达式
  10. 名字空间的妙处~~~