repo 1.12.4 gpg key 错误

自从repo升级到 1.12.4后,repo init的时候就一直报错:

repo 1.12.4

gpg: Signature made Wed Oct  2 00:44:27 2013 CST using RSA key ID 692B382C
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.12.4'

查了半天原来是android doc没有更新,解决方法是不要使用

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

下载的repo,使用下面的网址即可:

curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

Android Activity布局(layout)介绍

LinearLayout

LinearLayout——线性布局,顾名思义,LinearLayout中的组件按照线性排列,每一个组件都位于前一个组件的后面。LinearLayout又可以分为水平线性布局和垂直线性布局。

垂直线性布局

在垂直线性布局中,组件从上至下依次排列。可以使用android:layout_weight属性来控制组件占据空间的比例:当layout_width或layout_height设置为0dp的时候,数值越高占据的比例越大;当layout_width或layout_height设置为match_parent时,数值越高占据的比例越小。

alt none

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="TextView 1" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView 2" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView 3" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="TextView 4" />

水平线性布局

水平线性布局中的组件按照水平方向平铺排列,组件所占空间的比例跟layout_weight的值成正比。

alt none

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TV 1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="TV 2" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TV 3" />

&lt/LinearLayout>

RelativeLayout

RelativeLayout——相对布局。在相对布局中,组件的位置关系是相对的,我们可以用下面的几个属性来控制组件之间的相对关系:

属性名 相对位置
layout_toLeftOf 位于指定组件的左侧
layout_toRightOf 位于指定组件的右侧
layout_above 位于指定组件的上方
layout_below 位于指定组件的下方
layout_alignParentLeft 与父组件左对齐
layout_alignParentRight 与父组件右对齐
layout_alignParentTop 与父组件上对齐
layout_alignParentBottom 与父组件下对齐
layout_centerInParent 与父组件居中对齐
layout_centerHorizontal 垂直居中
layout_centerVertica 水平居中

alt none

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <Button
        android:id="@+id/tv1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#ff00ffff"
        android:gravity="center"
        android:text="1" />

    <Button
        android:id="@+id/tv2"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_below="@+id/tv1"
        android:background="#ffffff00"
        android:gravity="center"
        android:text="2" />

    <Button
        android:id="@+id/tv3"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_below="@+id/tv2"
        android:background="#ffff00ff"
        android:gravity="center"
        android:text="3" />

    <Button
        android:id="@+id/tv4"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_below="@+id/tv2"
        android:layout_toRightOf="@+id/tv3"
        android:background="#ffff0000"
        android:gravity="center"
        android:text="4" />

</RelativeLayout>

FrameLayout

FrameLayout——帧布局。帧布局中的所有组件都放在布局的左上角,所有组件会层叠在一起。下面的例子展示的是一个相机应用,这个应用的布局中有一个按钮和一个文本框飘浮在一个SurfaceView之上,这样我们既可以做到全屏预览相机画面,又可以把拍照按钮和一些信息显示在预览画面之上。

alt none

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/FL"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <SurfaceView
            android:id="@+id/CV"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

        <LinearLayout
            android:id="@+id/LL"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/TV"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="10"
                android:textSize="100dip" />

            <Button
                android:id="@+id/BT"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Take Picture" />
        </LinearLayout>
    </FrameLayout>

</LinearLayout>

Android Use Camera 之捕捉图像并修改图像属性

git clone https://github.com/lnmcc/CameraExample.git

下面的例子将展示如何通过Camera Intent捕捉图像并修改图像属性的方法。

activity_main.xml

alt none

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    tools:context=".MainActivity" >

	<ImageView
	    android:id="@+id/imgView"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content" />

	<TextView
	    android:id="@+id/TitleTV"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="Title" />

	<EditText
            android:id="@+id/TitleET"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content" />

	<TextView 
            android:id="@+id/DescriptionTV"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="Description" />

	<EditText
            android:id="@+id/DescriptionET" 
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content" />

	<Button
	    android:id="@+id/TakePictureBT"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="Take Picture" />

	<Button
	    android:id="@+id/SaveDataBT"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="Save Data" />

</LinearLayout>

MainActivity.java

public class MainActivity extends Activity  {

        //标记一个Request,后面onActivityResult将检查这个标记来确认是由本activity发出的request
        static final int CAMERA_REQUEST = 1; 
        static final String TAG = "MainActivity";

	Uri imageFileUri;
	ImageView imgView;
	Button takePictureBT;
	Button saveDataBT;
	TextView titleTV;
	TextView descriptionTV;
	EditText titleET;
	EditText descriptionET;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		imgView = (ImageView)findViewById(R.id.imgView);
		takePictureBT = (Button)findViewById(R.id.TakePictureBT);
		saveDataBT = (Button)findViewById(R.id.SaveDataBT);
		titleTV = (TextView)findViewById(R.id.TitleTV);
		descriptionTV  = (TextView)findViewById(R.id.DescriptionTV);
		titleET = (EditText)findViewById(R.id.TitleET);
		descriptionET = (EditText)findViewById(R.id.DescriptionET);

		//View.GONE跟*View.INVISIBLE的区别在于前者隐藏控件并且不占用布局空间
		imgView.setVisibility(View.GONE);
		saveDataBT.setVisibility(View.GONE);
		titleTV.setVisibility(View.GONE);
		descriptionTV.setVisibility(View.GONE);
		titleET.setVisibility(View.GONE);
		descriptionET.setVisibility(View.GONE);

		takePictureBT.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
                                //获取内容提供器,并插入一个空图像,这里还传入了一个空的图像属性ContentValues以方 
                                //便后面我们手动更改图像属性。insert()将返回图像的uri。                       
				imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());
                                //通过Intent调用系统Camera应用。
				Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
				i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
				startActivityForResult(i, CAMERA_REQUEST);
			}
		});

		//当点击saveData按钮后,读取TextView中的信息并更新到图像属性中。
		saveDataBT.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				ContentValues contentValues = new ContentValues(3);
                                //修改图像名称
				contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, titleET.getText().toString());
                                //修改图像描述
				contentValues.put(MediaStore.Images.Media.DESCRIPTION, descriptionET.getText().toString());
                                //通过内容提供器更新图像属性,返回被更新的行数。
				int upRows = getContentResolver().update(imageFileUri, contentValues, null, null);
				Toast.makeText(MainActivity.this, "Record Updated" + Integer.valueOf(upRows).toString(), Toast.LENGTH_SHORT).show();

				takePictureBT.setVisibility(View.VISIBLE);
				imgView.setVisibility(View.GONE);
				saveDataBT.setVisibility(View.GONE);
				titleTV.setVisibility(View.GONE);
				descriptionTV.setVisibility(View.GONE);
				titleET.setVisibility(View.GONE);
				descriptionET.setVisibility(View.GONE);
			}
		});
	}

        //startActivityForResult()调用Camera Intent,当Camera Intent完成任务后返回到MainActivity的时候会调用这个方法 
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

                //首先检查一下这个Camera Intent是否是由MainActivity请求的 
                //然后检查一下Camera Intent 是否执行成功                 
		if(requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
			takePictureBT.setVisibility(View.GONE);
			saveDataBT.setVisibility(View.VISIBLE);
			imgView.setVisibility(View.VISIBLE);
			titleTV.setVisibility(View.VISIBLE);
			descriptionTV.setVisibility(View.VISIBLE);
			descriptionET.setVisibility(View.VISIBLE);
			titleET.setVisibility(View.VISIBLE);

                        //图像的显示区域大小
			int dw = 200;
			int dh = 200;

			try {
				BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();

                                //inJustDecodeBound=true指示BitmapFactory只计算图像的大小,不要做真正的解码
				bmpFactoryOptions.inJustDecodeBounds = true;

				Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri),
						null, bmpFactoryOptions);

                                //计算实际图像和显示区域的缩放比率
				int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight / (float)dh);
				int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth / (float)dw);

				if(heightRatio > 1 && widthRatio > 1) {
					if(heightRatio > widthRatio) {

                                                //inSampleSize指示BitmapFactory对图像进行缩放
                                                //比如inSampleSize=2,则图片将被缩小到1/2
						bmpFactoryOptions.inSampleSize = heightRatio;
					} else {
						bmpFactoryOptions.inSampleSize = widthRatio;
					}
				}

                                //inJustDecodeBound=fase指示BitmapFactory开始真正的图像解码
				bmpFactoryOptions.inJustDecodeBounds = false;
				bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri),
						null, bmpFactoryOptions);

                                //在ImageView控件中显示图像
				imgView.setImageBitmap(bmp);
			} catch(FileNotFoundException e) {
				Log.v(TAG, e.toString());
			}
		}
	}
}

查看系统image数据库确认图像属性被更新

$ sqlite3 /data/data/com.android.providers.media/databases/external-ae126518.db
$ sqlite> . mode columns
$ sqlite> . header on
$ sqlite> select * from images;

返回数据:

139  /mnt/sdcard/DCIM/Camera/1380476346865.jpg  0  keyboard  image/jpeg  1380476346865                1380476346  1380476346     apple keyboard    1506676782  Camera

这里我把Title设置成keyboard,Description设置成apple keyboard

完成后的效果

alt none alt none alt none

MacOS 利用WIFI共享网络

MAC OS : 10.7.5

应用情景: 华为3G网卡负责外网,利用本机的wifi为其他设备提供共享网络。

  • 打开系统 System Preferences界面,找到Sharingalt none
  • Sharing配置界面左侧选择Internet Sharing,只选中,不要打勾。在界面右侧的”Share your connection from”的下拉菜单中选择你需要共享的外网连接(我这里是HUAWEIMobile),然后在”To computers using:”下拉菜单中选择你用来发送共享网络的设备(我这里是Wi-Fi) alt none
  • 在左侧栏的”Internet Sharing”复选框中打勾,弹出下面的对话框后点击”Start” alt none
  • 完成后的状态 alt none

让人目瞪口呆的三位世界级电脑大师

公元1998年

在我读高二那年,那还是我用Windows 98的时候有次我系统崩溃了, 因为我那时还是个电脑白痴,我同学帮我介绍了一个电脑高手来帮我修电脑。

他看了一下电脑,问我有没有Windows 98 的光盘?我说没有。

他想了一下,叫我把家里电话拿给他,我心里想说修电脑要电话干什么? 但人家是电脑高手,我也不好意思说什么,就把电话拔下来给他了。

他把电话线空着的一头接在主机版的一个插孔内,然后进入了 DOS, 然后就开始在电话上不停的按着键,他按键的速度非常快,但是他都只按电话的0,1两个键。 我搞不懂这有什么用? 但也不敢问,看了半个多小时,他还是不停的按这两个键。

我渐渐的有些困,我问他这东西要搞多久? 他说还要几个小时,我给他倒了杯咖啡,就一个人去隔壁书房睡觉了。

醒来的时候,一看已经过了5个多小时,我起身到隔壁,看见他正在 Windows 98 里面调试。 过了一会儿,他说,你试试,我坐上椅子用了一下,真的好了。

我当时也不懂电脑,谢过人家就走了。

后来我慢慢对电脑有了一些概念才了解到, 原来当时那位电脑高手是使用机器语言编了一个Windows 98系统从我给他的电话直接输入到硬盘。

我后来问我同学那位高手的下落,我同学说前几年去了美国之后,杳无音讯….

公元2000年

在我读大一那年,那还是我用Windows Me的时候有次我系统崩溃了, 因为我那时还是个电脑入门,我朋友帮我介绍了一个电脑高手来帮我修电脑。

他看了一下电脑,问我有没有Windows Me 的安装盘?我说没有。 他想了一下,叫我把一张空的DVD刻录盘和一根奈米细针拿给他,

我心里想说修电脑要刻录盘和奈米细针干什么?但人家是电脑高手,我也不好意思说什么。 於是我就把DVD刻录盘拿一张来给他了。 他把奈米细针头对着刻录盘戳,他戳的速度非常快,但是只戳深或浅。

我搞不懂这有什么用?但也不敢问,看了半个多小时,他还是不停的戳着DVD刻录盘。

我渐渐的有些困,我问他这东西要搞多久?他说要几个小时,我给他倒了杯葡萄酒, 就一个人去隔壁客厅沙发上睡觉了。

醒来的时候,一看已经过了6个多小时,我起身到隔壁,看见他正在 Windows Me 里面调试, 还装上了 Office、Photoshop、迅雷、魔兽世界等软件……过了一会儿他说, 你试试,我坐上椅子用了一下,真的好了。

我当时也不懂电脑,谢过人家就走了。

后来我慢慢对电脑有了一些基础,终于明白了,原来当时那位电脑高手是用奈米细针头刻了一个单面双层的DVD , 在里面刻上了Windows Me、Office、 Photoshop、魔兽世界的安装程序。

我后来问我朋友那位高手的下落,我朋友说前几年去了法国之后,杳无音讯….

公元2001年

在我读大二那年,那还是我用Windows XP的时候有次我不小心把D盘格式化了, 因为我那时还是个电脑新手,我亲戚帮我介绍了一个电脑高手来帮我的电脑D盘恢复数据。

他看了一下电脑,问我有没有Windows XP备份过的Ghost? 我说没有。

他想了一下, 叫我把一块奈米强力磁铁棒拿给他,还问我D盘里有什么东西? 我心里想说修电脑要奈米强力磁铁棒干什么? 但人家是电脑高手,我也不好意思说什么,就把奈米强力磁铁棒给他了, 还告诉他我的D盘里面全是火影忍者的动画。

他把整颗硬盘拆了,用奈米强力磁铁棒在盘子上面画圈圈,他画圈圈的速度非常快, 但是他的奈米强力磁铁棒好像有碰到又好像没有碰到,我搞不懂这有什么用?但也不敢问。

看了半个多小时,他还是不停的在硬盘上画着圈,我渐渐的有些困, 我问他这东西要搞多久?他说要几个小时,我给他倒了杯蘇格蘭威士忌, 就一个人去隔壁房间睡觉了。

醒来的时候,一看已经过了7个多小时,我起身到隔壁,看见他正在D盘里面调试, 里面全是火影忍者的动画片,过了一会儿,他说, 你试试,我坐上椅子用了一下,真的好了。

我当时也不懂电脑,谢过人家就走了。

后来我慢慢对电脑有了一些体会,终于体悟到,原来当时那位电脑高手是用奈米强力磁铁棒直接在硬盘上写数据,他凭着惊人的记忆力将他曾经看过的火影忍者动画片数据都写入了硬盘。

我后来问我亲戚那位电脑高手的下落,我亲戚说他前几年去了英国之后,杳无音讯….