SQLの窓

2013年06月13日


Android(ADT Eclipse) 用 ボタンイベントテンプレート

Android の一般的なボタンのイベントコードを作成します
Button ${word_selection} = (Button) findViewById(R.id);
${word_selection}.setOnClickListener(new View.OnClickListener() {
	public void onClick(View v) {
		android.util.Log.i("i","ボタンイベント:${word_selection}");
	}
});


ボタン作成



追加したテンプレート



変数のみタイプして選択



CTRL+SPACE 後、一番下までスクロール



選択して、残りは id 設定のみ



id 選択



完成





posted by lightbox at 2013-06-13 01:28 | Android | このブログの読者になる | 更新情報をチェックする

2013年06月08日


Android から Post 投稿 / HttpPostAndXml extends AsyncTask<Map, Void, Document>

Android の インターネットアクセスでは、AsyncTask がついて回るので、とにかくコンパクトにして、ADT の支援機能をうまく使って記述できるように頑張ってみました。とにかく、『使える』事を最優先にすると、目的毎にクラスを作ったほうが良いので、結果が XML の Documnet で返ってくるようにしています。( もちろん、JSON 用なら別に作成します )
package com.example.httppost;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import android.os.AsyncTask;
import android.util.Log;

public class HttpPostAndXml extends AsyncTask<Map, Void, Document> {

	@Override
	protected Document doInBackground(Map... params) {
		
		Document xml_data = null;
		
		Map<String,String> myArg = params[0];

		try {
			// ターゲット
			URL url = new URL(myArg.get("url"));
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setConnectTimeout(30000);
			http.setReadTimeout(30000);
			http.setDoInput(true);	// application/x-www-form-urlencoded がセットされる
			http.setRequestMethod("POST");
			
			OutputStreamWriter osw = new OutputStreamWriter(http.getOutputStream());
			BufferedWriter bw = new BufferedWriter(osw);
			
			Iterator<String> it =  myArg.keySet().iterator();
			String key = null;
			String value = null;
			String data = "";
			while(it.hasNext()) {
				key = it.next().toString();
				if ( key.equals("url") ) {
					continue;
				}
				value = myArg.get(key);
				if ( !data.equals("") ) {
					data += "&";
				}
				data += key + "=" + URLEncoder.encode(value, "utf-8") ;
			}
			
			Log.i("",data);
				
			bw.write( data );

			bw.close();
			osw.close();
			
			DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dbfactory.newDocumentBuilder();
			// InputStream から Documentオブジェクトを取得
			xml_data = builder.parse(http.getInputStream());
			// 接続解除
			http.disconnect();
		}
		catch(Exception e) {
			Log.i("MyList", e.getMessage());
		}
		return xml_data;
	}
	

}


呼び出し方法
package com.example.httppost;

import java.util.HashMap;
import java.util.Map;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	// ボタンのプロパティに設定するイベント
	public void postAction(View v) {
		
		EditText et = (EditText)this.findViewById(R.id.editText1);
		
		Map<String,String> map = new HashMap<String,String>();
		map.put("url", "呼び出す URL");
		map.put("u", et.getText().toString());
		
		new HttpPostAndXml(){

			@Override
			protected void onPostExecute(Document result) {

				if ( result == null ) {
					return;
				}
				
				// ルート要素
				Element root = result.getDocumentElement();
				NodeList node_list = root.getElementsByTagName("item");
				for( int i = 0; i < node_list.getLength(); i++ ) {
					
					NodeList nl = ((Element)node_list.item(i)).getElementsByTagName("title");
					Log.i("MyList", nl.item(0).getFirstChild().getNodeValue());		
				}
				
			}
			
		}.execute(map);
	}

}

HttpPostAndXml の無名クラスで、http のアクセス部分は内部の非同期部分にまかせて、結果部分のみ Override しています。実行時の引数としては、HashMap に "url" を含ませて、それ以外は全て送信データとして UTF8 で UrlEncode して送信しています。

テスト画面定義
<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:onClick="postAction"
        android:text="Button" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_alignRight="@+id/button1"
        android:layout_below="@+id/button1"
        android:layout_marginTop="20dp"
        android:ems="10"
        android:gravity="top|left"
        android:height="200dp"
        android:inputType="textMultiLine"
        android:scrollbars="vertical" >
    </EditText>

</RelativeLayout>


posted by lightbox at 2013-06-08 21:43 | Android | このブログの読者になる | 更新情報をチェックする

2013年05月27日


Android ADT : AsyncTask コードの取り出し( 匿名のインナー型 でその場で実行する )

AsyncTask は、abstract class です。継承して新たにクラスを作って処理するものだとは思いますが、AsyncTask が本来その場で書くつもりのものを非同期で処理する必要にせまられて仕方なく使うので、このような書き方でも動作すれのであれば、簡単に済ませられるので良いのでは無いかと思っています。

※ 取り急ぎ、実装したい場合はとにかく他の参照も final で設定しなおせば中で使えます。

まず、new Async とタイプして、CTRL+SPACE で候補の中の『匿名のインナー型』を選択します。



以下のように、ジェネリッククラスとしての型の引数が説明になっています



そこから、本来の型を設定して( 後から変更するのであれば、<Void,Void,Void> でもいいです)から、ブロック内にカーソルを持っていきます。



※ 『型』はインポートしている必要があるので、ここでは Drawable をインポートします



メニューの『ソース』から、メソッドのオーバーライド/実装 を選択して、必要なメソッドを選択します



処理ブロックが完成します



最後に必要な引数を execute メソッドに渡します



実際の実装コード

Android 4.2.2 : インターネット上の画像の表示 / AsyncTask<String, Void, Drawable>



posted by lightbox at 2013-05-27 16:51 | Android | このブログの読者になる | 更新情報をチェックする

Android ADT : ボタンのクリックコードの取り出し

最初の setOnClickListener を候補から取り出して、以下の状態になります。



その後、カーソル位置に new をタイプして CTRL+SPACE で次の候補を出して選択するとほぼ完成。



最後の行にセミコロンを追加すると完成です。





posted by lightbox at 2013-05-27 16:29 | Android | このブログの読者になる | 更新情報をチェックする

Android 4.2.2 : インターネット上の画像の表示 / AsyncTask<String, Void, Drawable>



Android SDK の変わり目( 4.0.3 ) で、AsyncTask を使うようになりましたが、わざわざクラスを作成するほどの処理でも無い場合は、以下のように『無名クラス』で実行すると簡単です
package com.example.httpimageview;

import java.io.InputStream;
import java.net.URL;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        // 画面定義上の View を ID から取得して、目的のクラスでキャスト
        Button button = (Button)this.findViewById(R.id.button1);
        // 引数が、onClickListener インターフェイスの setOnClickListener を実行  
        button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Log.i("button", "クリックされました");
				
				String url = "https://lh3.googleusercontent.com/-0ZRziQFtS9E/UKuFllC5bVI/AAAAAAAAJm0/4cP6WwTLoSk/s800/dl_de772d3b5ed4837976694426a015383f.jpg";
				String option = "引渡しテスト";
				
				// Android 非同期処理用『無名』クラス
				// String は、doInBackground
				// Void は、Progress 用( ここでは未使用 )
				// Drawable は、doInBackground の戻り値でかつ、onPostExecute の引数
				new AsyncTask<String, Void, Drawable>() {

					// 非同期処理
					@Override
					protected Drawable doInBackground(String... params) {
						// params は、可変長引数
						Log.i("button", params[0]);
						Log.i("button", params[1]);
						
						Drawable img_data = null;

			    		try {
			    			// インターネット上の画像をバイナリで取得して、Drawable に変換
				    		URL url = new URL( params[0] );
				    		InputStream is = (InputStream)url.getContent();
				    		img_data = Drawable.createFromStream(is, "");
			    		}
			    		catch(Exception e) {
			    			Log.i("button", e.getMessage());
			    		}						
						return img_data;
					}

					// 画面描画用
					@Override
					protected void onPostExecute(Drawable result) {
						
						if ( result != null ) {
							// imageView1 には、プロジェクト内のリソースを初期表示しているので、
							// null でなかった場合のみ表示変更
							ImageView imageView = (ImageView)findViewById(R.id.imageView1);
							imageView.setImageDrawable(result);
						}
					}
					
				}.execute(url,option);	// クラス作成後メソッドを実行
				
			}
		});
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

     <Button
         android:id="@+id/button1"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_alignParentRight="true"
         android:layout_alignParentTop="true"
         android:text="画像表示" />

     <ImageView
         android:id="@+id/imageView1"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_alignLeft="@+id/button1"
         android:layout_below="@+id/button1"
         android:src="@drawable/ic_launcher" />

</RelativeLayout>
関連する記事

Android ADT : ボタンのクリックコードの取り出し

Android ADT : AsyncTask コードの取り出し( 匿名のインナー型 でその場で実行する )



posted by lightbox at 2013-05-27 16:20 | Android | このブログの読者になる | 更新情報をチェックする

2013年04月20日


Android エミュレータでウェブカメラを使いたいだけなのに、必要無いソフトが沢山インストールされて常駐されました。

2013-04-20 : 更新

記事を書いてから、しばらくして PC を立ち上げたら、再び eReg.exe が起動しました。スタートアップからは削除しています。製品も接続していません。起動場所がわかりませんので、本体をリネームして様子を見ます。ちなみに、レジストリには存在します。eReg.ini を見ると、48時間毎に起動するようではあります・・・

しかも、起動したという事で、再びスタートアップに登録されました。なんじゃこりゃ。やってる事ウィルスと変わらないんですが。

結局、『プログラムと機能』から、『ドライバパッケージ』のみを残して後は削除しました。そうすると、eReg.exe の入っているフォルダごとなくなっており、サービスも削除されていました。



追加情報として、動作確認は面倒なのでしませんが、ウェブカメラを繋いだ状態で Windows Update の詳細を見ると以下のようなソフトを見る事ができます。
Logitech - Communication Device, Streaming Media and Broadcast - Logitech Mic (Communicate STX)
ダウンロード サイズ: 2.1 MB
この更新プログラムを有効にするには、コンピューターを再起動する必要があります。
更新プログラムの種類: オプション
Logitech Communication Device, Streaming Media and Broadcast software update released in October, 2009
最初の記事 対象製品は Qcam Communicate STXトレードマーク(TM)(QVC-71) です。相当昔に購入したもので、最新のドライバをダウンロードしてインストールしました。( それでもインストーラの 1/3 で中止したんですが ) 目的は最新の ADT( Android Development Tools ) では、ウェブカメラの設定が簡単になっているので動作確認の為に行いました。Microsoft のドライバでは、Google+ の投稿には使えるのですが、エミュレータ上ではエラーになるので最新のドライバをインストールして、無事 エミュレータ上で表示可能になりました。( 表示はいろいろと逆さまなんですが、テストには支障なし ) ▼ DDMS のファイルエクスプローラで取り出した画像 DDMS のファイルエクスプローラ 止めた余計なアプリ(止めても ADT では支障なし) ❶ c:\program files\logicool\logicool webcam software\lws.exe ❷ c:\program files\logicool\logicool vid\vid.exe この二つは、ユーザとPC の レジストリの自動起動部分に ❸ C:\Program Files\Logicool\Logicool WebCam Software\eReg.exe これは、プログラムメニューのスタートアップに入っていて、製品の登録をさせようとします ❹ C:\Program Files\Common Files\LogiShrd\LVMVFM\LVPrcSrv.exe なんか、謎のサービスが自動起動になっています Process Monitor(Injector service) とありますが、なんだか良く解りません。 とにかく少し酷すぎると思います。 こいつらは、WEBカメラが USB に存在しなくても起動されます 関連する記事 フリーソフト : Autoruns for Windows : 自動起動アプリケーションを一時解除等 ドライバの状態 こんな感じで、これだけが必要だったんですけどね。 ドライバの詳細を見ても、wuapp32.exe というファイル以外は全て dll で、製品が USB に接続されなければ、当然起動されません。( 確認したら、接続しても起動されなかった・・・何これ? ) タスクマネージャから実行中のソフトの情報収集 『説明』でだいたいの想像は付きますが、『ファイルの場所を開く』で、どのフォルダにあるか解るので、どういうソフトか、フォルダから知る事ができます。また、ファイル名そのものを WEBで調べれば、どういう会社のものかはたいてい解るはずです。 問題は、ここで動いているものがどこから起動されたかという事ですが、一般的なものは、『スタートアップ』フォルダで、これは削除すれば終わり。次にレジストリの自動起動部分が、PC 全体と、ユーザ毎とで少なくとも二箇所あるので、専用のフリーソフトで対処できます。 あとは、サービスタスクスケジューラなので、これは正攻法で止める必要があるのですが、どのサービスかを特定するのに、タスクスマネージャの『サービスの表示』で関連するサービスを特定できる場合があります。 サービスを特定したら、手動にして終了させればいい場合がほとんどですが、『無効』にしないと勝手に起動するアプリケーションもあり、酷いのになると『無効』にしても勝手に生き返るものもあります。それは、他にも関連するアプリが起動済みであるという事なので、さらに調査が必要になります。 タスクスケジューラに登録されているアプリケーションはだいたいは必要なものが多いので、むやみに削除せずに、よく調査・確認してから削除するといいでしょう。 Google と タスクスケジューラ 更新履歴 2013-04-18 : 記事作成 2013-04-20 : トラブル報告
posted by lightbox at 2013-04-20 17:58 | Android | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり