Step One 在android 的sdk中下载 google API
      注: 在android中maps功能,非google的标准api,google把API放到了自己的库里面,在开发sdk之前,先要下载开发应用,对于API版本的的Google API。
      下载步骤:打开 android JDK 中的SDK Manager.exe –>选择 Available packages ,并在右边显示 Instances available for download–> 选择 third party Add-ons,–>选择第一项 google Inc。–>显示清单后,选择并下载android API。
      注:有部分老版本的 android sdk 下载不了google api ,主要原因是安装路径带空格,需要重新安装 android sdk ,且安装路径中不要包含空格。
      Step Two 在google 上注册,并获取地图开发的API键
      如果在应用程序中,使用map功能,需要到google网站: http://code.google.com/intl/zh-CN/android/maps-api-signup.html ,上获取API
      生成API的规则是获取软件证书的MD5值,在注册界面上,输入MD5 值,生成开发API(注:一个证书对于一个api)
      Step Three 如何获取生产软件证书的MD5值
       [1] keystore文件,调试的keystore 在C:\Users\<机器名>\.android\ debug.keystore
      [2] 使用java中的keytool.exe,获取MD5
keytool.exe 路径:C:\Program Files\Java\jre6\bin\keytool.exe
cmd命令: keytool -list -keystore <证书路径>
下面是实际调用示例:keytool -list -keystore debug.keystore
      Step four 创建基于google API的项目,创建项目时,选择对于的 android SDk版本的google API版本
      总结,在模拟器上运行的时候发现打开就崩溃了,结果查到原因是权限申明问题:,等到了M9上运行时,死活都是“解析包时出现问题”,搜索了好久没有反应,我怀疑是版本问题,跟test应用比较发现,改为8后解决问题。

      自从那天学会写java以后,这段时间就有点不得了了,不想写python,php也冷落了,看见需求心情急躁,不想跟他们解释这个到底是个什么原因,要怎么处理。
      上周3左右eas就写完了,但还有一些lib不是很全,比如db的oracle模块等,只说一下封装的一些模块吧,有人说我没必要2次封装,但只有节约代码达到80%以上的模块我才会封装,到目前共封了:FileX(读写文件)、Function(提供公共函数)、Logging(操作日志)、Mail(发送邮件)、Mysql(数据库查询)、Service(服务启动停止模块)、UrlClient(curl操作模块)、XmlConfig(快速读到一个字段或属性)、XmlUtil(通过xpath获取节点);除此还有EasI接口模块,Config读取eas配置模块;当然还有eas主执行脚本server.java。
      放了三天假,感觉不写点啥有点对不起这么有意义的日子(教师节+911+中秋节),所以今天就研究了一下android的语音识别,虽然我不确定google的语音识别能支持中文,但能支持英语也好,至少没有瞎折腾时间。期望很好,结果很悲催,google了一下午也没有点紧张,总是提示No Activity found to handle Intent {act=android.speed.action.RECOGNIZE_SPEECH},我以为是模拟器没有设备支持,打包到我手机,发现问题依然,在meizu论坛发了个贴等解答http://bbs.meizu.com/thread-2834659-1-1.html。
      以前开发的时候发现模拟器超出了桌面范围,修改一下avd的skin中设置为HVGA就刚刚好,然后就是打包发布文件,可以用eclipse自带的工具,http://www.sunchis.com/html/android/devolop/2011/0407/302.html这篇文章写得非常详细,我就不啰嗦了。虽然折腾半天无果,但还是贴贴我辛勤的代码:

package com.axx.TestAndroid;
import java.util.ArrayList;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
public class TestVoice  extends Activity{
    private static int VOICE_RECOGNITION_CODE = 4321;
    private ListView mlist;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mlist = (ListView)findViewById(R.id.listview3);
        Button butt = (Button)findViewById(R.id.button3);
        butt.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                try{
                    //通过Intent传递语音识别的模式,开启语音
                    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                    //语音模式和自由形式语音识别
                    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                    //提示音开始
                    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");
                    //开始执行Intent,语音识别
                    startActivityForResult(intent, VOICE_RECOGNITION_CODE);
                }catch (ActivityNotFoundException e) { //没有找到语音设备
                    Log.d("test", e.getMessage());
                    Toast.makeText(TestVoice.this, e.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        //判断是否可以执行语音识别
        if(resultCode==VOICE_RECOGNITION_CODE && resultCode==RESULT_OK){
            //获取语音字符
            ArrayList results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            //显示获取到的结果
            String str = "";
            for(int i=0; i
            
12 / 09 / 2011 buling

      明天要上班了,今天写点日志记录一下。首先,博客换主题了,修正了一下宽度,比较得意的是logo图片和favicon.ico图标。
      上周主要忙于学习写java代码,其实现在学习一门语言很快,因为google太厉害了。然后海涛接了sina app的开发放我们组,他觉得很有意思,我也感觉,只有使用过别人的app才能感觉到app的一般设计模式,sina自身把oauth封装的很好,以至于写一个接口最多不会超过3行代码:1、定义函数,2、参数数组,3、请求返回。
      除此有点点可以提的就是图片写字,需要把大家测试的结构分享给用户,所以我也封了一个类,还算比较好用,先来调用方法:

$bg_img = $_SERVER['Root_Path'].'/html/bg.jpg'; //背景图片
$new_img = $_SERVER['Root_Path'].'/html/new.jpg'; //生成的新图
$img = new SinaApp_Image($bg_img); //实例一个处理对象
$msg_info = array('size'=>12, 'x'=>152, 'y'=>20, 'msg'=>'你中奖了', //文字信息
          'font'=>$_SERVER['Root_Path'].'/inc/SIMSUN.TTC', 'color'=>'#FF0000');
$res = $img->new_img($new_img, array($msg_info)); //生成图片

      命名很人性,应该不会有阅读障碍,就不说明了,如果要写多行字,可以放多个msg_info就可以了。因为sina没有提供获取某应用发出的微博,所以只能依靠话题勉强实现,跟上面提的一样3行代码就不提了。
      这三天没干啥,昨天就折腾了一天主题,到下午的时候,tomato_ma给我介绍了一个网站的活,我发现自己潜意识不想出卖代码,刚开始谈的时候那哥们说,钱多的是,就是不知道往哪儿烧了,结果我提价5k,那哥们承受不起了,最终么有成交,难道在他们眼里代码那么廉价?之前也有一个项目也是,那个提价就更高,sorry,不想太累,不想对未来失去希望。
      最后奉上这个SinaApp_Image类分享给大家(备注一下,文字字体可选)。

/**
 * 图片处理类
 * @author tuyl
 *
 */
class SinaApp_Image{
    public $img_info = array();
    public $img_conf = array();
    public $img_path = '';
    public $err_msg = '';
    /**
     * 构造函数
     * @param string $img_path 背景图片地址
     */
    public function __construct($img_path){
        $this->img_conf = array(1=>'gif', 2=>'jpeg', 3=>'png', 4=>'swf', 5=>'psd',
                  6=>'bmp', 9=>'jpc', 10=>'jp2', 11=>'jpx', 12=>'jb2',
                  13=>'swc', 14=>'iff', 15=>'wbmp', 16=>'xbm');
        $this->img_path = $img_path;
        $this->img_info = @getimagesize($img_path);
    }
    /**
     * 新建一张图片
     * @param strint $new_img 新图片地址
     * @param array $msg_arr 文字数组 $arr = array('size'=>12, 'x'=>152, 'y'=>20, 'msg'=>'msg',
		     'font'=>'inc/SIMSUN.TTC', 'color'=>'#FF0000');
     * @param int $width 新图宽,默认为背景图宽
     * @param int $height 新图高,默认为背景图高
     */
    public function new_img($new_img, $msg_arr=array(), $width=null, $height=null){
        if(!$this->img_info){
            $this->err_msg = '文件['.$this->img_path.']不是一张合法图片';
            return false;
        }
        $width = $width ? $width : $this->img_info[0];
        $height = $height ? $height : $this->img_info[1];
        $nimg=imagecreatetruecolor($width, $height);
        $img_type = $this->img_conf[$this->img_info[2]];
        $cfunc = 'imagecreatefrom'.$img_type;
        if(!function_exists($cfunc)){
            $this->err_msg = '不支持创建['.$this->img_info[2].']类型图片';
            return false;
        }
        $im = $cfunc($this->img_path);
        imagecopy($nimg, $im, 0, 0, 0, 0, $width, $height);
        foreach ($msg_arr as $k=>$v) {
            $cor = str_split(str_replace('#', '', $v['color']), 2);
            $color = imagecolorallocate ($nimg, hexdec('0x'.$cor[0]), hexdec('0x'.$cor[1]), hexdec('0x'.$cor[2]));
            if(isset($v['font'])){ //有字体要求
                imagefttext($nimg, $v['size'], 0, $v['x'], $v['y'], $color, $v['font'], $v['msg']);
            }else{
                imagestring($nimg, $v['size'], $v['x'], $v['y'], $v['msg'], $color);
            }
        }
        $new_fun = 'image'.$img_type;
        $res = $new_fun($nimg, $new_img);
        imagedestroy($im); imagedestroy($nimg);
        return $res;
    }
    public function get_err_msg(){
        return $this->err_msg;
    }
}