2012年8月29日水曜日

Android ASP.NET(MVC2)で作成したWebAPIに接続する その4(JSON)

以前まで作成したWebAPIはXML文字列を返すものでした。
Android ASP.NET(MVC2)で作成したWebAPIに接続する その1
Android ASP.NET(MVC2)で作成したWebAPIに接続する その2
Android ASP.NET(MVC2)で作成したWebAPIに接続する その3

Android側ではXML文字列を解析するのですが、スマートフォンでXMLの解析は負荷が大きいので
WebAPI側でJSONを返すようにしたいと思います。

ASP.NET(MVC2)で作成したWebAPIでJSONを返す


以前作成したWebAPIのTestControler.vbのIndexメソッドを変更します。

TestControler.vb
Namespace MvcApplication1
    Public Class TestController
        Inherits System.Web.Mvc.Controller

        <HttpPost()>
        <ValidateInput(False)> _
        Public Function Index(ByVal collection As FormCollection) As JsonResult
             'パラメータとして渡されたID,NAMEを取得
            Dim id As Integer = CInt(collection.Item("id"))
            Dim name As String = collection.Item("name")

            'JSON形式で返す。返せるものはシリアライズ可能なオブジェクト
            Dim lst As New List(Of KeyValuePair(Of Integer, String))
            lst.Add(New KeyValuePair(Of Integer, String)(id, name))

            Return Json(lst)
        End Function

    End Class
End Namespace

WebアプリケーションにデータをPostするhtmlも変更します。
TestMvcApplication1.html
<html>
    <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>

 <body>
  <h2>MvcApplication1テスト</h2>
     <form action="http://localhost:3766/Test" method="post">
      <input type="text" name = "id" value="1" />
      <input type="text" name = "name" value="田中" />
         <input type=submit />
     </form>
 </body>
</html>

実行結果
[{"ID":1,"NAME":"田中"}]

ASP.NET(MVC2)で作成したWebAPIでDataTableのJSONを返す


.NETだったら、DataTableオブジェクトを返したいですよね~
そこでTestControler.vbのIndexメソッドを変更してみました。
    Dim tbl As New DataTable() 
    tbl.Columns.Add("ID", GetType(Integer)) 
    tbl.Columns.Add("NAME", GetType(String)) 
    tbl.Rows.Add(New Object() {id, name}) 
    Return Json(tbl)
TestMvcApplication1.htmlを実行すると、「型 'System.Reflection.Module' のオブジェクトのシリアル化を実行中に循環参照が見つかりました。 」とエラーになりました。
DataTableはJsonにシリアライズできないようです。

DataTableオブジェクトをJSONで返す方法は、きっと他にもあると思いますが今回は「JSON.NET」を使ってみたいと思います。
JSON.NETは.NETのインスタンスをJSONに変換してくれるライブラリです。
以下よりダウンロードします。
http://json.codeplex.com/
ダウンロードした「Json45r8.zip」を解凍します。
解凍してできたフォルダの「Bin」配下より、使用するFrameworkのバージョンフォルダからdllを、ソースコードの「bin」フォルダにコピーします。
※今回は「Json45r8\Bin\Net35\Newtonsoft.Json.dll」を使用します。

それではTestControler.vbのIndexメソッドをJSON.NETを使用した方法に変更してみます。

TestControler.vb
参照設定で先ほどコピーしたNewtonsoft.Json.dllを追加します。
Namespace MvcApplication1
    Public Class TestController
        Inherits System.Web.Mvc.Controller

        <HttpPost()> _
        <ValidateInput(False)> _
        Public Function Index(ByVal collection As FormCollection) As ActionResult
            'パラメータとして渡されたID,NAMEを取得
            Dim id As Integer = CInt(collection.Item("id"))
            Dim name As String = collection.Item("name")
            'DataTableを作成
            Dim tbl As New DataTable
            tbl.Columns.Add("ID", GetType(Integer))
            tbl.Columns.Add("NAME", GetType(String))
            tbl.Rows.Add(New Object() {id, name})
            'Json.NETを使用して返す。
            Dim jsonstr As String = Newtonsoft.Json.JsonConvert.SerializeObject(tbl, New Newtonsoft.Json.Converters.DataTableConverter())
            Return Content(jsonstr, "application/json")

        End Function

    End Class
End Namespace
TestMvcApplication1.htmlを実行した結果
[{"ID":1,"NAME":"田中"}]

AndroidでJSONを解析する。


Android側のコードです。
JSONを解析するにはJSONArrayやJSONObjectを使用します。
package com.example.helloandroid.activity;

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

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

import com.example.helloandroid.R;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    } 

    public void button1Click(View view) {
        //DefaultHttpClientを生成   
        HttpClient httpClient = new DefaultHttpClient();   
        //HttpPostを生成   
        HttpPost req = new HttpPost("http://IPアドレス:ポート番号/AndroidTest/Test");   
        //パラメータ作成   
        List<NameValuePair> params = new ArrayList<NameValuePair>(1);   
        params.add(new BasicNameValuePair("ID", "1"));   
        params.add(new BasicNameValuePair("NAME", "田中"));   
        //リクエスト   
        String strJson = "";   
        try {    
         req.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));   
         HttpResponse res = httpClient.execute(req);   
         int status = res.getStatusLine().getStatusCode();   
         if (status == HttpStatus.SC_OK) {   
          strJson = EntityUtils.toString(res.getEntity());   
         } else {   
           Toast.makeText(this, "接続失敗" + String.valueOf(status), Toast.LENGTH_LONG).show();
           return;
         }   
        } catch (Exception e) {   
           e.printStackTrace();   
        }   
        //Jsonを解析
        try {
            JSONArray element = new JSONArray(strJson);
            for (int i = 0; i < element.length(); i++) {
                JSONObject jsonObject = element.getJSONObject(i); 
                Toast.makeText(this, jsonObject.getString("NAME"), Toast.LENGTH_LONG).show();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
    

}

2012年8月27日月曜日

Android stopped unexpectedly (予期せず停止)

アプリを実行して「stopped unexpectedly (予期せず停止)」が表示され起動できない時は マニフェストファイルのパッケージ名やアクティビティ名が間違っている可能性が高いです。

2012年8月26日日曜日

Android データベースを作成する

以前、assetsフォルダにCreateTable文を配置しSQLiteOpenHelperクラスを使用して、データベースを作成しました。
Android SQLiteデータベースを作成する
Android SQLiteデータベースを作成する(SQL文をリソースファイルに定義する)


SQLiteOpenHelperクラスを使用したデータベース作成が、イマイチ使いにくいデス。(私には)


仕様
  1. データベースがあれば削除する。
  2. データベースを作成する。
  3. assets/sql/createtableフォルダに配置しているsqlを実行し、データベースにテーブルを作成する。
  4. Upgradeはない。


そこで自作のデータベースヘルパークラスを作ってみました。

MyDatabaseHelper.java
package com.example.helloandroid;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.content.res.AssetManager;
import android.database.sqlite.SQLiteDatabase;

public class MyDatabaseHelper {

    package com.example.helloandroid.service;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    import android.content.Context;
    import android.content.res.AssetManager;
    import android.database.sqlite.SQLiteDatabase;

    public class DatabaseHelper {

        /* データベース名 */
        private final static String DB_NAME = "HelloAndroid";   
        /* assetsフォルダのCreateTable文を配置しているディレクトリのパス*/
        private final static String CREATETABLESQL_DIR= "sql/createtable";

        /* コンテキストオブジェクト */
        private Context mContext;

        /**
         * コンストラクタ
         * @param context
         */
        public DatabaseHelper(Context context){
            mContext = context;
        }


        /**
         * createDatabase
         * @param context
         * DBがあれば削除する。
         * DBを作成する
         * DBテーブルを作成する。
         */
        public void createDatabase()throws IOException { 
            if (isExistDatabase(mContext) == true){
                //DBがあれば削除
                mContext.deleteDatabase(DB_NAME);  
            }
            //DB作成
            SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
            //DBテーブル作成
            createTable(mContext,db);
        }

        /**
         * getReadableDatabase
         * 読込み用でデータベースをオープンします
         * @return
         */
        public SQLiteDatabase getReadableDatabase() { 
            SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_WORLD_READABLE, null);
            return db;
        }

        /**
         * getWritableDatabase
         * 書き込み用でデータベースをオープンします
         * @return
         */
        public SQLiteDatabase getWritableDatabase() { 
            SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME, Context.MODE_WORLD_WRITEABLE, null);
            return db;
        }

        /**
         * isExistDatabase
         * データベースをが存在するかを取得します。
         * @param context
         * @return true=存在する  false=存在しない
         */
        private static boolean isExistDatabase(Context context){
            boolean result = false;
            if ( context.getDatabasePath(DB_NAME).exists()){
                result = true;
            }
            return result;
        }

        /**
         * createTable
         * データベースにテーブルを作成します。
         * assets/sql/createに定義したsql文を実行します。
         * @param context
         * @param db
         * @throws IOException
         */
        private static void createTable(Context context,SQLiteDatabase db) throws IOException{
            AssetManager as = context.getResources().getAssets();   
            String files[] = as.list(CREATETABLESQL_DIR); 
            for (int i = 0; i < files.length; i++) {   
                String sql = readFile(as.open(CREATETABLESQL_DIR + "/" + files[i]));
                db.execSQL(sql);   
            }
        }

        /** 
         * readFile 
         * ファイルから文字列を読み込みます。  
         * @param is InputStream 
         * @return ファイルの文字列  
         * @throws IOException  
         */  
        private static String readFile(InputStream is) throws IOException{   
            BufferedReader br = null;   
            try {   
                br = new BufferedReader(new InputStreamReader(is,"SJIS"));   

                StringBuilder sb = new StringBuilder();       
                String str;         
                while((str = br.readLine()) != null){         
                    sb.append(str +"\n");        
                }       
                return sb.toString();   
            } finally {   
                if (br != null) br.close();   
            }   
    }
}

MainActivity.java
import android.view.View;

import com.example.helloandroid.R;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    } 

    /**
     * button1Click
     * button1クリック時の処理
     * データベースを作成します。
     */
    public void button1Click(View view) {     
        MyDatabaseHelper dbHelper = new MyDatabaseHelper(this);
        try {  
            dbHelper .createDatabase();
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
}

Android データベースTips

データベースの存在を確認するには
    context.getDatabasePath(DB_NAME).exists()

データベースを削除するには
    context.deleteDatabase(DB_NAME); 

時間を計測するには
    
long start = System.currentTimeMillis();
//計測する処理
long stop = System.currentTimeMillis();
System.out.println((stop - start) + " ミリ秒です。");

2012年8月24日金曜日

Android ASP.NET(MVC2)で作成したWebAPIに接続する その3

Android ASP.NET(MVC2)で作成したWebAPIに接続する その1
Android ASP.NET(MVC2)で作成したWebAPIに接続する その2

前回までに作成したWebAPIにAndroidアプリからアクセスするプログラムを作ります。

MainActivtyを作成し、ボタンを1つ配置します。

MainActivtyのレイアウトMainActivty
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="21dp"
        android:onClick="button1Click"
        android:text="button1" />

</RelativeLayout>


MainActivtyのコード
package com.example.helloandroid;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    /*
     * button1クリック時の処理
     */
    public void button1Click(View view) {
        //送信する文字列
        StringBuilder testXml = new StringBuilder();
        testXml.append("");
        testXml.append("");
        testXml.append("");
        testXml.append("1");
        testXml.append("田中");
        testXml.append("");
        testXml.append("");
        testXml.append("2");
        testXml.append("山田");
        testXml.append("");
        testXml.append("");
        testXml.append("3");
        testXml.append("野原");
        testXml.append("");
        testXml.append("");
        //DefaultHttpClientを生成
        HttpClient httpClient = new DefaultHttpClient();
        //HttpPostを生成
        HttpPost req = new HttpPost("http://IPアドレス:ポート番号/AndroidTest/Test");
        //パラメータ作成
        List<NameValuePair> params = new ArrayList<namevaluepair>(1);
        params.add(new BasicNameValuePair("testxml", testXml.toString()));
        //リクエスト
        String s = "";
        try {
         
         req.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
         HttpResponse res = httpClient.execute(req);
         int status = res.getStatusLine().getStatusCode();
         if (status == HttpStatus.SC_OK) {
           s = EntityUtils.toString(res.getEntity());
         } else {
           s = "接続失敗" + String.valueOf(status);
         }
        } catch (Exception e) {
           e.printStackTrace();
        }
        Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();   
    }
}


マニフェストファイルの修正
インターネットへの接続を許可する設定を追加します。
<uses-permission android:name="android.permission.INTERNET" />


実行結果

Android ASP.NET(MVC2)で作成したWebAPIに接続する その2

Android ASP.NET(MVC2)で作成したWebAPIに接続する その1 で作成したWebAPIをIISに設定します。
 
IIS の各バージョンでの ASP.NET MVC の使用
  •  IIS 7.0/7.5 (統合モード) - ASP.NET ルーティングの使用には、特別な構成は不要。
  •  IIS 7.0/7.5 (クラシック モード) - ASP.NET ルーティングの使用には、特別な構成が必要。
  •  IIS 6.0 以下 - ASP.NET ルーティングの使用には、特別な構成が必要。
今回はWindowsServer2003 SP2、IIS 6.0、ASP.NET 2.0に配置します。
 
IIS7.0より以前のバージョンでASP.NET MVCを使用するには、2つの方法があります。
  • (1)ルート テーブルを変更して、ファイル拡張子を使用する
  • (2)ワイルドカード スクリプト マップ を作成する
Web サーバーにアクセスできない場合 (たとえば、ASP.NET MVC アプリケーションがインターネット サービス プロバイダーによってホスティングされている場合) は、(1)を使用します。
URL の表示を維持する必要があり、Web サーバーにアクセスできる場合には (2)が使用できます。
 
今回は(2)の方法でIISに配置します。

まず仮想ディレクトリを作成します。
エイリアスは「AndroidTest」
Webサイトのコンテンツのディレクトリには、ソリューション以下のフォルダを指定
仮想ディレクトリのアクセス許可は
 「読み取り」チェックONを追加
 「ASPなどのスクリプトを実行する」チェックONを追加
※IISに配置する前にWebサイトのweb.configのデバッグをFalseに設定すること
作成した仮想ディレクトリ右クリックし、[プロパティ] をクリックします。
[仮想ディレクトリ] タブをクリックし、[構成] ボタンをクリックします。
 
 
 
 [マッピング] タブを選択し、拡張し「aspx」の実行可能ファイルパスをコピーします。
[挿入] ボタンをクリックします。
 
 
 
[挿入] ボタンをクリックし、先ほどコピーしたパスを貼付け、「ファイルの存在を確認する」チェックをOFFにします。
 


ASP.NET MVCアプリケーションのGlobal.asaxを開きRootマップを追加します。
 Note: For instructions on enabling IIS6 or IIS7 classic mode, 
' visit http://go.microsoft.com/?LinkId=9394802

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

        ' MapRoute takes the following parameters, in order:
        ' (1) Route name
        ' (2) URL with parameters
        ' (3) Parameter defaults
        routes.MapRoute( _
             "Default", _
             "{controller}/{action}/{id}", _
             New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
         )

        '追加
        routes.MapRoute( _
            "Root", _
            "", _
            New With {.controller = "Home", .action = "Index", .id = ""} _
        )
       
    End Sub

    Sub Application_Start()
        AreaRegistration.RegisterAllAreas()

        RegisterRoutes(RouteTable.Routes)
    End Sub
End Class
動作確認をします。
http://IPアドレス:ポート番号/AndroidTest」にアクセスすると、テスト画面が表示されます。
 
 
 
WebアプリケーションにデータをPostするhtmlを変更します。
actionのurlを変更します。
TestMvcApplication1.html
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<h2>MvcApplication1テスト</h2> 
<form action="http://IPアドレス:ポート番号/AndroidTes/Test" method="post"> 
<textarea name="testxml" style="width:600px; height:130px;"> 
<?xml version='1.0' encoding="UTF-8" ?> 
<root> 
    <user> 
        <id>1</id> 
        <name>田中</name> 
    </user> 
    <user> 
        <id>2</id> 
        <name>山田</name> 
    </user> 
    <user> 
        <id>3</id> 
        <name>野原</name> 
    </user> 
</root> 
</textarea><br /> 
 <input type=submit /> 
 </form> 
</body> 
</html> 
ブラウザから開き、クエリ送信ボタンをクリックします。
 
 
 
 

Android ASP.NET(MVC2)で作成したWebAPIに接続する その1

まずはWebAPIを作成します。

Web APIとは
Web APIは、HTTP(HyperText Transfer Protocol)をベースにデータをやり取りするのが特徴です。
HTTPベースであるため、情報を提供するサーバーとのやり取りは、一般的なWebサイトへのアクセスと同等に行えます。
HTTPを使った一般的なWeb APIでは、単純なリクエスト/レスポンスによるデータ交換が中心となります。

VisualStudioでWeb APIを作成するには
「ASP.NET MVC Webアプリケーション」を 作成します。
ASP.NETMVCはVisualStudio2010では標準で対応していますが、VisualStudio2008では追加パッケージを導入しないと使用することができません。
現在ASP.NET MVCのバージョンは4までありますが、MVC2はASP.NET3.5、MVC3以降はASP.NET4.0が必要です。
VisualStudio2008ではMVC2まで導入可能です。
今回はVisualStudio2008 ASP.NET MVC2でWebAPIを作成します。

ASP.NET MVC2でWebAPIを作成する


以下のサイトよりASP.NET MVC2をダウンロードします。
インストールにはVisualStudio2008にServicePack1をインストールしておく必要があります。
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=22079

インストールが終了したら、Webアプリケーションを作成します。
VisualStudio2008を起動し、「ASP.NET MVC2 Empty Web Application」を選択します。

とりあえず、確認用のページを作成します。
「Controlers」フォルダを右クリックし「Controler」を選択、「HomeControler」を追加します。


「Views」フォルダを右クリックで「新しいフォルダ」を選択し、「Home」フォルダを作成します。
「Home」フォルダを右クリックし「View」を選択し、「Index」ページを追加します。


Indexページを実行したとき、真っ白だとわかりにくいので、Body要素に以下を記載しときます。
<div>
<p>MvcApplication1 For Android Test</p>
<div&gt


実行してみます。



今回は以下のようなxmlを受信し、すべてのnameタグの要素をカンマ区切りで繋げた文字列をxmlで返すWebAPIを作ります。
<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <user>
        <id>1</id>
        <name>田中</name>
    </user>
    <user>
        <id>2</id>
        <name>山田</name>
    </user>
    <user>
        <id>3</id>
        <name>野原</name>
    </user>
</root>

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <user>田中,山田,野原</user>
</root>


「Controlers」フォルダを右クリックで「Controler」を選択し、「TestControler」を追加
TestControler.vbのIndexメソッドにコードを書いていきます。
Imports System.Xml


Namespace MvcApplication1
    Public Class TestController
        Inherits System.Web.Mvc.Controller
        '
        ' GET: /Test
        <HttpPost()> _
        &lt:ValidateInput(False)> _
        Public Function Index(ByVal collection As FormCollection) As ActionResult
            'パラメータとして渡されたXML文字列を取得
            Dim xmlStr As String = collection.Item("testxml")
            '文字列よりXMLを作成
            Dim reqXmlDoc As New XmlDataDocument
            reqXmlDoc.LoadXml(xmlStr)
            'XMLより「name」ノードの値を取得
            Dim nodeList As XmlNodeList = reqXmlDoc.GetElementsByTagName("name")
            Dim namelist As New List(Of String)
            For Each node As XmlNode In nodeList
                namelist.Add(node.InnerText)
            Next

            '処理結果をXMLとして返す
            Dim resXmlDoc As New XmlDocument
            Dim declaration As XmlDeclaration = resXmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
            resXmlDoc.AppendChild(declaration)
            Dim root As XmlElement = resXmlDoc.CreateElement("root")
            resXmlDoc.AppendChild(root)
            Dim element As XmlElement = resXmlDoc.CreateElement("user")
            element.InnerText = String.Join(",", namelist.ToArray)
            root.AppendChild(element)
            Return Content(resXmlDoc.OuterXml, "application/xml")
        End Function

    End Class

End Namespace

WebアプリケーションにデータをPostするhtmlを作成します。
TestMvcApplication1.html
ファイルはutf-8で作成しないと日本語が文字化けします。
formのactionに指定するurlは、適宜変更してください。
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<h2>MvcApplication1テスト</h2> 
<form action="http://localhost:53069/Test" method="post"> 
<textarea name="testxml" style="width:600px; height:130px;"> 
<?xml version='1.0' encoding="UTF-8" ?> 
<root> 
    <user> 
        <id>1</id> 
        <name>田中</name> 
    </user> 
    <user> 
        <id>2</id> 
        <name>山田</name> 
    </user> 
    <user> 
        <id>3</id> 
        <name>野原</name> 
    </user> 
</root> 
</textarea><br /> 
 <input type=submit /> 
 </form> 
</body> 
</html> 

Webアプリケーションを実行した状態で上のhtmlをブラウザから開き、クエリ送信ボタンをクリックします。


実行結果




Android 久しぶりにAndroidアプリを実行するとエラーになる

1年ぶりに開発環境を新しくして、Androidアプリを起動すると
「Error generating final archive: Debug Certificate expired on」となり、実行できません。

検索すると以下のページに解決方法がありました。
「入隠者通信 ~病を嗜む~」さんのサイト
http://d.hatena.ne.jp/hypercrab/20100619/1276925032#chttp://d.hatena.ne.jp/hypercrab/20100619/1276925032#c">http://d.hatena.ne.jp/hypercrab/20100619/1276925032#c
>
どうやら、しばらく開発環境を使ってないとこのエラーがでるようです。

解決方法は
(1)C:\ユーザー\XXXX\.android の下にある debug.keystore を削除する。
(2)Windows の時計のタイムゾーンの設定を「大阪,札幌,東京」から、適当に違うタイムゾーンに変更する。
(3)Eclipseの「プロジェクト」 メニューの 「クリーン」 を実行する。(debug.keystore が作り直される。)
(4)タイムゾーンを元に戻す.

参考サイトのコメントに記載されていますが、OSにより以下の(2)(4)が必要なかったりするようです。

Androi 最新の開発環境

また1年ぶりの投稿です。
第二子を産んでました(((o(*゚▽゚*)o)))

久しぶりにAndroidのコードを書くのですが、開発環境が随分変わっていますね。
最新の環境に入れ替えたいと思います。

Javaのインストール


以下のサイトからJDKをダウンロードします。

http://www.oracle.com/technetwork/java/javase/downloads/index.html



ダウンロードした「jdk-7u6-windows-i586.exe」を実行し、JDKのインストールを行います。

インストールが終了したら、環境変数を設定します。
Vistaの場合、コンピュータのプロパティ画面より「システムの詳細設定」リンクをクリックし「システムプロパティ画面」を開きます。

「詳細設定」タブの「環境変数」ボタンをクリックします。


「JAVA_HOME」の値を、先ほどJDKをインストールしたパスに変更します。
JDKのパスはデフォルトで「C:\Program Files\Java\jdk1.7.0_06」になっています。


「システム環境変数」のリストより「Path」を選択し、「%JAVA_HOME%bin」が含まれていることを確認します。
Pathに含まれていない場合は、編数値の末尾に「;」をつけ、「%Java_HOME%bin;」を追記します。


Eclipseのインストール


以下のサイトからEclipse4.2をダウンロードします。
http://www.eclipse.org/downloads/

ダウンロードしたファイル「eclipse-jee-juno-win32.zip」を解凍します。
解凍してできた「eclipse」フォルダを任意の場所に配置します。
C:\Program Files\eclipse4.2\に配置

Eclipseの日本語化


「Pleiades」というサードパーティ製のソフトウェアを使用します。 以下のページよりダウンロードします。
http://mergedoc.sourceforge.jp/
Eclipseのバージョンが4.2なので最新版をダウンロードします。
ダウンロードしたファイル「pleiades.zip」を解凍します。
解凍してできた「pleiades」フォルダの中身をすべて、「C:\Program Files\eclipse4.2\eclipse」フォルダの中に上書きします。

 eclipse.ini を編集します。
C:\Program Files\eclipse4.2\eclipse\eclipse.iniをテキストエディタで開きます。
※Windowsのnotepadだと改行コードがうまく設定できないので他のエディタで開きます。
最後に「-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar」1行を追記します。

-startup

plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar

--launcher.library

plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120522-1813

-product

org.eclipse.epp.package.jee.product

--launcher.defaultAction

openFile

--launcher.XXMaxPermSize

256M

-showsplash

org.eclipse.platform

--launcher.XXMaxPermSize

256m

--launcher.defaultAction

openFile

-vmargs

-Dosgi.requiredJavaVersion=1.5

-Dhelp.lucene.tokenizer=standard

-Xms40m

-Xmx512m

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

eclipseのクリーン起動を行います。
C:\Program Files\eclipse4.2\eclipse\eclipse.exe -clean.cmdをダブルクリックして実行します。
eclipse が起動し日本語化されていることを確認します。
これは,日本語化に伴う作業なので、1回だけ実行します。
通常Eclipse を起動するときは、 eclipse.exe をダブルクリックして実行します。


Android SDKのインストール


Android SDKはAndroidアプリを開発するために必要なライブラリや、AndroidアプリをPC上で動作させるためのAndroid端末エミュレータなどの開発ツールがまとまった開発キットです。
以下のページよりダウンロードします。
http://developer.android.com/intl/ja/sdk/index.html

ダウンロードした「installer_r20.0.3-windows.exe」を実行します。

Android Devlopment Tools(ADT)のインストール

Android Devlopment Tools(ADT)をインストールします。
ADTはExlipseにAndroidアプリの開発機能を追加するためのプラグインです。
Eclipseからインストールします。
Eclipseを起動し、 「ヘルプ」メニューにある「新規ソフトウェアのインストール…」 を選択します。
開いたダイアログの「追加」ボタンを押します。

「リポジトリーの追加」ダイアログに以下を入力します。
名前:任意
ロケーション:ADTプラグインの配布サイトのURL 「https://dl-ssl.google.com/android/eclipse/」
インストールする「開発ツール」および「NDKプラグイン」をチェックし、「次へ」ボタンをクリックします。
インストールの途中で警告が出ますが、無視してOKをクリックします。 インストールが完了したらEclipseを再起動します。

ADTプラグインの設定

Eclipseの「ウィンドウ」メニューの「設定」を選択しします。
左側のリストからAndroidを選択します。
SDK LocationにAndroid SDKをインストールしたフォルダを設定し、設定画面のOKボタンを押してください。
インストールフォルダはデフォルトで「C:\Program Files\Android\android-sdk」です。

Android API のインストール

ADTプラグインの設定が完了したらAndroid SDK Managerを起動し、Androidアプリ開発に必要なAPIをインストールします。
Eclipseの「ウィンドウ」メニューの「Android SDK マネージャー」を選択しします。
開発に必要なAndroidのバージョンを選択します。
「Tools」「AndroidX. (APIX)」を選択し、インストールをクリックします。


AVD(Android Virtual Device)の作成

AVDとはAndroid端末をエミュレートするためのソフトウェアで、実際の端末がなくともそれに近い環境でアプリの動作を確認することができます。
Eclipseをの 「ウィンドウ」メニューにある「AVD マネージャー」 を選択します。
開いたダイアログの「新規」ボタンをクリックします。
エミュレータの設定を行います。
登録したエミュレータが一覧に表示されるので、リスから選択し、「開始」をクリックするとエミュレータが起動します。
エミュレータが起動すればOKです。