顯示具有 android 標籤的文章。 顯示所有文章
顯示具有 android 標籤的文章。 顯示所有文章

2012年3月12日 星期一

【Cordova】環境配置與範例

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年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吧。


2012年2月4日 星期六

【Android】android.os.NetworkOnMainThreadException

今天在寫Android 程式模擬檔案上傳到遠端的時候遇到的問題

以下是程式片段:

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) 

或是:

(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下設定Buttonandroid: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 這個選項

就大功告成了




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" >
    <!- 如果要在此ViewActivity中找到該元件,需要給它一個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 範例


*   開啟Eclipse > 上方功能列 > File > Project > 選擇Android Project > Next

Project Name 欄為內輸入Hello_World > Next > 勾選SDK > Next


2012年1月23日 星期一

【Android】環境配置


        1.    開發環境檢查
*   Microsoft Windows XP(32 bits) /Microsoft Window 7 (32/64 bits) OS
*   Mac OS X 10.5.8 或更新版本(x86)
*   Linux Ubuntu
*   JDK 6.0 以上
*   Eclipse IDE 3.7 (Indigo)

2.    安裝Android 3.2Eclipse IDEAndroid Plugin
*   下載並安裝 Android SDK and AVD manager (http://developer.android.com/sdk/index.html)

*   上一步驟,我是選擇installer_r16-windows.exe (Recommended) 由執行檔來安裝在執行安裝過程中,他會先檢查你的電腦內是否有安裝JDK,如果電腦裡沒JDK則務必先安裝JDK。之後你只要選擇你要安裝的路徑即可。

*   安裝完成後可以開啟SDK Manager,並找到Android 3.2(API13) 這個項目並勾選 SDK PlatformSamples for SDKGoogle APIs by Google Inc.。並按右下方的 Install packages…



  *   安裝成功之後應該如下圖所示: