aapt获取apk信息存储mysql

表结构:

CREATE TABLE IF NOT EXISTS `apk_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '日志编号',
  `version_code` varchar(200) NOT NULL COMMENT '版本号',
  `package_md5` varchar(100) NOT NULL COMMENT '包文件的md5值',
  `package_name` varchar(100) NOT NULL COMMENT '包名称',
  `version_name` varchar(20) NOT NULL COMMENT '版本名',
  `sdk_version` varchar(20) NOT NULL COMMENT '最小SDK版本',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='获取APK信息' AUTO_INCREMENT=8 ;

aapt可以在这里下载:http://blog.phpfs.com/archives/2104.html

#!/bin/bash
#####
# 获取APK信息并保存到MYSQL数据库
#####
#mysql配置
HOST='localhost'
PORT=3306
USERNAME='root'
PASSWORD='Joyous'
DB='apk'
#获取APK信息
logname=/home/joyous/joyous/scripts/study/temp.log
/home/joyous/joyous/scripts/study/aapt d badging ${1} >${logname}
if [ -f "$logname" ]; then
    #包名
    NAME=`grep "package" ${logname}|awk -F"'" '{print $2}'`
    isversionCode=`grep "versionCode" ${logname}|awk -F"'" '{print $3}'|grep versionCode |wc -l` 
    if [ "$isversionCode" -eq 1 ];then
        VERSIONCODE=`grep "versionCode" ${logname}|awk -F"'" '{print $4}'`
    fi
    isversionCode=`grep "versionCode" ${logname}|awk -F"'" '{print $5}'|grep versionCode |wc -l` 
    if [ "$isversionCode" -eq 1 ];then
        VERSIONCODE=`grep "versionCode" ${logname}|awk -F"'" '{print $6}'`
    fi
    isversionName=`grep "versionName" ${logname}|awk -F"'" '{print $3}'|grep versionName |wc -l`  
    if [ "$isversionName" -eq 1 ];then
        VERSIONNAME=`grep "versionName" ${logname}|awk -F"'" '{print $4}'`
    fi
    isversionName=`grep "versionName" ${logname}|awk -F"'" '{print $5}'|grep versionName |wc -l`  
    if [ "$isversionName" -eq 1 ];then
        VERSIONNAME=`grep "versionName" ${logname}|awk -F"'" '{print $6}'`
    fi
    SDKVERSION=`grep "sdkVersion" ${logname}|awk -F"'" '{print $2}'`

    PACKMD5=`md5sum $1|cut -d ' ' -f1`
    insert_sql="insert into apk_info (version_code,package_md5, package_name,version_name,sdk_version) VALUES ('${VERSIONCODE}','${PACKMD5}','${NAME}','${VERSIONNAME}','${SDKVERSION}')"
    echo ${insert_sql}
    res=(`/usr/bin/mysql -h ${HOST} -u ${USERNAME} -P ${PORT} -p${PASSWORD} -e "use ${DB};${insert_sql}"`)
fi   

 

aapt获取apk版本等信息

简介:

aapt即Android Asset Packaging Tool,我们可以在SDK的platform-tools目录下找到该工具。aapt可以查看、 创建、 更新ZIP格式的文档附件(zip, jar, apk)。 也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。

使用:

aapt l[ist]:列出资源压缩包里的内容。
aapt d[ump]:查看APK包内指定的内容。
aapt p[ackage]:打包生成资源压缩包。
aapt r[emove]:从压缩包中删除指定文件。
aapt a[dd]:向压缩包中添加指定文件。
aapt v[ersion]:打印aapt的版本。

附件:apktool-aapt

Java基础语法

Java两种循环
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 5; i++) {
Map<String, Object> m = new HashMap<String, Object>();
m.put(“name”, “Text” + i);
m.put(“icon”, R.drawable.f001);
m.put(“but”, “Button” + i);
list.add(m);
}
for (int j = 0; j < list.size(); ++j) {
Log.w(“Name”, list.get(j).get(“name”).toString());
}
for (Map<String, Object> obj: list){
Log.w(“But”, obj.get(“but”).toString());
}

Java数组之定义和使用

1、定义
int[] arr = {1,2,3,4};
或者int arr[] = {1,2,3,4};
或者使用int arr[3] = new int[3];//为整形数组分配3个int型整数所所占内存空间

2、使用
arr.length可以获取数组长度
可以使用arr[2]获取数组元素

BaseAdapter简单用法

BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter.

例子:自定义列表适配器

MyListAdapter.java代码

package com.example.baseadapter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MyListAdapter extends BaseAdapter {
	private LayoutInflater inflater = null;
	private Context context = null;
	private List> listdata = null;

	/*
	 * 一行元素
	 */
	public final class ListItem {
		public ImageView icon;
		public TextView name;
		public Button but;
	}

	public MyListAdapter(Context ui, List> listdata) {
		this.context = ui;
		this.inflater = LayoutInflater.from(this.context);
		this.listdata = listdata;
	}

	@Override
	public int getCount() {
		return listdata.size();
	}

	@Override
	public Object getItem(int position) {
		return position;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	/*
	 * 这是渲染的重点,包括行内的点击事件也需要在这里定义
	 */
	@Override
	public View getView(int position, View v, ViewGroup parent) {
		// 初始化一行元素,这里也有部分优化
		ListItem listitem = null;
		if (v == null) {
			v = inflater.inflate(R.layout.listitem, null);
			listitem = new ListItem();
			listitem.icon = (ImageView) v
					.findViewById(R.id.image);
			listitem.name = (TextView) v
					.findViewById(R.id.text);
			listitem.but = (Button) v
					.findViewById(R.id.button);
			v.setTag(listitem);
		} else {
			listitem = (ListItem) v.getTag();
		}
		// 填充数据
		listitem.name.setText(listdata.get(position).get("name").toString());
		listitem.but.setText(listdata.get(position).get("but").toString());
		listitem.icon.setImageResource(Integer.parseInt(listdata.get(position).get("icon").toString()));
		return v;
	}

}

BaseActivity.java代码

package com.example.baseadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class BaseActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.baseactivity);
		ListView lv = (ListView) findViewById(R.id.listview1);
        List> list = new ArrayList>();
        for (int i = 0; i < 5; i++) {
            Map m = new HashMap();
            m.put("name", "Text" + i);
            m.put("icon", R.drawable.f001);
            m.put("but", "Button" + i);
            list.add(m);
        }
        MyListAdapter adapter = new MyListAdapter(
        		this,//listview的运行环境界面上下文
        		list
        		);
        lv.setAdapter(adapter);
	}

}

baseactivity.xml代码


    

listitem.xml代码


    
    
    

SimpleAdapter简单用法

官方文档:

这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图.
你可以将 Maps 的 ArrayList 指定为用于列表的数据.
ArrayList 中的每一项对应列表中的一行. Maps 中包含用于一行的数据.
你也可以指定 XML 文件,其中定义了用于显示行的视图,
通过 Map 的关键字映射到指定的视图.绑定数据到视图分两个阶段.
首先,如果 SimpleAdapter.ViewBinder 是有效的,则调用 setViewValue(android.view.View, Object, String) 方法.
如果返回值为真,则执行绑定.如果返回值为假,则按以下顺序绑定视图:实现了 Checkable 的视图(例如 CheckBox),期望绑定值是布尔类型.
TextView,期望绑定值是字符串类型,通过调用 setViewText(TextView, String) 绑定.
ImageView,期望绑定值是资源 ID 或者一个字符串,通过调用 setViewImage(ImageView, int) 或 setViewImage(ImageView, String)绑定.
如果没有合适的绑定发生,将会抛出 IllegalStateException 异常.

Continue reading

ArrayAdapter简单使用

Adapter是Data和View之间的桥梁,一般用在ListView中。
代码:MainActivity

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

	private  String[] words = {"one", "two", "three"};
	private ListView listview;
	private ArrayAdapter mAdapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		listview = (ListView) findViewById(R.id.listview1);

		mAdapter = new ArrayAdapter(this, R.layout.list_item, words);
		listview.setAdapter(mAdapter);

	}

}

代码:activity_main


    


代码:list_item(注意不能带有其他布局属性,只能有一个TextView节点)





安卓上传文件(绝对可以用)

说明:使用是httpclient+MultipartEntity,因此需要导入包:httpmime-4.1.1这个包非常重要!务必导入!)

写在前面:我只是贴出核心代码,只是记录下我寻找上传功能的过程,我是一个PHPer,最近项目需要编写APP,因此就刚学习Android开发。如果你也正在学习Android可以一起交流一下~~

上代码:(安卓客户端代码)直接贴出关键部分

/*
	 * 图片上传
	 */
	private void httpUpload() {
		HttpClient httpclient = new DefaultHttpClient();
		// 设置通信协议版本
		httpclient.getParams().setParameter(
				CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

		String pathToOurFile = C.dir.images + File.separator + filename;
		//要上传的图片/mnt/sdcard/images/IMG_20131026_072832.jpg
		Log.w("file", pathToOurFile);
		String urlServer = "http://192.168.1.180/index/upload/index.php";
		HttpPost httppost = new HttpPost(urlServer);
		File file = new File(pathToOurFile);

		MultipartEntity mpEntity = new MultipartEntity(); // 文件传输(这个需要用到httpmime-4.1.1.jar)
		ContentBody cbFile = new FileBody(file);
		StringBody n = null;
		try {
			n = new StringBody("这里可以传递其他内容");
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
		mpEntity.addPart("name", n);//
		mpEntity.addPart("file", cbFile); // 
		httppost.setEntity(mpEntity);
		try {
			httpclient.execute(httppost);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		httpclient.getConnectionManager().shutdown();
		//上传成功,删除临时文件
		file.delete();
		Log.w("result", "上传成功!");
	}

说明:我这里只是为了实现上传功能,随后需要按照服务器端的返回结果进行处理~

服务器端代码:(PHP代码

        $arrTmp = pathinfo($_FILES['file']['name']);//获取上传文件信息
        $extension = strtolower($arrTmp['extension']);//获取扩展,并转成小写
        $file_newname = time().".".$extension;
        $result = @move_uploaded_file($_FILES['file']['tmp_name'],$file_newname);

Continue reading

安卓真机调试

1、  安卓驱动

网上说下载这个,下载那个的!我就使用腾讯的手机管家(这里不算广告吧?)

然后手机驱动问题就解决了!

2、  打开eclipse-DDMS界面

 

DDMS真机调试截图

DDMS真机调试截图

3、  调试步骤

在项目文件夹点击右键,Run as—Android application(如果这里启动了安卓模拟器,那就点击项目右键,把Run as —Run configurations中的Android application下面的当前应用删除,再执行Run as—android application)

4、  真机界面(腾讯手机管家截屏)

 

腾讯手机管家截图

腾讯手机管家截图

 

安卓开发之再用SharedPreference

1、先获取对象
MySharePreference = getPreferences(Context.MODE_PRIVATE);//这里的模式自己查找

2、如果需要获取保存的内容可以使用
getXXX方法
MySharePreference.getString(“username”, “”);//第二个参数是默认值

3、如果想更改保存的内容可以使用
MySharePreference.Editor edit = MySharePreference.edit();//开始修改
edit.putString(“username”, “new data”);
edit.commit();//提交更改,这一步不能缺少

4、附常用方法
getBoolean(String key, boolean val);
getFloat(String key, float val);//第二个参数都是默认值
还有getInt、getString等,而对应MySharePreference.Editor保存的有putBoolean
putFloat,putInt,putString等

安卓下使用xml定义渐变背景

1、在drawable中建立bg.xml文件
<?xml version=”1.0″ encoding=”utf-8″?>
<shape xmlns:android=”http://schemas.android.com/apk/res/android” >
<gradient
android:startColor=”@color/white”
android:centerColor=”@color/gray”
android:endColor=”@color/black”
android:angle=”270″
<!–0是从左到右,90是从下到上,180从右到左,270从上到下–>
android:centerY=”0.3″
android:centerX=”0.3″
<!—->
/>
<corners android:radius=”0dip”/>
</shape>
2、这样在布局中就可以使用
<LinearLayout
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:background=”@drawable/xml_bg_orange”
android:orientation=”horizontal” >
3、这样背景就会从上到下进行颜色渐变