<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[阿权的书房]]></title> 
<link>http://www.aslibra.com/blog/index.php</link> 
<description><![CDATA[技术经验分享，资料收集，偶尔晾几张相片，感言生活]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[阿权的书房]]></copyright>
<item>
<link>http://www.aslibra.com/blog/post/android-format-time-and-size.php</link>
<title><![CDATA[android格式化时间和数字]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Fri, 06 Aug 2010 16:08:58 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android-format-time-and-size.php</guid> 
<description>
<![CDATA[ 
	读取文件列表时，获取到文件的修改时间，但怎么转换为正常可辨的时间值呢？<br/><br/><div class="code">//function A<br/>//CODE...<br/>File myfile = new File(apk);<br/>long mytime = myfile.lastModified();<br/>String timeStr = time2String( mytime );<br/>//end of A<br/><br/>private String time2String( long time )&#123;<br/><br/>//方式1 按系统的日期方式<br/>//&nbsp;&nbsp;Calendar&nbsp;&nbsp; cal = Calendar.getInstance(); <br/>//&nbsp;&nbsp;cal.setTimeInMillis( time ); <br/>//&nbsp;&nbsp;return cal.getTime().toLocaleString();<br/><br/>//方式2 按自定义格式<br/>&nbsp;&nbsp;SimpleDateFormat format1 = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);<br/>&nbsp;&nbsp;Date currentTime = new Date( time );<br/>&nbsp;&nbsp;return format1.format(currentTime);<br/>&#125;</div><br/><br/>把大小转换为易读的格式，这里偷懒，最大是M的：<br/><br/><div class="code">private String size2string(long size)&#123;<br/>&nbsp;&nbsp;DecimalFormat df = new DecimalFormat(&quot;0.00&quot;);<br/>&nbsp;&nbsp;String mysize = &quot;&quot;;<br/>&nbsp;&nbsp;if( size &gt; 1024*1024)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;mysize = df.format( size / 1024f / 1024f ) +&quot;M&quot;;<br/>&nbsp;&nbsp;&#125;else if( size &gt; 1024 )&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;mysize = df.format( size / 1024f ) +&quot;K&quot;;<br/>&nbsp;&nbsp;&#125;else&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;mysize = size + &quot;B&quot;;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;return mysize;<br/>&#125;</div><br/><br/>更多方式可以参考：<br/>1 <a href="http://hi.baidu.com/nieweiguo/blog/item/84d434d3c0830a003af3cfb1.html" target="_blank">JAVA时间格式化处理</a><br/>2 <a href="http://bytes.com/topic/java/answers/16212-rounding-off-float-two-decimal-places" target="_blank">Rounding off a float to two decimal places</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android-parse-apk-binary-xml.php</link>
<title><![CDATA[android的apk文件的xml提取]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Wed, 04 Aug 2010 11:42:18 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android-parse-apk-binary-xml.php</guid> 
<description>
<![CDATA[ 
	前面有说明<a href="http://www.aslibra.com/blog/post/android_get_apk_info.php" target="_blank">android获取程序信息</a>，这些信息是基本信息，我想提取android:minSdkVersion的值，可还没有发现用程序可以提取出来。<br/><br/>有一个比较笨的方式是解压apk文件，分析apk文件里的xml。<br/><br/>首先apk文件其实是zip文件，改名即可按zip文件解压，而xml文件是二进制的，倒是需要另外的软件解决。<br/>如果需要提取，不需要再重新打包，可以改名直接解压，否则可以试试<a href="http://code.google.com/p/android-apktool/" target="_blank">apktool</a>来解压和打包，不重复说明。<br/><br/>浏览二进制的xml文件，可以用 AXMLPrinter2 解决，在 android4me 的工程里面可以下载到。<br/><a href="http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar&can=2&q=" target="_blank">AXMLPrinter2.jar</a>&nbsp;&nbsp;Prints XML document from binary XML file (with correct namespace handing & attribute formatting).&nbsp;&nbsp;<br/><br/>下面演示一下解析过程：<br/><br/><div class="code">root@aslibra:/tmp/apk# ls<br/>c.apk<br/>root@aslibra:/tmp/apk# mv c.apk c.zip<br/>root@aslibra:/tmp/apk# unzip c<br/>Archive:&nbsp;&nbsp;c.zip<br/>...<br/>&nbsp;&nbsp;inflating: res/layout/main.xml&nbsp;&nbsp;&nbsp;&nbsp; <br/>...<br/>&nbsp;&nbsp;inflating: AndroidManifest.xml&nbsp;&nbsp;&nbsp;&nbsp; <br/> extracting: resources.arsc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>...<br/>root@aslibra:/tmp/apk# java -jar /path/to/AXMLPrinter2.jar AndroidManifest.xml &#124;grep minSdkVersion<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:minSdkVersion=&quot;2&quot;</div><br/><br/>TIPS: minSdkVersion 在安装时有用，如果版本比这个低，就根本安装不上此程序的。<br/><br/>参考阅读：<br/><br/>1 <a href="http://blog.chinaunix.net/u2/85805/showart_1662856.html" target="_blank">探究 Android 系統應用程式的祕密</a><br/>2 <a href="http://lvwind.net/2010/04/apktool-decode/" target="_blank">又一个反编译利器Apktool</a> （反编译和重建apk）<br/>3 <a href="http://code.google.com/p/android-apktool/" target="_blank">http://code.google.com/p/android-apktool/</a><br/>4 <a href="http://stackoverflow.com/questions/2097813/how-to-parse-the-androidmanifest-xml-file-inside-an-apk-package" target="_blank">How to parse the AndroidManifest.xml file inside an .apk package</a><br/>5 <a href="http://code.google.com/p/android4me/" target="_blank">android4me</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a> , <a href="http://www.aslibra.com/blog/go.php/tags/linux/" rel="tag">linux</a> , <a href="http://www.aslibra.com/blog/go.php/tags/xml/" rel="tag">xml</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android_get_phone_infomation.php</link>
<title><![CDATA[android获得手机信息]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Tue, 03 Aug 2010 11:43:10 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android_get_phone_infomation.php</guid> 
<description>
<![CDATA[ 
	android获取手机的imei信息：<br/><br/><div class="code">TelephonyManager telephonyManager=(TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);<br/>String imei=telephonyManager.getDeviceId();<br/><br/>//获得手机号<br/>telephonyManager.getLine1Number();</div><br/><br/>这个操作需要权限说明:<br/><br/><div class="code">&lt;uses-permission android:name=&quot;android.permission.READ_PHONE_STATE&quot; /&gt;</div><br/><br/>另外，要获得手机的型号和系统版本，可以这样：<br/><br/><div class="code">//机器型号 HTC Magic<br/>Build.MODEL<br/>//SDK版本 8<br/>Build.VERSION.SDK<br/>//SDK版本号 2.2<br/>Build.VERSION.RELEASE</div><br/><br/><strong>参考内容：</strong><br/><br/>1 <a href="http://marshal.easymorse.com/archives/1532" target="_blank">在android系统中获取imei号和其他手机信息</a><br/>2 <a href="http://dohkoos.name/how-to-obtain-the-android-mobile-phone-model.html" target="_blank">如何获取Android手机的型号</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android_get_apk_info.php</link>
<title><![CDATA[android获取程序信息]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Tue, 03 Aug 2010 02:58:37 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android_get_apk_info.php</guid> 
<description>
<![CDATA[ 
	获取已安装的程序的信息（名称、包名、图标等）<br/><br/><div class="code">class PInfo &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String appname = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String pname = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String versionName = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private int versionCode = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private Drawable icon;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private void prettyPrint() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(appname + &quot;&#92;t&quot; + pname + &quot;&#92;t&quot; + versionName + &quot;&#92;t&quot; + versionCode + &quot;&#92;t&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>private void listPackages() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;PInfo&gt; apps = getInstalledApps(false); /* false = no system packages */<br/>&nbsp;&nbsp;&nbsp;&nbsp;final int max = apps.size();<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;max; i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apps.get(i).prettyPrint();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>private ArrayList&lt;PInfo&gt; getInstalledApps(boolean getSysPackages) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;PInfo&gt; res = new ArrayList&lt;PInfo&gt;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;List&lt;PackageInfo&gt; packs = getPackageManager().getInstalledPackages(0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;packs.size();i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageInfo p = packs.get(i);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((!getSysPackages) &amp;&amp; (p.versionName == null)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo newInfo = new PInfo();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newInfo.pname = p.packageName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newInfo.versionName = p.versionName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newInfo.versionCode = p.versionCode;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.add(newInfo);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return res; <br/>&#125;</div><br/><br/>获取未安装的APK文件的信息<br/><br/><div class="code">/** 获取未安装的APK信息&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param context&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param archiveFilePath APK文件的路径。如：/sdcard/download/XX.apk&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void getUninatllApkInfo(Context context, String archiveFilePath)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageManager pm = context.getPackageManager();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(info != null)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationInfo appInfo = info.applicationInfo;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String appName = pm.getApplicationLabel(appInfo).toString();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String packageName = appInfo.packageName;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Drawable icon = pm.getApplicationIcon(appInfo);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;</div><br/><br/>参考自：<br/><br/>1 <a href="http://www.androidsnippets.org/snippets/70/" target="_blank">Get installed Applications with Name, Package Name, Version and Icon</a><br/>2 <a href="http://tonyyu.javaeye.com/blog/687449" target="_blank">http://tonyyu.javaeye.com/blog/687449</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a> , <a href="http://www.aslibra.com/blog/go.php/tags/apk/" rel="tag">apk</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android_intent_start_another_application.php</link>
<title><![CDATA[android唤起另外一个程序]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Fri, 30 Jul 2010 15:25:48 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android_intent_start_another_application.php</guid> 
<description>
<![CDATA[ 
	简单的小问题，如果列出了所有安装的程序，怎么样打开该程序呢？<br/><br/>要调用该程序，有两个必要因素：packageName, className<br/>比如打开计算器程序：<br/><br/><div class="code">Intent i = new Intent();<br/>i.setClassName(&quot;com.android.calculator2&quot;, &quot;com.android.calculator2.Calculator&quot;);<br/>startActivity(i);</div><br/><br/>前面是packageName，后面是className，我们尝试取出此两个值即可。<br/><br/><div class="code">List&lt;PackageInfo&gt; packs = getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);<br/>for(int i=0;i&lt;packs.size();i++) &#123;<br/>&nbsp;&nbsp;PackageInfo p = packs.get(i);<br/>&nbsp;&nbsp;//p.packageName;<br/>&nbsp;&nbsp;//p.activities&#91;0&#93;.name; //（className）<br/>&#125;</div><br/><br/><strong>参考阅读：</strong><br/><br/>1 <a href="http://www.blogjava.net/bingle/archive/2010/02/01/311528.html" target="_blank">Android中外部程序调用方法总结</a> 有两个方式<br/>2 <a href="http://osdir.com/ml/AndroidDevelopers/2009-03/msg01921.html" target="_blank">Re: Launch Application - msg#01921</a> 内容比较混杂，可以看看<br/>3 <a href="http://bashenmail.javaeye.com/blog/603770" target="_blank">本地程序打开其它程序</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a> , <a href="http://www.aslibra.com/blog/go.php/tags/intent/" rel="tag">intent</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android_download.php</link>
<title><![CDATA[android文件下载]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Tue, 27 Jul 2010 11:18:32 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android_download.php</guid> 
<description>
<![CDATA[ 
	简单的代码，测试至少是可行<br/><div class="code">public static void downloadFile(String url, String newPath) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;URL myFileUrl = null;&nbsp;&nbsp;<br/>&nbsp;&nbsp;try &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;myFileUrl = new URL(url);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125; catch (MalformedURLException e) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Log.e(&quot;test&quot;, &quot;MalformedURLException: &quot;+e.toString() );<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;try &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;HttpURLConnection conn;<br/>&nbsp;&nbsp;&nbsp;&nbsp;conn = (HttpURLConnection) myFileUrl.openConnection();<br/>&nbsp;&nbsp;&nbsp;&nbsp;conn.setDoInput(true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;conn.connect();&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;InputStream is = conn.getInputStream();&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;&nbsp;newfile&nbsp;&nbsp;=&nbsp;&nbsp;new&nbsp;&nbsp;FileOutputStream(&quot;/sdcard/tmp.apk&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;byte&#91;&#93;&nbsp;&nbsp;buffer&nbsp;&nbsp;=&nbsp;&nbsp;new&nbsp;&nbsp;byte&#91;1444&#93;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;byteread&nbsp;&nbsp;=&nbsp;&nbsp;0;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;&nbsp;(&nbsp;&nbsp;(byteread&nbsp;&nbsp;=&nbsp;&nbsp;is.read(buffer))&nbsp;&nbsp;!=&nbsp;&nbsp;-1)&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newfile.write(buffer,&nbsp;&nbsp;0,&nbsp;&nbsp;byteread);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br/>&nbsp;&nbsp;&#125; catch (Exception e) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Log.e(&quot;test&quot;, &quot;returnNetworkBitMap: &quot;+e.toString() );<br/>&nbsp;&nbsp;&#125;finally&#123;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125; </div><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android_install-uninstall_apk.php</link>
<title><![CDATA[android程序安装和卸载]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Tue, 27 Jul 2010 11:15:54 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android_install-uninstall_apk.php</guid> 
<description>
<![CDATA[ 
	安装某个apk文件：<br/><br/><div class="code">String fileName = &quot;/sdcard/tmp.apk&quot;;<br/>Intent i = new Intent();<br/>i.setAction(Intent.ACTION_VIEW);<br/>i.setDataAndType(Uri.fromFile(new File(fileName) ), &quot;application/vnd.android.package-archive&quot;);<br/>startActivity(i);</div><br/><br/>注：如果文件不存在会提示解析出错<br/><br/>卸载某个程序：<br/><br/><div class="code">Uri packageURI = Uri.parse(&quot;package:com.aslibra.test&quot;);<br/>Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);<br/>startActivity(uninstallIntent); </div><br/><br/>参考阅读：<br/><br/><a href="http://android.amberfog.com/?p=98" target="_blank">Install and Uninstall Android applications with PackageInstaller</a>，包含判断是否开启安装第三方程序的支持<br/><br/>另外还有 <a href="http://hi.baidu.com/devil%B6%C0%B0%AE/blog/item/5f5caf5e3ce43f48faf2c004.html" target="_blank">Android Intent的几种用法全面总结</a>，必要的时候可以参考啦<br/><br/><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android-upload-files-to-server.php</link>
<title><![CDATA[android文件上传到服务器]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Tue, 27 Jul 2010 11:10:21 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android-upload-files-to-server.php</guid> 
<description>
<![CDATA[ 
	代码非原创，fix了bug，完善的还是需要再思量：<br/><div class="code">/**<br/> * 通过拼接的方式构造请求内容，实现参数传输以及文件传输<br/> * @param actionUrl<br/> * @param params<br/> * @param files<br/> * @return<br/> * @throws IOException<br/> */<br/>public static String post(String actionUrl, Map&lt;String, String&gt; params, <br/>&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String, File&gt; files) throws IOException &#123; <br/><br/>&nbsp;&nbsp;String BOUNDARY = java.util.UUID.randomUUID().toString();<br/>&nbsp;&nbsp;String PREFIX = &quot;--&quot; , LINEND = &quot;&#92;r&#92;n&quot;;<br/>&nbsp;&nbsp;String MULTIPART_FROM_DATA = &quot;multipart/form-data&quot;; <br/>&nbsp;&nbsp;String CHARSET = &quot;UTF-8&quot;;<br/><br/>&nbsp;&nbsp;URL uri = new URL(actionUrl); <br/>&nbsp;&nbsp;HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); <br/>&nbsp;&nbsp;conn.setReadTimeout(5 * 1000); // 缓存的最长时间 <br/>&nbsp;&nbsp;conn.setDoInput(true);// 允许输入 <br/>&nbsp;&nbsp;conn.setDoOutput(true);// 允许输出 <br/>&nbsp;&nbsp;conn.setUseCaches(false); // 不允许使用缓存 <br/>&nbsp;&nbsp;conn.setRequestMethod(&quot;POST&quot;); <br/>&nbsp;&nbsp;conn.setRequestProperty(&quot;connection&quot;, &quot;keep-alive&quot;); <br/>&nbsp;&nbsp;conn.setRequestProperty(&quot;Charsert&quot;, &quot;UTF-8&quot;); <br/>&nbsp;&nbsp;conn.setRequestProperty(&quot;Content-Type&quot;, MULTIPART_FROM_DATA + &quot;;boundary=&quot; + BOUNDARY); <br/><br/>&nbsp;&nbsp;// 首先组拼文本类型的参数 <br/>&nbsp;&nbsp;StringBuilder sb = new StringBuilder(); <br/>&nbsp;&nbsp;for (Map.Entry&lt;String, String&gt; entry : params.entrySet()) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(PREFIX); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(BOUNDARY); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(LINEND); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&quot;Content-Disposition: form-data; name=&#92;&quot;&quot; + entry.getKey() + &quot;&#92;&quot;&quot; + LINEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&quot;Content-Type: text/plain; charset=&quot; + CHARSET+LINEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&quot;Content-Transfer-Encoding: 8bit&quot; + LINEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(LINEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(entry.getValue()); <br/>&nbsp;&nbsp;&nbsp;&nbsp;sb.append(LINEND); <br/>&nbsp;&nbsp;&#125; <br/><br/>&nbsp;&nbsp;DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); <br/>&nbsp;&nbsp;outStream.write(sb.toString().getBytes()); <br/>&nbsp;&nbsp;// 发送文件数据 <br/>&nbsp;&nbsp;if(files!=null)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (Map.Entry&lt;String, File&gt; file: files.entrySet()) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb1 = new StringBuilder(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.append(PREFIX); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.append(BOUNDARY); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.append(LINEND); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.append(&quot;Content-Disposition: form-data; name=&#92;&quot;file&quot;+(i++)+&quot;&#92;&quot;; filename=&#92;&quot;&quot;+file.getKey()+&quot;&#92;&quot;&quot;+LINEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.append(&quot;Content-Type: application/octet-stream; charset=&quot;+CHARSET+LINEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb1.append(LINEND);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(sb1.toString().getBytes()); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream is = new FileInputStream(file.getValue());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&#91;&#93; buffer = new byte&#91;1024&#93;; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int len = 0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((len = is.read(buffer)) != -1) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(buffer, 0, len); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(LINEND.getBytes()); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//请求结束标志<br/>&nbsp;&nbsp;byte&#91;&#93; end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); <br/>&nbsp;&nbsp;outStream.write(end_data); <br/>&nbsp;&nbsp;outStream.flush(); <br/><br/>&nbsp;&nbsp;//得到响应码 <br/>&nbsp;&nbsp;int res = conn.getResponseCode(); <br/>&nbsp;&nbsp;InputStream in = null;<br/>&nbsp;&nbsp;if (res == 200) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;in = conn.getInputStream(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;int ch; <br/>&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder sb2 = new StringBuilder(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;while ((ch = in.read()) != -1) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb2.append((char) ch); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;return in == null ? null : in.toString(); <br/>&#125; </div><br/><br/>最简单的PHP测试代码：<br/><br/><div class="code">if($_FILES)&#123;<br/>&nbsp;&nbsp;foreach($_FILES as $v)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;copy($v&#91;tmp_name&#93;, $v&#91;name&#93;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;</div><br/><br/>参考自 <a href="http://www.eoeandroid.com/archiver/tid-22679.html" target="_blank">Android中发送Http请求实例（包括文件上传、servlet接收）</a>，修复了几个问题：<br/>1 多文件上传 file"+(i++)+"<br/>2 返回的错误<br/><br/>另外还可以看看这个（我没测试） <a href="http://lgj573.javaeye.com/blog/670273" target="_blank">android 文件上传的类--完整 可以直接被调用的</a><br/><br/>这有一个从协议上分析的，比较牛叉：<a href="http://student.csdn.net/space.php?uid=46868&do=blog&id=25873" target="_blank">Android下的应用编程——用HTTP协议实现文件上传功能</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a> , <a href="http://www.aslibra.com/blog/go.php/tags/upload/" rel="tag">upload</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android_Gallery_slowdown_switch.php</link>
<title><![CDATA[android的Gallery降低选择频率]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Thu, 15 Jul 2010 11:38:24 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android_Gallery_slowdown_switch.php</guid> 
<description>
<![CDATA[ 
	android的ImageSwitcher是一个图片更换而产生动画过渡的控件，appdemo里面有例子，其实是一个很好的图片浏览的例子，但有一个不好的地方就是选择小图时，速度太快，每个经过中点的小图都产生一次事件，导致大图切换效果不理想。<br/>比如点击第一张，放大第一张，点击第三张，是先放大第二张，再放大第三张，滑动时经过的所有图片都显示一次，很不理想。<br/>我们可以用线程来处理这个问题，一定的时间后如果选择的index值不变，说明已经稳定不变，显示大图。<br/><br/>修改一下即可：<br/><br/><div class="code">/*<br/>* 原代码<br/>*/<br/>//&nbsp;&nbsp;&nbsp;&nbsp;public void onItemSelected(AdapterView parent, View v, int position, long id) &#123;<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mSwitcher.setImageResource(mImageIds&#91;position&#93;);<br/>//&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>/*<br/>* code: hqlulu<br/>* http://www.aslibra.com<br/>* 增加以下代码<br/>*/<br/>private int showingIndex = -1;<br/>private static final int TIME_OUT_DISPLAY = 300;<br/>private int toShowIndex = 0;<br/><br/>@Override<br/>public void onItemSelected(AdapterView&lt;?&gt; arg0, View arg1, int arg2, long arg3) &#123;<br/>&nbsp;&nbsp;Log.v(&quot;test&quot;, &quot;onItemSelected arg2=&quot;+arg2+&quot; arg3=&quot;+arg3);<br/><br/>&nbsp;&nbsp;toShowIndex = arg2;<br/>&nbsp;&nbsp;final Handler handler = new Handler() &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void handleMessage(Message msg) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(showingIndex != toShowIndex)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showingIndex = toShowIndex;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mSwitcher.setImageResource(mImageIds&#91;toShowIndex&#93;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&#125;;<br/>&nbsp;&nbsp;Thread checkChange = new Thread() &#123;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void run() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int myIndex = toShowIndex;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep( TIME_OUT_DISPLAY );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( myIndex == toShowIndex )&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler.sendEmptyMessage(0);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.v(&quot;test&quot;, &quot;+++ stable can show ...&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;else&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.v(&quot;test&quot;, &quot;+++ not stable...&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (InterruptedException e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&#125;;<br/>&nbsp;&nbsp;checkChange.start();<br/>&#125;</div><br/><br/>完整代码见附件 <a href="attachment.php?fid=171">点击这里下载文件</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a>
]]>
</description>
</item><item>
<link>http://www.aslibra.com/blog/post/android-getting-height-of-status-and-title-bar.php</link>
<title><![CDATA[android获得状态栏和标题栏高度]]></title> 
<author>hqlulu &lt;hqlulu@163.com&gt;</author>
<category><![CDATA[Phone]]></category>
<pubDate>Wed, 14 Jul 2010 02:42:49 +0000</pubDate> 
<guid>http://www.aslibra.com/blog/post/android-getting-height-of-status-and-title-bar.php</guid> 
<description>
<![CDATA[ 
	代码是参考某位仁兄的片段，以下是可行的完整测试代码：<br/><br/><div class="code">package com.aslibra.test;<br/><br/>import android.app.Activity;<br/>import android.graphics.Rect;<br/>import android.os.Bundle;<br/>import android.util.Log;<br/>import android.view.Window;<br/>import android.widget.ImageView;<br/><br/>public class test extends Activity &#123;<br/>&nbsp;&nbsp;ImageView iv;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;@Override<br/>&nbsp;&nbsp;public void onCreate(Bundle savedInstanceState) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState);<br/>&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.main);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;iv = (ImageView) this.findViewById(R.id.ImageView01);<br/>&nbsp;&nbsp;&nbsp;&nbsp;iv.post(new Runnable()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void run()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewInited();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;Log.v(&quot;test&quot;, &quot;== ok ==&quot;);<br/>&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;private void viewInited()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Rect rect= new Rect();<br/>&nbsp;&nbsp;&nbsp;&nbsp;Window window= getWindow(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;iv.getWindowVisibleDisplayFrame(rect);<br/>&nbsp;&nbsp;&nbsp;&nbsp;int statusBarHeight= rect.top;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();<br/>&nbsp;&nbsp;&nbsp;&nbsp;int titleBarHeight= contentViewTop - statusBarHeight;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//测试结果：ok之后 100多 ms 才运行了<br/>&nbsp;&nbsp;&nbsp;&nbsp;Log.v(&quot;test&quot;, &quot;=-init-= statusBarHeight=&quot;+statusBarHeight+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot; contentViewTop=&quot;+contentViewTop+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot; titleBarHeight=&quot;+titleBarHeight);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;/*<br/>&nbsp;&nbsp; * 07-14 02:36:48.449: VERBOSE/test(1385): == ok ==<br/>&nbsp;&nbsp; * 07-14 02:36:48.558: VERBOSE/test(1385): =-init-= statusBarHeight=25 contentViewTop=50 titleBarHeight=25<br/>&nbsp;&nbsp; */<br/>&#125;</div><br/><br/>参考信息：<br/><a href="http://andmobidev.blogspot.com/2010/01/getting-height-of-status-and-title-bar.html" target="_blank">Getting Height of Status and Title Bar</a><br/>Tags - <a href="http://www.aslibra.com/blog/go.php/tags/android/" rel="tag">android</a>
]]>
</description>
</item>
</channel>
</rss>