LEHome 智能家居开源方案 Android客户端

LEHome 是一套完整的开源智能家居方案。LEHome拥有以下特性:

  • 简单的控制命令编程
  • ibeacon室内定位
  • 高度模块设计
  • 红外控制、开关控制、传感器采集
  • android,web app,微信版客户端

项目地址:https://github.com/legendmohe/LEHome

本文主要介绍该方案的Android客户端

界面

主要界面有:

  1. 主界面,采用对话形式向服务端发送命令。
    主界面

  2. 收藏界面,主要是为了更方便地输入一些自定义的命令(message)。
    收藏

  3. 设置界面。
    设置1
    设置2

  4. 语音输入界面。
    语音输入

功能

  1. 基本功能

    1. 发送命令
      在输入框中输入命令,点击回车即可发送至服务器(连接正常情况下)。

    2. 语音发送命令
      切换至语音模式后,可用语音输入命令(使用百度语音,使用方法类似微信)。

    3. 设置参数
      设置一系列基本参数和增强功能的参数。

    4. 收藏命令语句
      可以添加删除一些自定义的语句。这些语句会出现在智能提示中。

  2. 增强功能

    1. 智能命令提示
      类似于IDE的智能提示,以列表形式提示下一个合法的命令有哪些。
      当输入字符>1个时,输入框左侧弹出智能提示(或补全)按钮,此时上划按钮看上一个提示,下划看下一个提示,左划弹出所有提示的列表。
      智能提示的类型有:补全当前命令、下一个合法的命令、日期、时间和收藏的命令语句。
      注意,使用此功能需要在设置菜单中下载补全数据。
      智能补全
      智能补全列表

    2. 本地、远程服务自动切换
      启用了此功能后,当手机处于跟服务器同一局域网时,会自动切换至本地模式。本地模式是指命令的发送和接受无需通过云端转发,直接在局域网内进行。

    3. 自动连接蓝牙麦克风
      启用了此功能后,当连接蓝牙耳机时,语音输入源路由至耳机麦克风端。

项目地址

https://github.com/legendmohe/LEHomeMobile_android

[翻译]Android如何匹配最佳的Resource?

原文节选How Android Finds the Best-matching Resource

当你请求使用一个非默认Resource时,Android会根据当前设备的配置,在运行时对Resource进行选择。为了阐明Android是如何进行这个操作的,假设有如下几个drawable目录,每个目录下放置了相同的图片:

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

假设设备的配置如下所示:

Locale = en-GB
Screen orientation = port
Screen pixel density = hdpi
Touchscreen type = notouch
Primary text input method = 12key

通过对比设备的配置和可用的Resource文件,Android最终选用了drawable-en-port文件夹下的drawables资源。

系统根据以下步骤来选用Resource文件:

1. 排除掉与设备配置不符的Resource文件。

drawable-fr-rCA/被排除了,因为它与设备配置矛盾。

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

例外:分辨率是唯一一个不进行排除的项目。因为就算当前设备的分辨率是hdpi,drawable-port-ldpi/也不会被排除,因为这个资源可以匹配每一个分辨率的设备(低分辨率文件可在高分辨率设备下使用)。详情请参考文档Supporting Multiple Screens

2. 选取(下一个)最高权重的修饰符(从表格2中)(从MCC开始,往下取)。

表格见:AlternativeResources

3. 检查是否有Resource文件夹包含这个修饰符

如果没有,返回步骤2,使用下一个修饰符进行检查。(例子中,直到检查language修饰符之前结果都是“没有”)。

如果有,继续进行步骤4。

4. 排除掉不包含这个修饰符的Resource文件夹。例子中,系统排除掉所有不含language修饰符的文件夹:

drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

例外:如果当前修饰符是分辨率,那么Android会选用最符合设备真实分辨率的资源文件。一般来说,Android会偏向于增大原始文件而不是压缩它(即向低分辨率匹配)。详情参考文档Supporting Multiple Screens

5. 重复步骤2,3,4直到仅剩一个文件夹。在例子中,屏幕方向是下一个修饰符,没有指定屏幕方向的文件夹都被排除掉。

drawable-en/
drawable-en-port/
drawable-en-notouch-12key/

最终剩下文件夹:drawable-en-port/

虽然这个过程在每次请求资源文件的时候都会被执行,但系统在某种层面上对其进行了优化处理。其中一个就是一旦设备配置可知,系统会首先排除掉那些不可能匹配的资源。例如,如果指定语言为“en”,那么所有含有非‘en’语言修饰符的资源文件便不会参与上述匹配过程(虽然不含任何语言修饰符的资源仍然会被检索匹配)。

当根据分辨率这个修饰符选取资源文件时,若没有适配当前设备分辨率的文件夹,系统会选取更小一点的分辨率的资源文件夹(例如,一个large-size的设备在必要情况下会选取normal-size文件夹下的资源文件)。然而,如果当前可用的唯一资源文件夹比当前设备的屏幕规格要大,那么系统不会使用这个资源,而是直接crash(例如所有资源文件都含有xlarge修饰符,但是当前设备是一个normal-size screen设备)。

注意:修饰符的权重远比修饰符匹配的数量要重要。在例子中,进行到步骤4的时候,剩下的资源文件夹(drawable-en-notouch-12key/)匹配了3个修饰符,而drawable-en仅匹配了一个修饰符(language)。但由于language的权重比其余三个要高,所以drawable-en-notouch-12key/被排除了。

想知道更多关于Resource的知识,继续阅读文档Accessing Resources

python版qq音乐电台及android控制端

python版qq音乐电台

熬了几天夜,分析了qq电台的api,用python实现了基于http协议的qq音乐电台服务。代码共享到github上:

https://github.com/legendmohe/qqfm/

使用方式如下:

开启服务

注意,本项目依赖于 mplayer 和 tornado,要事先安装好。

随机下一首

如果要指定类别下随机下一首,则:

暂停

标记当前播放

获取类别列表

android控制端

代码同样地共享到 github:

https://github.com/legendmohe/QQFM_Android

该版本实现了上述接口的功能。不过代码和界面都比较粗糙。

收工!