LapseIt 延时摄影

去年有慢动作镜头,今年有延时摄影。

给我一个阳台,一个排插一个wifi,我要坐一下午。

基于CodeIgniter框架Restful风格API的Auth验证

服务端开始准备改造成Restuful风格API.
旧版本采用if else对请求判断分发的机制太丑陋,
选用了CodeIgniter框架。

使用插件:
https://github.com/chriskacerguis/codeigniter-restserver

因为使用了CodeIgniter的SAE版本,避免配置破坏,所以只复制插件目录下的三个文件。

config/rest.php
libraries/Format.php
libraries/Rest_Controller.php

根据官方示例编码自己的RestController。

修改Auth配置

使用Digest认证
http://zh.wikipedia.org/wiki/HTTP摘要认证

1
2
3
4
5
$config['rest_realm'] = 'REST API'; //定义realm用于加密
$config['rest_auth'] = 'digest'; //切换auth规则方案为digest
$config['auth_source'] = 'library'; //切换验证方案为自定义验证
$config['auth_library_class'] = 'auth'; //定义用于执行验证的类名
$config['auth_library_function'] = 'login'; //定义用于验证的方法明

配置完参数后,该框架讲使用libraries文件夹下面的auth类名,通过login方法进行验证请求是否有效。
login方法必须含有两个参数
并且在digest认证下,必须返回md5(username:realm:password)组合后的字符串,框架会自行对请求中的参数头进行验证是否与该串一致。
例如如下代码将通过用户名admin与密码1234的用户通过验证。

<?php
class auth
{
    public function login($username, $password)
    {
        return md5('admin' . ':' . "REST API" . ":1234");
    }
}

如果使用Basic认证,只需要将rest_auth配置切换成basic并且在login中返回true、false对应成功与失败即可。

使用Attribute使得界面可配置

由于项目的版本越来越多,分支越来越多,不同的版本可能在界面上需要使用不同的图标,不同的背景,不同的界面元素高度。
为了实现界面的可配置化,需要在子工程中定义一套方案,使得主工程中对这些界面元素可配置。

具体步骤如下:
定义Lib主题的attr

1
<attr name="libTheme" format="reference" />

Lib中使用libTheme指定的style

1
2
3
4
5
6
7
protected void onCreate(Bundle savedInstanceState) {
TypedArray typedArray = getTheme().obtainStyledAttributes(
getThemeId(this), new int[]{R.attr.libTheme});
setTheme(typedArray.getResourceId(0, 0));
typedArray.recycle();
super.onCreate(savedInstanceState);
}

Read More...

Android Studio 利用 Gradle 部署AAR

配置build.gradle

apply plugin: 'maven'
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://192.168.1.30:8081/nexus/content/repositories/snapshots"){
                authentication(userName: mavenUser, password: mavenPass)
            }
            pom.version = "1.0.0-SNAPSHOT"
            pom.artifactId = "utillibrary"
            pom.groupId = "com.nd.android.u.lib"
        }
    }
}

gradle同步后Gradle视图中新增uploadArchives任务

打开Gradle视图双击该任务

代码中mavenUser可在Gradle主目录中新增gradle.properties配置
mavenUser = xxxx
mavenPass = xxx

MultiDex 手动指定 maindexlist

https://developer.android.com/tools/building/multidex.html

官方在build tool 21.1.0后正式推出分包打包解决方法数量超标65535问题。

dex分包原理:

http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

原理既在编译期将dex分散在多个中,运行期,解压出其他dex并让classloader尝试加载

主要步骤:

增加依赖

compile 'com.android.support:multidex:1.0.0'

配置开关

defaultConfig {
    multiDexEnabled true
}

相比在该版本推出前,打包过程多了几个步骤,

Read More...

Android UI Tips Log

积累更为高效的Android编码习惯。

  • 9图编辑必须做全,如只做左侧不做上册是不标准的,最新BuildTool将无法支持该类型图片
  • PullToRefresh过时,慎用(扩展性差,定制的ROM有弹性效果易产生冲突)
  • ActionBarPullToRefresh过时,慎用(ActionBar只有一个,界面内可能有多个Page需要进度)
    使用SwipeRefreshLayout,Support包,已支持Material Design风格
    SwipeRefreshLayout
  • 2.x 4.x 5.x风格
    Android版本不断更新的情况下,风格是不断变化的
    2.x 风格大乱斗
    4.x Holo风格
    5.x Material Design风格
    Dialog风格不一致
    解决方案:各主题使用style、style-v14、style-v21做适配

    Read More...

Gradle 多版本打包手记

  1. 利用默认的目录结构无需配置不同版本的工程目录结构
    只需在src\main的同级目录下新建渠道名称

  2. 依赖的模块在构建时如果存在多版本,应该指明使用什么版本或者模块里头配置defaultPublishConfig属性

方案一:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
    flavorOneCompile project(path: ':testmoduleone', configuration: 'flavorOneDebug')
//    flavorOneCompile project(path: ':testmoduleone', configuration: 'flavorOneRelease')
    flavorTwoCompile project(path: ':testmoduleone', configuration: 'flavorTwoDebug')
}

方案二:

android {
    defaultPublishConfig "flavorOneDebug"
}

运行阶段在Build Variant窗口进行选择运行何种版本

Read More...

解决libpng warning

新版本Build Tool在编译旧项目时出现

libpng warning: iCCP: Not recognizing known sRGB profile that has been edited

警告。

解决方法:

安装ImageMagick,并将安装路劲配置到系统环境变量
http://www.imagemagick.org/script/binary-releases.php#windows
新建后缀名为.ps1的PowerShell脚本

Get-ChildItem . *.png -Recurse| ForEach-Object -Process{
    if($_ -is [System.IO.FileInfo]){
       convert $_.FullName -strip $_.FullName;
       Write-Host($_.FullName);
    }
}

保存到工程目录,右键点击脚本文件使用PowerShell运行
等待完成。
如果脚本无法运行,在PowerShell中使用set-executionpolicy remotesigned设置成允许未签名脚本执行
PowerShell签名策略:

help about_signing