Cordova 的前身是PhoneGap,但是在前陣子已經將PhoneGap捐給Apache基金會了
並命名為Cordova。以下我以Cordova在Android環境上建立一個簡單的HTML範例
首先先到 http://phonegap.com/download/ 這是PhoneGap的官網下載 library
目前最新版是1.5.0,但是下載下來並解壓縮之後的JAR檔案名稱已經更改為 cordova.jar 了
首先先依照下面步驟建立範例程式
前提是你必須已經具備Android得開發環境,包括Eclipse。Android環境配置
建立Android專案
File > New > Android Project > 輸入專案名稱 > 選擇SDK (這裡我是用Android 3.2)
> 設定package name > Finish
完成之後,就可以來配置Cordova的環境
1. 在專案目錄下建立libs的目錄
2. 在assets目錄下建立www目錄
2012年3月12日 星期一
2012年2月5日 星期日
【Android】android java.net.ConnectException: localhost/127.0.0.1 - Connection refused
延續前一篇,在環境中我弄了一個簡單的 Java Web project
以實現檔案上傳的動作,但是在 Android 的應用程式中卻發生這樣的錯誤
原因是因為 Tomcat 上已經有我寫好的web 程式
URL路徑類似 http://localhost:8080/Android_Demo/UploadServlet.do
但是 Android 一旦判別到 localhost 或是 127.0.0.1時,他會把這段路徑當作是自己(也就是模擬器)
所以如果要在模擬器上訪問你的電腦的路徑,記得用10.0.2.2吧。
以實現檔案上傳的動作,但是在 Android 的應用程式中卻發生這樣的錯誤
原因是因為 Tomcat 上已經有我寫好的web 程式
URL路徑類似 http://localhost:8080/Android_Demo/UploadServlet.do
但是 Android 一旦判別到 localhost 或是 127.0.0.1時,他會把這段路徑當作是自己(也就是模擬器)
所以如果要在模擬器上訪問你的電腦的路徑,記得用10.0.2.2吧。
2012年2月4日 星期六
【Android】android.os.NetworkOnMainThreadException
今天在寫Android 程式模擬檔案上傳到遠端的時候遇到的問題
以下是程式片段:
HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection();
//...
OutputStream os = conn.getOutputStream(); //拋出例外
在Android的應用程式中,如果要訪問遠端的資源,必須在/AndroidManifest.xml
加入以下這行標籤:
如果已經加上去之後還是有例外,可以嘗試在 Activity 中的 onCreate(Bundle) 中
加入以下的片段程式:
或許可以幫助你解決問題
以下是程式片段:
HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection();
//...
OutputStream os = conn.getOutputStream(); //拋出例外
在Android的應用程式中,如果要訪問遠端的資源,必須在/AndroidManifest.xml
加入以下這行標籤:
<uses-permission android:name="android.permission.INTERNET"
/>
如果已經加上去之後還是有例外,可以嘗試在 Activity 中的 onCreate(Bundle) 中
加入以下的片段程式:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
或許可以幫助你解決問題
2012年2月3日 星期五
【Android】java.io.filenotfoundexception permission denied
當程式需要存取SD卡的時候,遇到類似如下問題:
java.io.FileNotFoundException: /mnt/sdcard/test.txt (Permission denied)
at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
如果加了還是有問題,那注意一下你的虛擬機一開始配置的時候有沒有給SD卡足夠的空間
在 Eclipse 中的上方功能列 > Window > AVD manager > 選擇你的虛擬機 > 按下Edit >
配置你的SD卡一些空間 > Edit AVD > 完成
在這分享一下。
java.io.FileNotFoundException: /mnt/sdcard/test.txt (Permission denied)
at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
或是:
(No such file or directory) 之類的
那麼先檢查一下 /AndroidManifest.xml 有沒有加入以下兩行
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>
如果加了還是有問題,那注意一下你的虛擬機一開始配置的時候有沒有給SD卡足夠的空間
在 Eclipse 中的上方功能列 > Window > AVD manager > 選擇你的虛擬機 > 按下Edit >
配置你的SD卡一些空間 > Edit AVD > 完成
在這分享一下。
2012年2月2日 星期四
【Android】Widget 介紹
Button
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_add"
/>
介紹一些可能常用的屬性:
android:enabled=”[true|false]” 表示按鈕是否有效(能不能按)
android:onClick="[Your method name]"
表示按鈕按下後的觸發事件
在之前的程式裡,我們要處理Button的時候都是在Activity建立一個OnClickListener 並實作 onClick(View) 方法來解決按鈕按下後要做的事情
例如:
button.setOnClickListener(new OnClickListener(){
public void onClick(View view) {
// TODO Auto-generated method stub
// Your code }
});
這樣有時候當程式碼多的時候是蠻不好看也不好維護的,
所以可以直接在layout下設定Button的android:onClick屬性,
2012年2月1日 星期三
【Android】Activity 間的資料傳遞
接下來要來說明一下在Activity之間切換時,該如何傳遞資料?
主要是需要透過Bundle物件來達成,先來看以上範例中如何在FirstActivity傳到SecondActivity。
以下來看一下傳過去的程式實做:
傳送:
Bundle bundle = new Bundle();
bundle.putInt("id", id);
bundle.putString("name", account);
intent.putExtras(bundle);
startActivity(intent);
接收:
Bundle bundle = getIntent().getExtras();
bundle.getInt("id");
bundle.getString("name");
其實Intent也內建了Bundle物件,因此你也可以如下這樣寫
傳送:
2012年1月29日 星期日
【Android】Activity間的切換
Intent 類別的介紹,Intent可以幫助我們在不同的Activity中切換以及資料的傳遞。
Intent你可以把它當作是一個信件,它告訴了目前這個Activity它的下一個Activity是誰
以及它所包含要傳遞的資料。以下就來做一個簡單的Activity之間的切換:
以下範例以一個FirstActivity.java 以及SecondActivity.java 為例
他們所對應的 layout 為 main.xml以及second.xml。
在main.xml中有一個按鈕,按下去會前往SecondActivity,而在second.xml也有一個按鈕,
按下去會返回FirstActivity,以這樣的動作來解釋Activity間的切換。
首先是 FirstActivity.java
package org.sample.android;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
* @author allen
*
*/
public class FirstActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.button_id_first);
button.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
/* 以上兩行可以寫成 Intent intent = new Intent(FirstActivity.this, SecondActivity.class)
* 第一個參數是目前的Activity, 第二個參數是要前進的下一個Activity
* */
startActivity(intent);
finish(); //這行等於FirstActivity.this.finish();
}
});
}
}
2012年1月28日 星期六
【Android】CREATE TABLE android_metadata failed
關於 CREATE TABLE android_metadata failed 這一連串的例外
首先 一開始每支程式都好好的,莫名的出現這個例外
但是並不是錯誤 每個 Project 的 Activity 都可以正常啟動
但是一進去 AVD 畫面並載入成功後 會一直跳出例外訊息
去 DDMS 裡面看 大約的訊息類似如下
01-28 15:51:20.502: E/SqliteDatabaseCpp(139): CREATE TABLE android_metadata failed
01-28 15:51:20.622: D/PowerManagerService(78): bootCompleted
01-28 15:51:20.672: E/SQLiteDatabase(139): Failed to open the database. closing it.
01-28 15:51:20.672: E/SQLiteDatabase(139): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
.......
一長串的問題 好像都是關於一個 android_metadata 這個 Table 所造成的
不過我都還沒用到 SqlLite 就出現這種問題 也不太合理
不解決還不行 因為每次在AVD中關掉錯誤警告的視窗後,沒幾秒就會一直跳出來。。。
最後我的解決辦法是
在 Eclipse 中上方工具列 > Window > AVD manager > 點選你目前使用的虛擬機
> 按下右下方的 Start > 勾選 Wipe user data 這個選項
> 最後 AVD跑出來的結果 果真沒那個煩死人的錯誤訊息了
最後 在作一次上述動作 這次取消勾選 Wipe user data 這個選項
就大功告成了
首先 一開始每支程式都好好的,莫名的出現這個例外
但是並不是錯誤 每個 Project 的 Activity 都可以正常啟動
但是一進去 AVD 畫面並載入成功後 會一直跳出例外訊息
去 DDMS 裡面看 大約的訊息類似如下
01-28 15:51:20.502: E/SqliteDatabaseCpp(139): CREATE TABLE android_metadata failed
01-28 15:51:20.622: D/PowerManagerService(78): bootCompleted
01-28 15:51:20.672: E/SQLiteDatabase(139): Failed to open the database. closing it.
01-28 15:51:20.672: E/SQLiteDatabase(139): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
.......
一長串的問題 好像都是關於一個 android_metadata 這個 Table 所造成的
不過我都還沒用到 SqlLite 就出現這種問題 也不太合理
不解決還不行 因為每次在AVD中關掉錯誤警告的視窗後,沒幾秒就會一直跳出來。。。
最後我的解決辦法是
在 Eclipse 中上方工具列 > Window > AVD manager > 點選你目前使用的虛擬機
> 按下右下方的 Start > 勾選 Wipe user data 這個選項
> 最後 AVD跑出來的結果 果真沒那個煩死人的錯誤訊息了
最後 在作一次上述動作 這次取消勾選 Wipe user data 這個選項
就大功告成了
2012年1月26日 星期四
【Android】Activity的生命週期
可以用上面這張圖簡單解釋 Activity 的四個主要狀態
這對開發者而言,我們可以決定在什麼狀態作什麼事情,注意我們所撰寫的每一個Activity都有繼承(extends)一個Activity類別,也因此我們可覆寫很多狀態的方法,例如以下:
publc void
onCreate(Bundle savedInstanceState); //initial >
onStart()
publc void onStart(); //stop > active
publc void onResume(); //pause > active
publc void onPause(); //active > pause
publc void onStop(); //active > stop
publc void onDestroy(); //active
> killed
2012年1月25日 星期三
【Android】Activity介紹
Activity 是Android的基本處理單元,絕大多數的Activity都會有一個對應的頁面
在這裡所謂的頁面就是User在行動裝置上所看到的畫面(View)。
回顧上一章的 Hello World程式:【Android】Hello World 範例
我們在 /src 的org.sample.android.activity目錄下有一個Activity 為HelloWorldActivity.java
它所對應的View即是 /res/layout/main.xml
在 AndroidManifest.xml 中可以看到如下這一段的XML標籤
<activity
android:name=".HelloWorldActivity"
android:label="@string/app_name"
> <!— app_name 會註冊在 /res/values/strings.xml -->
<intent-filter>
<action android:name="android.intent.action.MAIN"
/>
<!— 以下這行指定此Activity為預設執行的主要Activity
所以當你啟動虛擬機的時候一定會看到這支Activity所對應的View-->
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
接著來稍微改寫 HelloWorldActivity以及它所對應的 main.xml,如下:
<?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"
>
<!- 如果要在此View的Activity中找到該元件,需要給它一個id
android:id=”@+id/<name>” 如此會在R.java中產生一個對應的程式
R.id.<name> 透過這行程式就可以找到你要的元件-->
<TextView android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
/>
</LinearLayout>
fill_parent:意指將該元件填滿它的父元件
wrap_content:意指該元件會完全包住它的所有內容(元件)
接著來看看 HelloWorldActivity.java
2012年1月24日 星期二
【Android】Hello World 範例
在Project Name 欄為內輸入Hello_World >
Next > 勾選SDK > Next
2012年1月23日 星期一
【Android】環境配置
1. 開發環境檢查
2. 安裝Android 3.2、Eclipse IDE、Android Plugin
訂閱:
文章 (Atom)





