学习了半个月的Android,一直都是在虚拟平台上调试,今天想在真实的机子里面跑跑自己写的程序与在虚拟平台上有什么不同,为了学习Android,自己可是特别的买了个Android的手机,华为的C8650,这个手机什么都好,就是只能用电信的东西不爽,而且也是由于这个问题,害我在Ubuntu里面配置真机开发环境的时候吃尽了苦头。
  按照Android developer网站上说的一样,在Linux环境下Android的真机调试不能想Windows 一样装个驱动什么的就得了,在Linux里需要建立一个.rules文件,告诉Linux在Android手机的USB插入电脑的时候执行的规则。具体步骤如下:

打开etc目录下的/etc/udev/rules.d文件夹,然后在这个文件夹中建立一个名为51-
android.rules的文件,使用命令:
sudo gedit 51-android.rules
打开文件,输入内容如下:
SUBSYSTEM=="usb",ATTR{idVendor}=="12d1",MODE="0666"
SUBSYSTEM=="usb",EVN{DEVTYPE}=="usb_device",MODE="0666"
  这里需要说明一下ATTR{idVendor}=="12d1",这里填入的12d1是因为我用的是华为的手机,在google的Android文档中华为的手机使用的就是12d1的代号。每个品牌的手机都有其特殊的代号,这个可以到google的网站去查询,或者在系用中使用lsusb命令,同样也可以看到手机对应的代号。配置完成后,使用命令来到SDK说在的文件夹,打开/platform-tools文件夹,分别执行如下的命令:
sudo ./adb kill-server
sudo ./adb start-server
sudo ./adb devices
按照道理来说,应该出现手机的型号信息了,可是,我的华为手机就是没有出现。查询了很多网友的帖子,都说的和上面的差不多,可是我的问题还是没有解决,尝试了所有找到的方法,可是就是死活不出现。
这时我想是不是手机设置的什么原因,于是搜索了一下华为C8650手机的一些信息,终于在一位网友的帖子中说道了C8650,原来加载不了不是我的rules文件的问题,而是C8650的问题。C8650是电信的定制机,也就是因为这样,华为弄出了一个自己的USB的链接方式,主要是为了可以实现电信的一些什么天翼的业务,所以在链接电脑的时候使用的不是google模式,而是华为默认的为电信开发的自己的Normal模式,而使用这种模式,Ubuntu却不认识天翼的那些鬼东西,所以也就是出现了为什么电脑明明可以看得到华为的手机了,但是在eclipse里面却怎么页看不见,出现的全是????????,解决这个问题的方法就是把手机USB的接入模式修改为google的模式即可,步骤如下:
1 使用电话拨打*#*#2846579#*#*
2 这时会出现一个菜单,选择projectMenu
3 接着选择后台设置
4 接着选择USB模式
5 选择Google模式
选择好后,重新启动机子,当再次链接Ubuntu时,手机自动的弹出了USB调试,在控制台中使用./adb devices 页可以看得到机子了,eclipse也可以部署程序到手机上运行了。

posted @ 2012-02-09 15:14 精灵化石 阅读(132) 评论(0) 编辑

Android 手机开发软件,因为不同区域人的使用需要一个国际化的过程。在Android手机开发中,国际话的非常的简单,主要还是在res的文件中下功夫。

    在android的项目文件中的res文件夹下,默认生成了软件在手机环境为任何情况下显示的文字鱼图片,而如果我们需要当用户修改了手机的语言环境下自动加载对应的语言的资源文件,只需要创建该语言对应的文件夹和文件即可,比如我们使用的文字,Android默认文字的资源存放在values文件的string.xml文件中,如果我们需要一个中文与英文的文字的资源文件,只需要在res文件夹中创建一个名为values-zh和values-en的文件夹,然后在文件夹中创建对应的string.xml文件即可。这样当用户手机的语言环境设定为中文时,Android会自动的加载res文件夹中values-zh文件夹中的string.xml文件,然后显示在手机上,其他的语言也是如此。

posted @ 2012-02-09 15:00 精灵化石 阅读(56) 评论(0) 编辑

Android 手机开发过程中,理解好Activity的生命周期以及某种状态执行那一个方法在开发中有着事半功倍的作用。Activity 的生命周期可以主要是从创建,暂停,挂起,销毁的过程,如下图:

下面通过一个音乐播放器的例子加深自己的记忆。

音乐播放器界面:

布局的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/filename" />
    
    <EditText 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="If I Let You Go.mp3"
        android:id="@+id/filename"
        />
    
    <LinearLayout 
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal" >
    	
    	<Button 
    	    android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/play"
    		android:id="@+id/play"
    	/>
    	
    	<Button 
    	    android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/pause"
    		android:id="@+id/pause"
    	/>
    	
    	<Button 
    	    android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/reset"
    		android:id="@+id/reset"
    	/>
    	
    	<Button 
    	    android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/stop"
    		android:id="@+id/stop"
    	/>
    </LinearLayout>

</LinearLayout>

 

首先,当我们运行音乐播放器时,activity被创建,代码如下:

private static final String TAG = "AudioPlayerActivity";
	//音乐文本框输入的值
	private EditText filenameText;
	//音乐播放器
	private MediaPlayer mediaPlayer;
	//音乐名称
	private String filename;
	//音乐播放位置
	private int position;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        filenameText = (EditText)this.findViewById(R.id.filename);
        mediaPlayer = new MediaPlayer();
        
        ButtonClickListener listener = new ButtonClickListener();
        Button play = (Button)this.findViewById(R.id.play);
        Button pause = (Button)this.findViewById(R.id.pause);
        Button reset = (Button)this.findViewById(R.id.reset);
        Button stop = (Button)this.findViewById(R.id.stop);
        
        play.setOnClickListener(listener);
        pause.setOnClickListener(listener);
        reset.setOnClickListener(listener);
        stop.setOnClickListener(listener);
    }

	/**
	 * 按钮单击方法
	 * @author wmh
	 *
	 */
	private final class ButtonClickListener implements View.OnClickListener{

		@Override
		public void onClick(View v) {
			Button button = (Button)v;
			filename = filenameText.getText().toString();
			try {
				switch (v.getId()) {
				case R.id.play:
					play();
					break;

				case R.id.pause:
					if(mediaPlayer.isPlaying()){
						mediaPlayer.pause();
						button.setText(R.string.continuePlay);
					}else{
						mediaPlayer.start();
						button.setTag(R.string.pause);
					}
					break;
				
				case R.id.reset:
					if(mediaPlayer.isPlaying()){
						mediaPlayer.seekTo(0);
					}else {
						play();
					}
					break;
				
				case R.id.stop:
					if(mediaPlayer.isPlaying()){
						mediaPlayer.stop();
					}
					break;
				}
			} catch(IOException e) {
				Log.e(TAG , e.toString());
			}
			
		}
    	
    }
	
	/**
	 * 音乐播放函数方法
	 * @throws IOException
	 */
	private void play() throws IOException {
		File audiofile = new File(Environment.getExternalStorageDirectory() , filename);
		mediaPlayer.reset();
		mediaPlayer.setDataSource(audiofile.getAbsolutePath());
		mediaPlayer.prepare();
		mediaPlayer.start();
	}

 

当手机在播放音乐的时候,手机有电话播入,这时,需要暂停音乐播放器,那么Activity此时就需要暂停了,那么就会执行Activity的onPause方法了,代码如下:

@Override
	protected void onPause() {
		super.onPause();
		if(mediaPlayer.isPlaying()){
			position = mediaPlayer.getCurrentPosition();
			mediaPlayer.stop();
		}
		
	}

 

当电话拨打结束后,重新开始播放音乐,此时Activity就被Resume了,执行的代码的如下:

 

@Override
	protected void onResume() {
		super.onResume();
		
		if(position > 0 && filename != null){
			try {
				play();
			} catch (IOException e) {
				Log.e(TAG, e.toString());
			}
			mediaPlayer.seekTo(position);
			position = 0;
		}
	}

 

 

当音乐播放器由于某种原因意外关闭了,Activity需要保存当前的状态,以便重新打开时可以使用结束时的状态,代码如下:

/**
	 * 当手机意外停止Activity时,保存当前播放音乐的状态
	 */
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putString("filename", filename);
		outState.putInt("position", position);
	}

/**
	 * 当手机内存不足强制关闭Activity时,重新执行Activity时恢复上次意外中断时的状态
	 */
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		
		this.filename = savedInstanceState.getString("filename");
		this.position = savedInstanceState.getInt("position");
		super.onRestoreInstanceState(savedInstanceState);
	}

 

这样,音乐播放器就完成了。

 

posted @ 2012-02-09 14:59 精灵化石 阅读(98) 评论(0) 编辑

最近在学习Android的开发知识。今天在看传智博客黎老师的视频刚好看到了关于xml文件操作的知识,自己在之前的学习使用中基本都是使用DOM的方式操作XML的文件,今天知道了其他的方式总结记录下来方便后面自己使用。

Android里面操作xml文件主要有三种方式:

SAX方式,DOM方式,PULL方式。据说因为DOM的方式比较耗内存,而手机最纠结的就是存储空间小的问题,所以在Android里面不提倡使用DOM的方式。而SAX方式和PULL方式的思想比较的相似,原理似乎是同出一则的,实现的思想好像是读取字符串的每一个单词一样,每读取一段就判断读取的是什么内容然后执行相应的方法,直至文件的结尾。

xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="30">
<name>liming</name>
<age>30</age>
</person>

<person id="23">
<name>limei</name>
<age>20</age>
</person>

</persons>

下面是三种方式读取xml文件内容的方式:

SAX实现xml文件内容的读取:

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import cn.edu.gxnu.Domian.Person;

public class SAXPersonService {

/**
* SAX方式获取XML文件的内容
*
@param inStream
*
@return
*
@throws Throwable
*/
public List<Person> getPersons(InputStream inStream) throws Throwable{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
PersonParser personparser = new PersonParser();
parser.parse(inStream, personparser);
inStream.close();
return personparser.getPersons();
}

/**
*
*
@author wmh
*
*/
private final class PersonParser extends DefaultHandler {

private List<Person> persons = null;
private Person person = null;
private String tag = null;

public List<Person> getPersons() {
return persons;
}

/**
* 读取XML至文件开始时方法
*/
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}

/**
* 读取XML的元素节点的方法
*/
@Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
if("person".equals(localName)){
person = new Person();
person.setId(new Integer(attributes.getValue(0)));
}
tag = localName;
}

/**
* 读取XML的文本内容时的方法
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(tag != null){
String data = new String(ch , start , length);
if("name".equals(tag)){
person.setName(data);
}else if("age".equals(tag)) {
person.setAge(new Short(data));
}
}
}

/**
* 读取到元素节点结束时的方法
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

if("person".equals(localName)){
persons.add(person);
person = null;
}

tag = null;
}

}

}

DOM实现xml文件内容的读取:

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import cn.edu.gxnu.Domian.Person;

public class DOMPersonService {

/**
* 使用DOM获取XML文件的内容
*
@param inStream
*
@return
*
@throws Throwable
*/
public List<Person> getPersons(InputStream inStream) throws Throwable{
List<Person> persons = new ArrayList<Person>();
//DOM文件创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//DOM创建对象
DocumentBuilder builder = factory.newDocumentBuilder();
//获取XML的DOM
Document document = builder.parse(inStream);
//获取XML文件的内容
Element root = document.getDocumentElement();
//获取XML文件的节点
NodeList personNode = root.getElementsByTagName("person");
for(int i = 0 ; i < personNode.getLength() ; i++){
Person person = new Person();
Element personElemt = (Element)personNode.item(i);
person.setId(new Integer(personElemt.getAttribute("id")));
//获取当前节点的字节点
NodeList personChildNode = personElemt.getChildNodes();
for(int y = 0 ; y < personChildNode.getLength() ; y++){
if(personChildNode.item(y).getNodeType() == Node.ELEMENT_NODE){
Element childElent = (Element)personChildNode.item(y);
if("name".equals(childElent.getNodeName())){
person.setName(childElent.getFirstChild().getNodeValue());
}else if("age".equals(childElent.getNodeName())){
person.setAge(new Short(childElent.getFirstChild().getNodeValue()));
}
}
}
persons.add(person);
}
return persons;
}

}

PULL实现xml文件内容的读取:

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import cn.edu.gxnu.Domian.Person;

public class PULLPersonService {

/**
* PULL方式获取XML文件内容
*
@param inStream
*
@return
*
@throws Throwable
*/
public List<Person> getPersons(InputStream inStream) throws Throwable{
List<Person> persons = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){//判断文件是否是文件的结尾,END_DOCUMENT文件结尾常量
switch(eventType){
case XmlPullParser.START_DOCUMENT://文件开始,START_DOCUMENT文件开始开始常量
persons = new ArrayList<Person>();
break;

case XmlPullParser.START_TAG://元素标签开始,START_TAG标签开始常量
String name = parser.getName();
if("person".equals(name)){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
}

if(person != null){
if("name".equals(name)){
person.setName(parser.nextText());
}
if("age".equals(name)){
person.setAge(new Short(parser.nextText()));
}
}
break;

case XmlPullParser.END_TAG://元素标签结束,END_TAG结束常量
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
break;
}
//获取当前元素标签的类型
eventType = parser.getEventType();
}
return persons;
}
}

而构造XML的方式页比较好理解,PULL的方式提供了构造文件,节点开始和结束的方法,只需要调用特定的方法传入特定的内容即可完成XML文件的构造

View Code
package cn.edu.gxnu.Service;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import cn.edu.gxnu.Domian.Person;

public class PULLPersonService {

/**
* OputStram方式生成XML文件
*
@param persons
*
@param outStream
*
@throws Throwable
*/
public static void save(List<Person> persons , OutputStream outStream) throws Throwable{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(outStream, "UTF-8");
serializer.startDocument("UTF-8", true);

serializer.startTag(null, "persons");
for(Person person : persons){
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());

serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");

serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");

serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
outStream.flush();
outStream.close();
}
}

这样,就可以构造一个XML文件了,每个节点都是一对一对的出现的。

posted @ 2012-01-08 22:19 精灵化石 阅读(150) 评论(0) 编辑
最近在做一个新闻发布系统,收到最近网络上不断的泄密的影响。自己页想使用下加密的算法对用户的密码进行简单的加密,作为自己学习的记录。
自己在网络上寻找了一些实例,发现目前介绍的基本都是MD5和SHA-1的算法的居多,这里使用的是MDS的加密算法,代码如下:

public String md5Digest(String src) throws Exception {
// 定义数字签名方法, 可用:MD5, SHA-1
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] b = md.digest(src.getBytes("utf-8"));

return this.byte2HexStr(b);
}


private String byte2HexStr(byte[] b) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < b.length; i++) {
String s = Integer.toHexString(b[i] & 0xFF);
if (s.length() == 1) {
sb.append("0");
}

sb.append(s.toUpperCase());
}

return sb.toString();
}

posted @ 2012-01-01 16:46 精灵化石 阅读(43) 评论(0) 编辑

        昨天在写一个新闻系统,在向Mysql 数据库中存入中文的字符时,发现存进数据库中的数据全是乱码,当时我以为只是数据库里解析字符集解析出错,读出来应该不会有事的,但是我错了,从数据库中读取出来的数据同样是乱码,自己检查了自己的程序字符集,发现都使用了utf-8了。

       查看了下mysql的字符集,发现不是utf-8,自己以为是这个问题,于是自己将数据库的字符集改成了utf8,在测试,发现还是出错。找了很多的帖子,发现问题都不能被解决。

       自己想了下,应该是字符编码的问题导致的问题,回想了自己在建立数据库的时候没有设置默认的字符编码,是不是这个原因造成的呢?自己在数据库中重新建立了一个新的数据库,不过与之前不同的是,这次自己在建立的时候设定了默认的编码格式,同样,在建表的时候自己也同样的设定了默认的编码格式,并且是与我程序代码一样的编码格式。具体如下:

create database 'Article' default character set utf8;

建立数据表时:

create table Banner(...数据项

)ENGINE=MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET=utf8;

建立完数据库后,我在链接数据库的字符串中加入了字符集的信息,在测试的时候,发现中文问题没有了!!在数据库中也能正常的显示,读取出来的数据也是正常的。我自己想是不是Mysql在建立数据库的时候是不是如果不指定字符的编码格式,而当我们后面在修改数据库的字符编码格式的时候是不是出错了,导致我们无法解决问题...???

posted @ 2011-11-09 11:15 精灵化石 阅读(13) 评论(0) 编辑

       昨天在Ubuntu 里面搭建J2EE的开发环境,不知道怎么回事,装着装着软件发现自己的鼠标的右键开始不行了,然后自己的文件也开始打不开图标也不见了?我当时以为是装了什么导致桌面或者文件的图标没法加载,于是重新启动了以下,结果进去后发现整个桌面都是一个颜色-蓝色的!!而且上面的问题还是一样的存在,这下把我急得....我花了好长的时间才装好的环境啊!!

        开始在Google里面去找答案,但是很多的帖子的方法都没有解决,今天早上过来又捣鼓了以下,还是不行,在Google,这时看到了一个帖子,与我遇到的问题一样,于是我也照着做了一下,终于自己的文件系统可以打开了...

主要步骤:1 终端运行:sudo apt-get install nautilus

                  2 终端运行:sudo nautilus

        虽然自己的文件系统是可以打得了,但是自己的系统选线的图标还是没有出来,又找了很多的帖子问题还是没解决,突然自己想是不是主题设置的问题,于是,自己去设置了以下电脑的主题。终于,自己的系统图标又出现了..

主要步骤:

             1 System->Preferences->Appearance.

             2 在Background中选择背景图片,在Theme选项卡中选择主题

就这样,我的Ubuntu 终于又回来了....

posted @ 2011-11-05 09:28 精灵化石 阅读(185) 评论(0) 编辑
摘要: 个人实习总结——基于SilverLight荣光游戏项目开发 秋风吹拂,不知不觉,自己来到北京已经三个月了。回想7月考完试的第三天,自己便收拾了简单的行李踏上了开往北京的火车,经过30多哥小时的颠簸,带着憧憬,带着向往,同样带着不安的我来到了北京市。经过一天的休整,7月12号,我开始了自己的实习生活。 在刚到公司的第一个星期里,自己实践了几个小的游戏,虽然做的很烂,但是也总算是慢慢的找回了大部分的SilverLight知识。自己在2010年的暑假和覃旋老师学习过一阵后就在也没有接触SilverLight了,可想而知知识也会随着时间的推移而慢慢的被遗忘,不过还好,经过几个小游戏的实践,自己也找回了阅读全文
posted @ 2011-10-08 18:52 精灵化石 阅读(104) 评论(1) 编辑
摘要: 到今天为止,自己参与STOA的会员模块开发快一个月了,在这个月结束前总结一下自己这个月做过的事情。 在STOA开始的时候,我们进行了模块任务的分配,我负责了STOA的会员模块。自己将会员模块分成了三部分,一个普通的会员,一个社团的管理,还有一个管理员。 普通会员实现了添加自己的详细信息,申请加入社团,查看自己加入社团的列表,社团管理部分有添加社团年度的信息,管理社团的成员,为新成员注册。而管理员有增加社团和管理社团。 在这个月中,自己学会了MVc的基础开发,数据库的增删查改,实现了数据的分页,做了验证码的功能,虽然很多的功能采用了一些非常不友好的实现方式,但是具体的还是实现了计划的功能。 在.阅读全文
posted @ 2011-03-29 22:31 精灵化石 阅读(45) 评论(1) 编辑
摘要: 今天做了什么 1 今天基本完成了所有action简单的功能的实现。2 今天任务的完成情况 2 基本功能实现了,但是有些信息还需要转换。3 遇到了哪些困难 思考了一下会员模块的整体实现。发现社团的管理和ADmin的管理的权限问题,如何正确的进入页面和保留进入页面的信息。4 如何解决遇到的困难 等待整体讨论。5 明天的计划 将说有的管理页面用框架也实现。阅读全文
posted @ 2011-03-18 13:43 精灵化石 阅读(22) 评论(0) 编辑