プロジェクト -> インポート

Posted by muchag | Android |
初回投稿:2011-04-26 (火) 14:16:45 | 最終更新:2011-04-26 (火) 14:20:47

既存のプロジェクトを
Eclipse へインポートする手法。

[ファイル]-[インポート] から

 
「既存のプロジェクトをワークスペースへ」を選択して
次へ。

 
プロジェクトフォルダが存在する場合は
「ルート・ディレクトリーの選択」->「参照」

プロジェクトの圧縮ファイル(.zip)が存在する場合は
「アーカイブ・ファイルの選択」->「参照」

で、当該ディレクトリなりファイルを指定する。

 
「ルート・ディレクトリーの選択」の場合、指定するフォルダは
「.project」ファイルがあるフォルダ、とも
「AndroidManifest.xml」があるフォルダ、とも書かれているが
Android の場合は結果的には同じことのようだ。

ただ、Eclipse の使い方で考えたら
「.project」ファイルがあるフォルダ、が正しい気がする。

 
というようりも、そもそもディレクトリを指定すると
それ以下のプロジェクトを全部拾ってくれる仕組みになっている。

複数ある場合は、必要なものだけをチェックすればよいわけで
あまり深く考える必要はなさそうだ。

Posted by muchag | Android |
初回投稿:2011-04-26 (火) 14:16:45 | 最終更新:2011-04-26 (火) 14:20:47

指定の位置に画像を配置 その2

Posted by muchag | Android |
初回投稿:2011-04-25 (月) 17:41:15 | 最終更新:2011-04-25 (月) 23:45:50

指定の位置に画像を配置
MapView の指定位置に画像を配置する手法を学習したが
別の手法も存在するようだ。

というのも、前の手法では、配置する画像が指定位置の右下に来ていたため
指定位置を中央とする手法を探していて発見した。

Android Developers:Google Map View Part 2: Adding Overlay Items

まず、ItemizedOverlay クラスを継承したサブクラスを作成する。

HelloItemizedOverlay.java
クラスファイルの作成

新しいクラスファイルを作成する際のダイアログで
① クラスファイル名(任意)入力
② スーパークラス入力
com.google.android.maps.ItemizedOverlay
③ 「スーパークラスからのコンストラクター」にチェック

 
とすると
[android]package com.example.sample;

import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay {

public HelloItemizedOverlay(Drawable defaultMarker) {
super(defaultMarker);
// TODO 自動生成されたコンストラクター・スタブ
}

@Override
protected OverlayItem createItem(int i) {
// TODO 自動生成されたメソッド・スタブ
return null;
}

@Override
public int size() {
// TODO 自動生成されたメソッド・スタブ
return 0;
}

}[/android] というクラスファイルが自動生成される。

自動生成の割には

ItemizedOverlay は raw 型です。総称型 ItemizedOverlay への参照は、パラメーター化する必要があります Java 問題

こんな警告が出てる。。。意味がわからない。。。後回し。。。
 

Overlay Item 格納コレクション

クラスのフィールドエリアに、Overlay Item を格納するための ArrayList コレクションを定義。
[android]private ArrayList mOverlays = new ArrayList();[/android]  

Drawable 描画準備

Drawable リソースが描画されるために、メソッドを1つかます必要がある。
[android]public HelloItemizedOverlay(Drawable defaultMarker) {
super( boundCenterBottom(defaultMarker) );
populate(); // Android のバグ回避用
}[/android] これをかましていないと LogCat に以下のようなエラーが出て、マーカーが表示されない。
ERROR/MapActivity(226): Couldn’t get connection factory client
(かまさない時だけこのエラーが出るので、そうだと思う)
 

boundCenter

指定 GeoPoint が Drawable の中心にくるように指定。
 

boundCenterBottom

指定 GeoPoint が Drawable の下辺中央にくるように指定。
 

Android のバグ

また、Android にバグがあるため、バグ回避用に populate メソッドも追加。
参考元サイト:とあるSEのリマインダー
MapViewでItemizedOverlayでアイテムが設定されていないとNullpointer Exceptionが発生
 

Overlay Item 追加メソッド

Overlay Item を追加するためのメソッドを追加。
[android]public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}[/android]  

createItem メソッドと size メソッドのオーバーライド

自動生成された createItem メソッドと size メソッドを以下のように変更。
[android]@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}

@Override
public int size() {
return mOverlays.size();
}[/android]  

タップイベントを拾うための準備

タップイベントを拾うために、コンストラクタに Context の参照を追加。
[android]private Context mContext;

public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
super( boundCenterBottom(defaultMarker) );
mContext = context;
populate(); // Android のバグ回避用
}[/android]  

タップイベント処理
[android]@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet())
dialog.show();
return true;
}[/android]  

HelloGoogleMaps.java

ここで元になる MapActivity (ここでは、HelloGoogleMaps とする)クラスへ戻る。
 

アイコンの準備

MapView 上に Overlay Item として表示する画像を準備する。
上記 Android Developers サイトにロボットの画像があり、
「持ってなかったら、これを使っていいよ」と書いてある。

 
そして、「何なら自分のプロジェクトのリソースフォルダに D&D するといいよ」とも書いてある。
試しにやってみると、左のようなダイアログが出て、ちゃんと保存できた。
が、3jxz5leh.bmp というファイル名になった。
元々は androidmarker.png というファイル名。

ビットマップファイルに自動で変換してくれた、っていうことかしら。

 

onCreate メソッドに追加
[android]List mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);[/android]  

マーカー配置例

いよいよ具体的にマーカーを配置する手法。
onCreate メソッドに更に追加
[android]GeoPoint point = new GeoPoint(19240000,-99120000);
OverlayItem overlayitem = new OverlayItem(point, “Hola, Mundo!”, “I’m in Mexico City!”);[/android] マーカーを表示したい位置で GeoPoint インスタンスを生成し
それを、タイトルやメッセージと共に Overlay Item インスタンスへ渡す。
 
onCreate メソッドに更に追加
[android]itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);[/android] 最後に、今作った Overlay Item インスタンスを HelloItemizedOverlay インスタンスへ追加し
その HelloItemizedOverlay インスタンスを MapView の Overlay コレクションへ追加する。
 

完成例

 

HelloItemizedOverlay.java
[android]package com.example.sample;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay {

private ArrayList mOverlays = new ArrayList();
private Context mContext;

public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
super( boundCenterBottom(defaultMarker) );
mContext = context;
populate(); // Android のバグ回避用
}

@Override
protected OverlayItem createItem(int i) {

return mOverlays.get(i);
}

@Override
public int size() {

return mOverlays.size();
}

public void addOverlay(OverlayItem overlay) {

mOverlays.add(overlay);
populate();
}

@Override
protected boolean onTap(int index) {

OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();

return true;
}
}[/android]  

HelloGoogleMaps.java
[android]package com.example.sample;

import java.util.List;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class HospitalMap2 extends MapActivity {

private MapView mapView; // MapView

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);

// MapView のインスタンスを生成
mapView = new MapView(this, getResources().getString(R.string.map_key));
mapView.setEnabled(true);
mapView.setClickable(true);
mapView.setBuiltInZoomControls(true); // ズームボタンを有効
mapView.getController().setZoom(11); // ズーム度の初期値を設定
setContentView(mapView);

List mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

GeoPoint point = new GeoPoint(19240000, -99120000);
OverlayItem overlayitem = new OverlayItem(point, “Hola, Mundo!”, “I’m in Mexico City!”);

itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}

@Override
protected boolean isRouteDisplayed() {
return false;
}
}[/android]

Posted by muchag | Android |
初回投稿:2011-04-25 (月) 17:41:15 | 最終更新:2011-04-25 (月) 23:45:50

繰り返し処理

Posted by muchag | Android |
初回投稿:2011-04-24 (日) 19:41:17 | 最終更新:2011-04-24 (日) 19:43:12

 
[android]// データの読み込み
Cursor cursor = db.query(“sample”, null, null, null, null, null, null);
if (cursor.getCount() != 0) {

boolean isEof = cursor.moveToFirst();
while (isEof) {

String name = cursor.getString( cursor.getColumnIndex(“name”) );

isEof = cursor.moveToNext();
}
}

// Cursor の開放
cursor.close();[/android]

Posted by muchag | Android |
初回投稿:2011-04-24 (日) 19:41:17 | 最終更新:2011-04-24 (日) 19:43:12

Devices ビュー

Posted by muchag | Android |
初回投稿:2011-04-24 (日) 14:12:59 | 最終更新:2011-04-24 (日) 14:16:47

DDMS パースペクティブに標準装備。








スクリーンショット



 

⑧ スクリーンショット

エミュレータの画面のスクリーンショット関連。
[リフレッシュ] 再読み込み
[rotate] 画像を反時計回りに 90° 回転してくれる
[保管] スクリーンショットを名前を付けて保存
[コピー] スクリーンショットをクリップボードへコピー
[終了] ダイアログを閉じる

Posted by muchag | Android |
初回投稿:2011-04-24 (日) 14:12:59 | 最終更新:2011-04-24 (日) 14:16:47

エミュレータに緯度・経度を設定

Posted by muchag | Android |
初回投稿:2011-04-24 (日) 3:12:07 | 最終更新:2011-04-24 (日) 3:12:07

エミュレータに任意の場所の緯度・経度を設定することができる。

DDMS パースペクティブにはデフォルトで配置されている
Emulator Control ビュー。

これの [Location Controls]-[手操作] で
緯度・経度を設定できる。

「送信」でエミュレータに設定。

エミュレート中に変更可能。

Posted by muchag | Android |
初回投稿:2011-04-24 (日) 3:12:07 | 最終更新:2011-04-24 (日) 3:12:07

指定場所の緯度・経度を取得

Posted by muchag | Firefox,Google Chrome,JavaScript |
初回投稿:2011-04-24 (日) 1:24:51 | 最終更新:2022-09-28 (水) 10:14:29

Google Map に感動すること早数年。
こんな機能があるとは知らなかった。

@IT:Androidで動く携帯Javaアプリ作成入門(16)
地図/位置情報/GPSを使うAndroidアプリを作るには

Firefox および Google Chrome に付随する機能。

ブラウザで Google Map を開き
住所なりランドマークにて場所を指定する。

もしマップ上のマーカーが画面中央にないときは
マーカーをクリックすると出てくるポップアップの
[その他]-[ここにズーム] で、マーカーがほぼ画面中央にくる。

目的の場所が画面中央に表示されたら、アドレスバーに


javascript:void(prompt('',gApplication.getMap().getCenter()));

と入力して Enter キーを押下すると
 
このようにダイアログが開き
指定した場所の緯度と経度が表示される。

通天閣の緯度・経度は
緯度:34.652556109944385
経度:135.50633668899536
らしい。

 
と、ここまで書いておいたが
実際に利用してみたらはまっている自分に気がついた。
 

誤動作に注意

何かというと、サンプルコードを見てみるとわかるが
緯度・経度について、実際に利用するときは
100万倍(* 1e6)して int に変換して利用する。

逆に言えば、100万倍したときに小数点が残ってはいけないのだ。

上記のように
緯度:34.652556109944385
経度:135.50633668899536
こういう結果が得られたときは、小数第6位まで の概数にして利用する。
緯度:34.652556
経度:135.506336

Posted by muchag | Firefox,Google Chrome,JavaScript |
初回投稿:2011-04-24 (日) 1:24:51 | 最終更新:2022-09-28 (水) 10:14:29

ビルド・ターゲットの変更

Posted by muchag | Android |
初回投稿:2011-04-23 (土) 12:40:41 | 最終更新:2011-04-23 (土) 12:41:50

新しいプロジェクトを作成するときに「ビルド・ターゲット」を設定する。
新規プロジェクトの立ち上げ

これをプロジェクト作成後に変更する手法。

[プロジェクト]-[プロパティー] か
プロジェクト名を右クリックで
[プロパティー] を選択。

 
左ペインで [Android] を選択すると
ビルド・ターゲット一覧が出てくるので
ここで希望するターゲットにチェックを付けて
OK すれば完了。

Posted by muchag | Android |
初回投稿:2011-04-23 (土) 12:40:41 | 最終更新:2011-04-23 (土) 12:41:50

AVD -> ターゲットの追加

Posted by muchag | Android |
初回投稿:2011-04-22 (金) 20:56:29 | 最終更新:2011-04-22 (金) 22:50:15

AVD には、ターゲットを追加できる。

端末個別にエミュレーションしたい場合に有効。

罠?w

[ウインドウ]-[Android SDK および AVD マネージャー] より
AVD マネージャを起動できるが、
どうやら今回の場合、これは罠のようだ・・・。

というのも、後々「failed to install」なんて言われる。

 
SS を撮ってあったはずなのに、見つからない。 😥

サイトを見回ると、SDK のインストール時に同じようなダイアログが出ることがあるらしく
これは、アンチウイルスソフトが原因のようだ。

しかし、今回は違う。
メッセージ内容で覚えているのは
「インストール先フォルダが使用中なので、インストールできないよ。
フォルダを使用しているアプリケーションを全部終了したらOKしてね」
みたいだった。

でもね・・・動いているのはブラウザと Eclipse のみ。
まぁ、そりゃ Eclipse は使っているだろうけどさ。
これを終了したら、ターゲットの追加ができないでしょ・・・。

と思っていたら、
実は、AVD マネージャを起動するのに別の手法があった。

Android\android-sdk-windows\tools\android.bat

このファイルから AVD マネージャを起動することができた。

つまり、やっぱり Eclipse も閉じないといけなかったらしい。
 

ターゲットの追加

そういうわけで、ここからが本番。

 
① 左ペインの「Available packages」を選択。

② ダイアログ下部の「Add Add-on Site…」をクリック。

 
出てきたダイアログに当該ターゲットの repository.xml ファイル配布元 URL を記入。

左図では、Xperia arc の repository.xml ファイルへの URL 。

OK をクリックすると、

 
もとの画面に戻る。

ここで、中央ペインに「User Add-ons」が追加されているので展開すると
期待していたものが出てくるはず。
① それにチェックをつける。

② 右下の「Install Selected」をクリック。

 
① 左ペインにある当該ターゲットを選択。

② 真ん中下辺りにあるラジオボタンで「Accept」を選択。

③ 「Install」をクリック。

 
一通り作業が終わったら「Close」をクリック。

 
マネージャで左ペインで「Virtual devices」が選択されていることを確認して
「New」をクリックする。

そうすると左図ダイアログが出るので
「Target」のところのドロップダウンメニューを広げると
目的のターゲットが追加されていることがわかる。

 

repository.xml ファイル配布元
Sony Ericsson
Xperia arc

http://developer.sonyericsson.com/edk/android/repository.xml
 
参考元サイト:とあるソニー好きなエンジニアの日記 Xperia arcの開発を始めてみよう

Posted by muchag | Android |
初回投稿:2011-04-22 (金) 20:56:29 | 最終更新:2011-04-22 (金) 22:50:15

バッチファイルの作成

Posted by muchag | コマンドプロンプト |
初回投稿:2011-04-22 (金) 12:16:48 | 最終更新:2011-04-22 (金) 12:16:48