2012年1月9日月曜日

3Q写真管理(For Android)







【3Q写真管理】はアルバムを細かくフォルダにかけて表示します。シンプルで操作簡単な写真管理アプリです。

「写真を楽しむ」のニーズに応じて開発した写真管理アプリです。

日本語、英語対応しております。

3Q写真管理の特徴は:

◆写真を自由に分類し、各フォルダに管理します。
写真フォルダに好きな色や写真を設定できます。
写真フォルダを追加、並び替えができます。

◆携帯中にある写真をフォルダに読み込み、
各写真に名前に変更、コメント追加、表示の並び替えができます。

◆写真一覧では簡単に写真をスライドしながら写真を見ることができます。

◆写真をもっとはっきりみたい場合、拡大縮小画面にすきなサイズに調整することができます。

ぜひ3Q写真管理をご利用ください。

Android OS 2.1 以上 対応

※【3Q家計簿】、【3Q手帳】、【3Q日記】、【3Qカレンダー】もぜひご利用してください。












2011年9月25日日曜日

生活メモ








生活メモは【家計簿】、【日記】、【予定】三つの部分を構成しています。

特徴:

一、【家計簿】について
誰でも素早く簡単操作でき、財布の中身が一目で分かる家計簿です。


New: バックアップ機能を追加しました。

◆収支情報の操作

→簡単に登録/変更/削除することができます。

◆収支情報のチェック

→すべて詳細を素早くチェックできます。

◆項目のカスタマイズ

→好きな項目を追加、よく使う項目を上位にしましょう。

◆残高情報をチェック

→収支を把握、先月との差額はどのぐらいでしょうか?

◆各月各項目の割合

→無駄遣いしていますか?

◆各項目の合計金額の変化

→過去と比較しましょう。

二、【日記】について

日々の気持ちをチェックできる日記帳です。
Twitterで友たちと日記を共有できます。
New: バックアップ機能を追加しました。

◆ツイッターを利用できます。
→書いた日記を自由につぶやきできます。

◆この一か月はどんな気持ちで過ごししているでしょうか?
→このアプリを利用すれば、簡単に気持ちを登録、過去の気持ちをカレンダーに表示できます。

・過去の天気情報も表示できます。
→このアプリでは手間をかかず、毎日の天気情報と気温を自動的に表示できます。

◆簡単に登録はもちろん、スライドだけで、過去の日記をみることができます。

三、【予定】

Googleカレンダーと同期できます。


◆背景をカスタマイズできます。

◆アイコンをカレンダーに表示します。
→カレンダーを見れば予定はすぐ分かります。

◆予定を簡単に確認できます。
→確認する日付をタッチするとその日の予定タイトルを表示します。
→予定タイトルをタッチすると詳細が表示します。

本アプリはGALAPAGOSで実機検証しましたが、他の機種での検証はしておりません。

Android OS 2.2 以上 対応

画面サイズ:WVGA

日本語、英語、中国語対応しております。

※【3Q 家計簿】、【3Q カレンダー 】、【3Q日記】、【3Q写真管理】もぜひご利用してください。

ダウンロード先へ


アプリについてのご意見はこちら

+++--------☆--------+++--------☆---------+++----

★最安値でAndroidアプリの新規開発案件を受け取ります。
★高くAndroidアプリを買収します。
★3Qシリーズを販売します。

気楽にご相談ください。
メールでお問い合わせてください。

+++--------☆--------+++--------☆---------+++----

画面イメージ:














2011年8月27日土曜日

3Q日記(For Android)




日々の気持ちをチェックできる日記アプリです。

このアプリの特徴:

・ツイッターを利用できます。
書いた日記を自由につぶやきできます。

・この一か月はどんな気持ちで過ごししているでしょうか?
このアプリを利用すれば、簡単に気持ちを登録、過去の気持ちをカレンダーに表示できます。

・過去の天気情報も表示できます。
このアプリでは手間をかかず、毎日の天気情報と気温を自動的に表示できます。

・簡単に登録はもちろん、スライドだけで、過去の日記をみることができます。

ぜひ楽しい笑顔日記を使ってみてください。


対応言語:日本語、英語、中国語

また、【3Q家計簿】、【3Qカレンダー】、【3Q手帳】、【3Q写真管理】も提供しております、マーケットからダウンロードしてください。
ダウンロードへ


画面イメージ:












2011年8月19日金曜日

android HTTP通信でgzipファイルをゲット


// HTTP通信、パラメータ渡して、GZipファイルを返してくる

public String doPost() {

StringBuffer sb = new StringBuffer();

String url = "http://google.map";
// String lat = "35.000002";
// String lon = "139.0000003";

String lat = keido;
String lon = ido;

try {
HttpPost request = new HttpPost(url);

List<NameValuePair> params = new LinkedList<NameValuePair>();
params.add(new BasicNameValuePair("lon", lon));
params.add(new BasicNameValuePair("lat", lat));

request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
request.setHeader("Accept-Encoding", "gzip");

HttpResponse response = new DefaultHttpClient().execute(request);

int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK) {
HttpEntity httpEntity = response.getEntity();

InputStream is = httpEntity.getContent();
if (httpEntity.getContentEncoding().getValue().contains("gzip")) {
is = new GZIPInputStream(is);
InputStreamReader in = new InputStreamReader(is);
BufferedReader br = new BufferedReader(in);

String line;
while ((line = br.readLine()) != null) {
sb.append(line);

}
br.close();
in.close();
is.close();

}
}

} catch (Exception e) {

System.out.println("dopost------" + e);
}
return sb.toString();
}

2011年7月27日水曜日

simple_list_item_single_choice

//simple_list_item_single_choice

private void selectAlert() {

String[] items = { "男", "女" };

ListView lv = new ListView(this);
// アダプタの作成
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice, items));

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

AlertDialog.Builder ab = new AlertDialog.Builder(this);
ab.setView(lv);
ab.setNegativeButton("cancel", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
dialog.cancel();

}

});
ab.show();

lv.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> list, View view, int iposition,
long id) {

}
});

}

2011年7月13日水曜日

Serializableでデータのやり取り

Serializableでデータのやり取り

DataBeanクラス:
public class DataBean implements Serializable {

static String content="";
public static String getContent() {
return content;
}
public static void setContent(String content) {
DataBean.content = content;
}
}

Aクラス:(データを渡す)
public final static String SER_KEY = "1234";
//省略
DataBean dataBean = new DataBean ();
dataBean.setContent(content);
Intent intent = new Intent();
Bundle mBundle = new Bundle();
mBundle.putSerializable(SER_KEY, dataBean);
intent.putExtras(mBundle);
startActivity(intent);


Bクラス:(データをゲット)
DataBean saveBean = (DataBean) getIntent().getSerializableExtra(Aクラス.SER_KEY);
saveBean.getContent();

2011年7月11日月曜日

ZIPファイルの解凍

ZIPファイルの解凍


/*
 * targetDir:解凍するファイルのパス
 * creatDir:生成するファイルの親ディレクトリ
 */
private static void Unzip( String targetDir , String creatDir) {
int bufferSize = 4096; //4kb
String entryName;
BufferedOutputStream bos = null; // バッファー出力

try {

FileInputStream fis = new FileInputStream(targetDir);
ZipInputStream zis = new ZipInputStream(
new BufferedInputStream(fis));

ZipEntry zipEntry; //
while ((zipEntry = zis.getNextEntry()) != null) {

try {

int count;
byte data[] = new byte[bufferSize];

//ファイル名
entryName = zipEntry.getName();

File entryFile = new File(creatDir+ entryName);

//親フォルダーがない場合、新規生成
File entryDir = new File(entryFile.getParent());
if (!entryDir.exists()) {
entryDir.mkdirs();
}

FileOutputStream fos = new FileOutputStream(entryFile);

bos = new BufferedOutputStream(fos, bufferSize);
while ((count = zis.read(data, 0, bufferSize)) != -1) {
bos.write(data, 0, count);

}
bos.flush();
bos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
zis.close();
} catch (Exception cwj) {
cwj.printStackTrace();
}
}

2011年7月8日金曜日

ファイルの読み込み

ファイルの読み込み:

try {
File dstFile = new File(filePath);
InputStream input = new FileInputStream(dstFile);
BufferedReader br = new BufferedReader(
new InputStreamReader(input));

// InputStream:reading data from a source in a byte-wise manner.
// InputStreamReader:turning a byte stream into a character stream
// BufferedReader:buffers the input.

// InputStream input = openFileInput(dst);
// BufferedReader br = new BufferedReader(new
// InputStreamReader(input) );

String str;
while ((str = br.readLine()) != null) {
sb.append(str + "\n");
}
} catch (FileNotFoundException e) {
e.printStackTrace();

} catch (IOException e) {
e.printStackTrace();
}
System.out.println( sb.toString() );

2011年7月7日木曜日

ファイル検索用

ファイル検索用:

public void searchFile(String path) {
String paths = path + "/";
File file = new File(paths);
File[] filelist = file.listFiles();
if (filelist != null) {
 for (int i = 0; i < filelist.length; i++) {
   if (filelist != null) {
   File g = new File(filelist[i].getPath());
   if (g.isDirectory()) {
    TraversalFile(g.getPath());

   } else if (g.getName().endsWith(".mp3")) {
    mSongs.add(g.getName());
   mSongspath.add(g.getPath());

   }else if (g.getName().endsWith(".mp4")) {
   mvideos.add(g.getName());
   mvideopaths.add(g.getPath());
   }
  }
}
}

}

ListView の使い方

ListView の使い方
ソース:
//test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
    >
<ListView
   android:id="@+id/listview"
  android:layout_width="fill_parent"
   android:layout_height="fill_parent"
/>
</LinearLayout>

//row.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
   android:layout_height="wrap_content">

<TextView
android:id="@+id/row_textview1"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_alignParentLeft="true"
android:textSize="21sp"
 />

</RelativeLayout>

//Test.class
public class Test extends  Activity {

private ListView listview;
private ArrayList<String> listPath = new ArrayList();
private ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.test);

listview = (ListView) findViewById(R.id.listview);

adapter = new ArrayAdapter<String>(this, R.layout.row,
R.id.row_textview1, listName);

listview.setAdapter(adapter);

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//do same thing

}
}
        });

}
}

2011年7月6日水曜日

Android 3.1について

【Android 3.1】

1.改良されたUSB通信

2.ホーム画面上にウィジェットのサイズを変更することができるようになった

3.外付けキーボードとポインティングデバイスのサポート

4.コントローラのサポート(ジョイスティック)とのゲームテーブル(ゲームパッド)

5.改良されたWi - Fi機能

6.Google TV

7.Android@HOME:家庭内の機器をすべてAndroidで制御するコンセプト

8.Google Movies、Music Beta (今後クラウドの運用に力を入れる見込み)

その他:
従来、AndroidマーケットはAndroid端末上からしか利用できないが、現在PC
などのWebブラウザーから利用できるAndroidマーケットがAndroidMarket on
the Webにした。

「In-app Billing」アプリ内課金の仕組みが誕生した。

Android 3.0とAndroid 2.xと比べ

【Android 3.0とAndroid 2.xと比べ】

1.UIデザイン変更
・Holographic Themeを追加した
・System bar を画面の下に配置
 システム全体およびすべてのアプリケーションで、ユーザはシステムバー
 にある通知、システムステータス、およびソフトナビゲーションにすばやく
 アクセスができます。
・Action bar 追加
 どのアプリケーションにおいても、コンテキストオプション、ナビゲーション、
  ウィジェット、またはその他のタイプのコンテキストに対し、画面の上に
 表示されているアクションバーでアクセスすることができます。
★Fragments 
  アプリケーションでフラグメントのセットを使って、本来の複数の
  ウィンドウ枠を持つ UI を作成することができ、ユーザはそれぞれのウィンドウ
 枠で独立して操作することができます。
・New widgets
 Application Widgets
 Home Screen Widgets 3Dで表現
  Rich Notifications
・Updated Notifications
・System Clipboard
・Drag-and-drop

2.新しい3Dエンジンの搭載などでパフォーマンスを向上させた。

3.キーボードのデザインを変更した

4.テキスト選択、コピー&ペーストの改善

5.新たな接続オプション
wi-fi の接続性/Bluetooth のテザリング /メディア/フォト転送プロトコルの
組み込みをサポート など。

6.HTML Media Captureに対応。
(Webアプリケーションから、デバイス上のオーディオ、画像、ビデオのキャプチャーにアクセスできる ようになった。)

AlertDialogBuilder に TableLayout を表示する。

以下のソースを参考してください。


//上省略
View v = this.getLayoutInflater().inflate(R.layout.info, null);

TextView sex =  (TextView) v.findViewById(R.id.sex);
sex.setText("男");

TextView height = (TextView) v.findViewById(R.id.hight);
hight.setText("170");

TextView age = (TextView) v.findViewById(R.id.age);
age.setText("100");

final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
 alertDialogBuilder.setView(v);
 alertDialogBuilder.setPositiveButton(getString(R.string.next), new DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which) {
//do samething
}
 }).show();

//info.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:id="@+id/ll_alert"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_gravity="center_horizontal"
android:textSize="23sp" android:text="@string/info" />
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10dip">
<TableRow>
<TextView android:layout_width="100dip"
android:layout_height="wrap_content" android:text="性別"
android:textSize="21sp" android:layout_gravity="right" />
<TextView android:id="@+id/sex" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="21sp"
android:paddingLeft="20dip" />
</TableRow>
<TableRow>
<TextView android:layout_width="40dip"
android:layout_height="wrap_content" android:text="身長"
android:textSize="21sp" android:layout_gravity="right" />
<TextView android:id="@+id/hight" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="21sp"
android:paddingLeft="20dip" />
</TableRow>
<TableRow>
<TextView android:layout_width="40dip"
android:layout_height="wrap_content" android:text="年齢"
android:textSize="21sp" android:layout_gravity="right" />
<TextView android:id="@+id/gae" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="21sp"
android:paddingLeft="20dip" />
</TableRow>

</TableLayout>

</LinearLayout>

2011年6月28日火曜日

オーディオ再生-android

1.PlayAudio クラス
public class PlayAudio extends Activity {
private MediaPlayer mPlayer;
private Button bplay,bpause,bstop;

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

bplay = (Button)findViewById(R.id.play);
bpause = (Button)findViewById(R.id.pause);
bstop = (Button)findViewById(R.id.stop);

bplay.setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
if (mPlayer != null) {
try {
mPlayer = MediaPlayer.create(PlayAudio.this, R.raw.beethoven);
}catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
// 再生開始
mPlayer.start();
}
}
});

bpause.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
if(mPlayer != null){
mPlayer.pause();
}
}

});

bstop.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
if(mPlayer != null){
mPlayer.stop();
}
}

});

}

@Override
protected void onDestroy() {
super.onDestroy();
// 使わなくなった時点でMediaPlayerに結びつけられているリソースを解放する
mPlayer.release();
}
}

2.main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="オーディオ再生" />

<Button
android:id="@+id/play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/play" />

    <Button
    android:id="@+id/pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/pause"  />

     <Button
      android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/stop"  />
</LinearLayout>

Android3.0&3.1




【Android 3.0とAndroid 2.xと比べ】

1.ホーム画面
ウィジェットやデスクトップ、アプリケーションの切り替えなどで、3Dを活用
したより動きのあるインターフェースを取り入れ、視覚的に分かりやすくなっ
ている。従来は画面上部に設置されていたステータスバーが画面下部に移動した

2.アプリケーションにおいては、アクティビティ(アプリケーションの画面)を
Fragment」と呼ばれるパーツに分け、環境に応じて画面がレイアウトしやす
くなった。
例えば、アプリケーションでフラグメントのセットを使って、本来の複数の
ウィンドウ枠を持つ UI を作成することができ、ユーザはそれぞれのウィンドウ
枠で独立して操作することができます。

3.新しい3Dエンジンの搭載などでパフォーマンスを向上させた。

4.システムバー:システム全体およびすべてのアプリケーションで、ユーザは
システムバーにある通知、システムステータス、およびソフトナビゲーション
にすばやくアクセスができ、それは画面の下の方で利用可能になります。

5.アクションバー:どのアプリケーションにおいても、コンテキストオプション、
ナビゲーション、ウィジェット、またはその他のタイプのコンテキストに対し、
画面の上に表示されているアクションバーでアクセスすることができます。

6.キーボードのデザイン

7.テキスト選択、コピー&ペーストの改善

8.新たな接続オプション
wi-fi の接続性/Bluetooth のテザリング /メディア/フォト転送プロトコルの
組み込みをサポート など。

【Android 3.1】

1.改良されたUSB通信

2.最新のアプリケーション(最近のアプリケーション)のリストを展開し

3.ホーム画面上にウィジェットのサイズを変更することができます

4.外付けキーボードとポインティングデバイスのサポート

5.コントローラのサポート(ジョイスティック)とのゲームテーブル(ゲームパッド)

6.改良されたWi - Fi機能

7.アプリケーションブラウザ

8.Google TV

9.Android@HOME

10.Google Movies、Music Beta (今後クラウドの運用に力を入れる見込み)

その他:
従来、AndroidマーケットはAndroid端末上からしか利用できないが、現在PC
などのWebブラウザーから利用できるAndroidマーケットがAndroidMarket on
the Webにした。

「In-app Billing」アプリ内課金の仕組みが誕生した。

2011年6月27日月曜日

Html上で住所の文字列を入力し、ルートを表示する方法

例:
http://maps.google.com/maps?f=d&hl=ja&saddr=埼玉県蕨市塚越1-1-1&daddr=東京都豊島区1-1-1&date=6/30/2011&18:00&ie=UTF

パラメータ一覧:
hl=ja:日本語サイト
saddr:出発
daddr:到着
ie=UTF8(shift-JIS,EUC-JPを使うと文字化けします)

dirflg:路線のタイプ
dirflg=h 高速道路を避ける
dirflg=t 不明
dirflg=r 不明
dirflg=w 歩く
dirflg=b 自転車

ttype:時間のタイプ
ttype=now 今出発
ttype=dep 出発時間
ttype=arr 到着時間 
time=出発時間 hh:mm am|pm
date=出発日  mm/dd/[yy]yy
sort:ルートの順番
sort=def 早い順
sort=num 乗換少ない順
sort=walk 歩くの距離順

※詳しく住所で入力しないと、いくつか住所の選択肢が存在したら、ルートを表示することはできない
※住所の文字列にシングルクォーテーションかダブルクォーテーションを囲むの必要がある

位置情報から住所や地名を調べる

......省略
GeoPoint gp = mapview.getMapCenter();
double lat = gp.getLatitudeE6()/1E6;
double lng = gp.getLongitudeE6()/1E6
StringBuffer buff = new StringBuffer();
try{
       Geocoder geocoder= new Geocoder(this,Locale.getDefault());
       List<Address> addresses= geocoder.getFromLocation(latitudeHere,longitudeHere,1);
       for(Address addr : addresses){
        int index = addr.getMaxAddressLineIndex();
         buff.append(addr.getAddressLine(index ));
       
       }
       //取得した住所
       buff.toString();
      }catch(IOException e){
       e.printStackTrace();
      }

ボタンデザインの変更

1.res/layout/main.xmlのコード
省略
<ImageButton
 android:省略
 android:background="@drawbale/btn"
/>

2.res/drawable/btn.xmlのコード
<selector
 xmlns:android:="http://schemas.android.com.apk/res/android"
<!-- 通常時-->
 <item
  android:state_pressed ="true"<!-- 通常時-->
  android:drawable ="@drawable/btn1"
  />
<!-- フォーカスの時-->
  <item
  android:state_focused ="true"
  android:drawable ="@drawable/btn2"
  />
<!-- 押下時-->
  <item
  android:state_drawable ="true"
  android:drawable ="@drawable/btn3"
  />
</selector>

2011年6月24日金曜日

GoogleMap-住所や地名から位置情報を調べる

1.MapActivity クラス

public class MapActivity extends MapActivity {
 private MapView mapview;
 private Button gomap;
 private EditText address;
 private List<Address>addressList;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapview= (MapView)findViewById(R.id.theMap);
        mapview.getController().setZoom(15);
        mapview.setBuiltInZoomControls(true);
        gomap=(Button)findViewById(R.id.buttonAdress);
        address=(EditText)findViewById(R.id.editAdress);
        gomap.setOnClickListener(new clickGomap ());
    }
 @Override
 protected boolean isRouteDisplayed() {
  // TODO 自動生成されたメソッド・スタブ
  return false;
 }
 class clickGomap implements  android.view.View.OnClickListener{
  public void onClick(View arg0) {
   Geocoder geocoder = new Geocoder(WinasMapActivity.this , Locale.getDefault());
    try {
     addressList = geocoder.getFromLocationName(address.getText().toString(), 1);
     if(addressList != null && addressList.size()>0){
      Address address = addressList.get(0);
      int lat = (int)(address.getLatitude()*1E6);
      int lng = (int)(address.getLongitude()*1E6);
      GeoPoint gp = new GeoPoint(lat,lng);
      mapview.getController().animateTo(gp);
     }
    } catch (IOException e) {
     e.printStackTrace();
    }

  }
 }
}
2.mail.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
 android:id="@+id/topPoint"
    android:layout_width="50dip"
    android:layout_height="20dip"
    android:text="@string/buttonGo"
    android:layout_alignParentTop="true"
 android:visibility="invisible"
    />
<EditText
 android:id="@+id/editAdress"
    android:layout_width="150dip"
    android:layout_height="50dip"
    android:layout_below="@id/topPoint"
    android:layout_toRightOf="@id/topPoint"
/>
<Button
 android:id="@+id/buttonAdress"
 android:text="@string/buttonGo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@id/editAdress"
    android:layout_toRightOf="@id/editAdress"
/>
<com.google.android.maps.MapView
 android:id="@+id/theMap"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@id/editAdress"
    android:layout_alignParentLeft="true"
    android:apiKey="0h6yfBXg_3ti8LQTu6A3oWGdR1hTX0F5p_SpF"
    />
</RelativeLayout>

GoogleMap Overlay 

オーバーレイを地図の上に重ね合わせることで、地図上の情報を画像やマークなどの形で表示することができます。たとえば、飲食店の位置にマークを追加することで、ユーザーは店までの経路を把握することができます。

オーバーレイ機能の追加方法を説明します。

方法一:
1.Overlayを定義するクラス

public class MyPositionOverlay extends Overlay {
    private GeoPoint geoPoint;
    private Context context;
    private int drawable;
    public MyPositionOverlay(GeoPoint geoPoint, Context context, int drawable) {
        super();
        this.geoPoint = geoPoint;
        this.context = context;
        this.drawable = drawable;
    }
    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        Projection projection = mapView.getProjection();
        Point point = new Point();
        projection.toPixels(geoPoint, point);
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
                drawable);
        canvas.drawBitmap(bitmap, point.x  , point.y
                - bitmap.getHeight() , null);
        super.draw(canvas, mapView, shadow);
    }
}

2.ViewMapクラス

public class ViewMap extends MapActivity{
  private MapView mapView ;
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.view_map);
  mapView =(MapView)findViewById(R.id.map);
  mapView.setBuiltInZoomControls(true);
  //オーバーレイの表示
  MyPositionOverlay overlay =new MyPositionOverlay(new GeoPoint(idoInt,keidoInt),
    this, R.drawable.here);
  List<Overlay> overlays = mapView.getOverlays();
  overlays.add(overlay);
 }

 @Override
 protected boolean isRouteDisplayed() {
  // TODO 自動生成されたメソッド・スタブ
  return false;
 }

}

方法二:
1.OverlaySampleクラス
public class OverlaySample extends ItemizedOverlay<OverlayItem> {
 ArrayList<OverlayItem> overlayItems = new ArrayList<OverlayItem>();
 public OverlaySample(Drawable arg0) {
  super(arg0);
 }
 public OverlaySample(Drawable defaultMarker , Context context ) {
  super(boundCenterBottom(defaultMarker));
 }
 @Override
 protected OverlayItem createItem(int i) {
  return overlayItems.get(i);
 }
 @Override
 public int size() {
  return overlayItems.size();
 }
 @Override
 protected boolean onTap(int index) {
  System.out.println(overlayItems.get(index));
  return super.onTap(index);
 }
 public void addOverlay(OverlayItem overlayitem){
  overlayItems.add(overlayitem);
  populate();
 }
}
2.mapグラス
public class map extends MapActivity {
      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MapView mapView =(MapView)findViewById(R.id.map);
        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = getResources().getDrawable(R.drawable.icon);
        OverlaySample overlaySample = new OverlaySample(drawable , this);
        GeoPoint point =new GeoPoint( 999999,111111);
        OverlayItem overlayItem = new OverlayItem(point, "title", "content");
        overlaySample.addOverlay(overlayItem);
        mapOverlays.add(overlaySample);

2011年6月23日木曜日

GREE Android SDKの組み込み

基本的にGREE Android SDK 仕様書に沿って組み込みますが、いくつか注意事項があります。
1.ライブラリプロジェクトのインポート
 アプリケーションIDを間違えないように注意してください。
2.キーストアライブラリの設定・コンパイルと配置
 1)Android NDKが開発環境構築の参考サイト
  http://www.usefullcode.net/2010/12/android_sdk_inst05.html
 2)APK署名からアプリハッシュキー(APPLICATION_SIGNATURE)の生成
  ◆サンドボックス環境ではdebug.keystoreを使ってアプリハッシュキーを生成してください。
   APK用KEYSTOREファイルを使うとエミュレーター上署名エラーが発生します。
 
  ◆アプリハッシュキーの生成はコマンドプロンプトを使います。
   コマンドプロンプトとCygwinで生成したアプリハッシュキーは違います。
   また、ファイルのパスにダブルクォーテーションを入れないこと。
  ◆本番環境ではAPK署名でアプリハッシュキーを生成しますが、エイリアスの部分も必ず
   変更してください。  
   -alias エイリアス
  ◆本番環境に切り替えると、アプリにAPK署名を付けて、APKファイルを作成し、
   コマンドプロンプトでアプリをインストールして動作を確認してください。
   そうしないと、署名認証のところにエラーが発生します。
  サンプル:
  debug.keystoreを使う場合
   C:\Documents and Settings\Sample>keytool -exportcert -alias androiddebugkey -keysto
   re C:\debug.keystore -storepass android -keypass android | openssl sha1 -binary
   | openssl enc -e -a
   DuycIaPQATq123456780999=
  sample.keystoreを使う場合
   C:\Documents and Settings\Sample>keytool -exportcert -alias Sample.contents
   -keystore C:\Sample.keystore -storepass sample -keypass sample | openssl sha1 -bi
   nary | openssl enc -e -a
   vrECJQuEvDLe99999999999=
3.GREEのスタート画面にある本アプリの画像はGREE側設置してくれますので、
  画像だけ用意すればよいです

2011年6月18日土曜日

APK署名からアプリハッシュキー(APPLICATION_SIGNATURE)の生成

最近GREE Android SDKをアプリに組み込むの作業をしていました。APK署名からアプリハッシュキー(APPLICATION_SIGNATURE)の生成のところに引っかかってしまいました。よく調べたっら、ようやく問題が分かりました。

1.同じ開発環境では、Command promptとCygwinで生成したアプリハッシュキーは異なる
Command prompt:




Cygwin :



 2.APK用KEYSTOREファイルのパスにダブルクォーテーションで囲むと、エラーメッセージを表示しなく、アプリハッシュキーが生成されたが、正しいアプリハッシュキーではないので、注意してください。この時Command promptとCygwin で生成したアプリハッシュキーが同じです。
Command prompt:


 


Cygwin :




3.キーストが異なると、同じの環境でも生成したアプリハッシュキーは異なります。
Command prompt:
 



Command prompt:

では、一体どっちが正しいやり方ででしょうか?答えはとても簡単です。 
Command promptにAPK用KEYSTOREファイルのパスにダブルクォーテーションで囲まないで、debug.keystore(テスト段階)を使用してアプリハッシュキーを生成します。





ご参考できたらいいなあと思います。
 

2011年6月12日日曜日

Android携帯端末上の開発ツール

Android携帯端末上の開発ツールを紹介します。

1.Remote Desktop Client for Android
携帯端末上でパソコンのマウスとキーボードを制御することができます。
     
2.AndFTP
 多くのFTPプロトコルに対応しているだけでなく、SSH RSA/DSAセキュリティーキーや、複数のFTPサイトを管理できる、マルチプロフィール機能も搭載されています。
3.mAnalytics
 Google Analyticsのクライアントアプリです。Googleのアカウントを登録しておけば、スマートフォンでアクセス解析の情報を確認できます。

4.touchqode
 携帯端末上でコーティングすることができます。

5.Android Web Editor Lite
 携帯端末上でコーティングすることができます。

6.ConnectBot
 ConnectBotはSSHの他、telnetにも対応している。さらにlocalに接続してコマンドを実行することもできるので、Androidを色々いじりたい人にはぴったりと言えるだろう。公開鍵の生成、インポートもできるので公開鍵認証にも対応できる。

7.Phoenix MySql Client
 直接Mysql serverと接続、sql文の実行など。

8.Magic Color Picker
 Magic Color Pickerは、モバイル(携帯電話)で使用できるシンプルなカラーピッカーです。HEX、RGB、HSV、YUV、HSなどの様々なカラーフォーマットをサポートしていることが最大の特徴です。Magic Color PickerとAndroidモバイルは、あなたのカラー編集スキルを拡張するでしょう。

9.jQuery Mobile docs jQuery Mobile
 A unified user interface system across all popular mobile device platforms, built on the rock-solid jQuery and jQuery UI foundation. Its lightweight code is built with progressive enhancement, and has a flexible, easily themeable design

10. Flubble(フルブル)
 FlubbleはFlash制作者の役に立つソフトウェアです。Flashアプリケーションのshellクラスやアウトラインを作成するために使用します。Flubbleでは、ActionScript(アクションスクリプト)ファイルやXMLフォーマットを保存したりメール送信したりすることが出来ます。

 

3Q カレンダー(For Android携帯)







 3Q カレンダーの特徴:

Googleカレンダーと同期できます。

◆背景をカスタマイズできます。

◆アイコンをカレンダーに表示します。
→カレンダーを見れば予定はすぐ分かります。

◆予定を簡単に確認できます。
→確認する日付をタッチするとその日の予定タイトルを表示します。
→予定タイトルをタッチすると詳細が表示します。

本アプリはGALAPAGOSで実機検証しましたが、他の機種での検証はしておりません。

Android OS 2.1 以上 対応

ダウンロードへ

3Q家計簿】、【3Q日記】、【3Q手帳】、【3Q写真管理】もぜひご利用ください。



画面イメージ:








3Q家計簿(For Android携帯)









アンドロイドマーケット>カテゴリ>
人気のファイナンス>15位



「週刊アスキー」で紹介されました。

最小限の操作で手軽に、誰でも素早く簡単操作でき、財布の中身が一目で分かる家計簿アプリです。

本アプリでできること:
◆収支情報の操作
→簡単に登録/変更/削除することができます。
◆収支情報のチェック
→すべて詳細を素早くチェックできます。
◆項目のカスタマイズ
→好きな項目を追加、よく使う項目を上位にしましょう。
◆残高情報をチェック
→収支を把握、先月との差額はどのぐらいでしょうか?
◆各月各項目の割合
→無駄遣いしていますか?
◆各項目の合計金額の変化
→過去と比較しましょう。

本アプリはGALAPAGOSで実機検証しましたが、他の機種での検証はしておりません
Android OS 1.6 以上 対応
画面サイズ:WVGA(800×480)

※新規項目入力画面の不具合を修正しました(更新日8月3日)

※7月3日公開してから、7月29日までのダウンロード数は5000を超えました。ご利用いただいて誠にありがとうございます。

ダウンロードへ

3Q写真管理】、【3Q カレンダー】、【3Q日記】、【3Q手帳】もぜひご利用ください。



画面イメージ: