Kii Cloudでさくっとデータベースを使用したAndroidアプリを作ろう。 データを扱う編

さてユーザーのサインアップ>ログインまで実装しちゃったので
今度は実際にそのユーザーに紐付けたデータをKii Cloudにあずけて見ましょう。

その前に前回のログインの中で

KiiUser user = KiiUser.logIn(username,password);
string id = user.toURI();

.toURI()を使うとユーザーの一意のIDが取れるので
このへんの必要になりそうなものはちゃんとログイン時に別で持っておきましょう。

あと必要に応じて Kii.initialize も忘れずに。

*追記

下記のコードの中で出てくる

Kii.bucket("任意の文字列").object();

はログインしていれば全てのユーザーから閲覧できるとのことで

各ユーザが自身のデータしか参照しないようなものであれば

KiiUser.getCurrentUser().bucket("任意の文字列")

を使用してください

他にもグループ(特定のユーザー)だけが特定の権限を持った処理を行える
といったこともできるようなので公式リファレンスの
「Bucket の ACL 設定」を確認しておくとよさそうです、

データを保存する


	//データ保存用のオブジェクト作成 任意の文字列はテーブル名みたいなものかな
	KiiObject object = Kii.bucket("任意の文字列").object();

	//.set("カラム名", "データ") という形で渡す
	object.set("data1", "TEST_A");
	object.set("data2", "TEST_B");
	// Save the object
	try {
		object.save();
	} catch (IOException e) {
		// Handle error
	} catch (AppException e) {
		// Handle error
	}


データを参照する


List<KiiObject> objLists = null;

	try {

		KiiBucket bucket = Kii.bucket("任意の文字列");

		//今回は名前で検索(Select)
		KiiQuery query = new KiiQuery(KiiClause.and(KiiClause.equals(
		"username", "検索したい文字列")));

		// データ(object)が作成された時間でソート
		query.sortByDesc("_created");

		KiiQueryResult<KiiObject> result = bucket.query(query);
		objLists = result.getResult();

	} catch (IOException e) {
		// handle error
	} catch (AppException e) {
		// handle error
	}


//実際に取得したデータはfor文等でぶん回してtoURI()してあげると各データ一意のURIを取得できる。
//データを更新する際や削除する際に必要になるのでちゃんと別途保存しておこう。
for (KiiObject obj : objList){
	//URIを取得
	URI uri = obj.toURI();
}


実際には通信は別スレッドで受け取ったデータはUIに反映させるだろうから
もう少し長くなるけど基本的にはこれだけ。

データを更新する


	//上の「データを参照する」で拾ったobjectには各データ固有のURIをtoURI();で
	Uri objUri = Uri.parse("参照したデータから取得したURI");

	//objectに更新したいデータをURIを渡して指定する
	KiiObject object = KiiObject.createByUri(objUri);
	
	//更新も作成と大体同じ。当然カラム名が一致してないと更新できない
	object.set("data1", "TEST_C");
	object.set("data2", "TEST_D");

	// Save the object
	try {
		object.saveAllFields(true);
	} catch (IOException e) {
		// Handle error
		str = e.getMessage();
	} catch (AppException e) {
		// Handle error
		str = e.getMessage();
	}

データを削除する


	Uri objUri = Uri.parse("削除したいデータのURI");
	KiiObject object = KiiObject.createByUri(objUri);

	try {
		object.delete();
	} catch (AppException e) {
		// handle error
	} catch (IOException e) {
		// handle error
	}

またもこれだけ。たったこれだけで
SQLのSelect Insert Update Deleteが出来てしまう。

なんて楽なんだ…

Kii CloudでさくっとWebアプリを作ろう。 ログイン編

Kii Cloudでサインアップが完了したら実際に認証を行ったアカウントで
ログインしてみましょう。

ソース的にはこちらも前回とほとんど差がありません。

content-type:application/jsonになっているようにこちらは
jsonで値が返って来ますので素直にjson_decodeで
errorCode等を拾った方が分かりやすそうです。


		//送信するデータをJsonにする
		$hash = array(
				"username" => $_POST["name"], 
				"password" => $_POST["pass"]
		);

		//POSTするデータを設定
		$param = json_encode($hash);

		//今回はHeaderのみでURLにAPPKEYは不要みたい
		$url = "https://api-jp.kii.com/api/oauth2/token";

		//セッションの初期化
		$ch = curl_init();

		//リクエストを送るURL
		curl_setopt( $ch, CURLOPT_URL, $url );

		//ヘッダーの出力無し
		curl_setopt( $ch, CURLOPT_HEADER, 0 );

		//APPKEYとかぶち込む
		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
			'content-type:application/json',
			'x-kii-appid: {APPID}',
			'x-kii-appkey: {APPKEY}'
		    ));

		//POSTするデータ
		curl_setopt( $ch, CURLOPT_POSTFIELDS, $param );

		//結果を変数で受け取る
		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

		//リクエスト送信
		$res = curl_exec( $ch );

		//とりあえず結果を見てみる
 		echo $res;

		//セッションを終了
		curl_close( $ch );

Kii CloudでさくっとWebアプリを作ろう。 サインアップ編

前回 Android(java)でCloudを利用したアプリ作成を行ったけど
ブラウザからもデータを閲覧出来るようにしたい!と思って
Kii CloudのREST APIを使ってみることにした。

基本的には使い方はほとんど同じでサインアップなんかも
さくっとやってくれる。

レンタルサーバーのPHPでもlibcurlが動けば使えてしまうのでとても楽。

サインアップは以下のとおり


		//アカウント作成に必要な送信するデータを連想配列にする
		$hash = array(
				"emailAddress" => $_POST["emailAddress"], 
				"loginName" => $_POST["loginName"], 
				"password" => $_POST["password"], 
				"country" => "JP");

		//連想配列をJsonにしてPOSTするデータを設定
		$param = json_encode($hash);

		//{APPID}は各々自分のAPPIDを入力
		//日本語リファレンスでも https://api.kii.com となっているけど
		//日本のサーバー(https://api-jp.kii.com)にアクセスしないと404エラーが出るおそれがあるので注意

		$url = "https://api-jp.kii.com/api/apps/{APPID}/users";

		//セッションの初期化
		$ch = curl_init();

		//リクエストを送るURL
		curl_setopt( $ch, CURLOPT_URL, $url );

		//ヘッダーを出力 ここを0にしておけばJson形式で返ってくるので処理しよう。
		curl_setopt( $ch, CURLOPT_HEADER, 1 );

		//APPKEYとかぶち込む
		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
			'content-type:application/vnd.kii.RegistrationRequest+json',
			'x-kii-appid: {APPID}',
			'x-kii-appkey: {APPKEY}'
		    ));

		//POSTするデータ
		curl_setopt( $ch, CURLOPT_POSTFIELDS, $param );

		//結果を変数で受け取る
		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

		//リクエスト送信
		$res = curl_exec( $ch );

		//とりあえずヘッダー表示
		echo $res;

		//セッションを終了
		curl_close( $ch );

あとは返って来たヘッダーを見て201 Createとあれば正常にサインアップされているはず。

Kii Cloudでさくっとデータベースを使用したAndroidアプリを作ろう。 ユーザー認証編

クラウドクラウド言ってるけど
実際サーバーサイド書くのめんどくさいよー!って嘆いてたら
お世話になっている方にBaaS使えばいいじゃないって
Kii Cloudというサービスを教えていただいた。

BaaSってのは要するにモバイル関連サービスにありがちな機能を
全部まとめて簡単に使えるようにしちゃったよ♪っていうものらしい。

Kii Cloudは現在はBetaで無料(?)で使用出来る&日本語のドキュメントも用意されてたので
ちょっとAndroidからいじってみた。

今回作りたいアプリでKii Cloudで使える機能は

① アカウント作成
② サインイン
③ クライアントからデータをサーバーに送信
④ Web+Androidクライアントでサーバーからデータを取得・表示
⑤ PUSH通知

結局全部できる。なんなのBaas。

①のアカウント作成と②のサインインをちゃちゃっと実装。

・まずはkii cloudに登録
・サインイン後にCreate Appで作りたいAppを作成
・Access KeysをクリックするとApp IDApp Keyが表示される

実際にコードを書くのはここからで

まずおまじないでkii cloudの初期化をする

		Kii.initialize("APP_ID", "APP_KEY", Site.JP);

App IDApp Key
Access Keyで確認した自分のアプリの値を入力しておく

ここからアカウント作成を実装

今回はよくありがちなアカウント登録>メール認証を使ってみたかったので
 ・ユーザー名
 ・メールアドレス
 ・電話番号
を入力させてメールでURLを送りつけてクリックしたら認証完了っていう流れをやってみた。

やってみたといっても全て Kii Cloudに機能としてあるので
Kii Cloudのサイトから自分のAppを選んで

Edit > Settings > Require Verification の Mail Addressにチェックを入れて [Save]

準備はこれだけ。

書くコードは公式のリファレンスガイドより


kiiUser.Bulider builder = KiiUser.builderWithName("user_123456"); 
builder.withEmail("user_123456@example.com"); 
//builder.withPhone("+819012345678"); //電話認証も出来るようです
KiiUser user3 = builder.build(); 

try { 
    user3.register("123ABC"); 
} catch (AppException e) {
    // Sign-up failed for some reasons
    // Please check AppException to see what went wrong...
} catch (IOException e) { 
    // Sign-up failed for some reasons
    // Please check IOExecption to see what went wrong...
}

たったこれだけ。

kiiUser.Buliderに builderWithNameで ユーザーに入力してもらったユーザー名を入れて
withEmailで同じようにメールアドレスを入れて
kiiuserをbuildしてregisterする時にパスワードを渡すだけ。

registerした瞬間に通信してるのでこのへんはAsyncTaskでやらないとAndroid側がエラー出す。

あとはメールがポーンと届いてるのでURLクリックすると認証出来たよ的なことが表示される。

既に登録されてたり問題があるときはjsonでエラーが返ってくるようなので別途パースしないといけないかな?

まだちゃんと調べてないので後で追記します。

サインイン

これも数行

String username = "user_123456";
String password = "123ABC";
try {
    KiiUser loginUser = KiiUser.logIn(username, password);
} catch (IOException e) {
    // Sign-in failed for some reasons
    // Please check IOExecption to see what went wrong...
} catch (AppException e) {
    // Sign-in failed for some reasons
    // Please check AppException to see what went wrong...
}

ユーザー名とパスワード入力させて

KiiUser loginUser = KiiUser.logIn(username, password);

これだけだよ…

正常にログインできてたら KiiUserのmethodでいろいろ取得したり
メールアドレス・パスワードの変更とか出来るようなので
このへんも近いうちに書いてみる。

なんともはやこれだけでアカウント作成>サインインが実装できてしまった。

もうcakePHPなんて触らなくていいんだ!!

私のようなクソグラマーでもこんなものが作れてしまうのだから
恐ろしい世の中だ… Baas恐るべし。

一応ソース残しておく。じゃじゃっと書いたので汚いのは許して。

public class MainActivity extends Activity {

	private static Task authTask;
	private static LoginTask loginTask;
	private static ProgressDialog mProgressDialog;

	EditText txt_email;
	EditText txt_password;
	EditText txt_nickname;

	EditText txt_login_email;
	EditText txt_login_password;

	Button b_make_account;
	Button b_login;

	String msg = "";

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

		Kii.initialize("APP_ID", "APP_KEY", Site.JP);

		init();

	}

	private void showDialog() {
		mProgressDialog = new ProgressDialog(this);
		mProgressDialog.setMessage("通信中");
		mProgressDialog.setIndeterminate(false);
		mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		mProgressDialog.setCancelable(false);
		mProgressDialog.show();
	}

	private void dismissDialog() {
		mProgressDialog.dismiss();
		mProgressDialog = null;
	}

	private void init() {

		// 定義
		txt_email = (EditText) findViewById(R.id.txt_email);
		txt_password = (EditText) findViewById(R.id.txt_password);
		txt_nickname = (EditText) findViewById(R.id.txt_nickname);

		txt_login_password = (EditText) findViewById(R.id.txt_login_password);
		txt_login_email = (EditText) findViewById(R.id.txt_login_email);

		b_make_account = (Button) findViewById(R.id.b_make_account);
		b_login = (Button) findViewById(R.id.b_login);

		b_login.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				if (txt_nickname.getText().toString().equals("")
						|| txt_email.getText().toString().equals("")
						|| txt_password.getText().toString().equals("")) {

					Toast.makeText(getBaseContext(), "すべての項目を正しく入力してください",
							Toast.LENGTH_SHORT).show();

				} else {

					postLoginDetail post_login_detail = new postLoginDetail();
					post_login_detail.setParams(txt_login_email.getText()
							.toString(), txt_password.getText().toString());

					showDialog(); // プログレスダイアログの再表示
					loginTask = new LoginTask();
					loginTask.execute(post_login_detail);

				}

			}

		});

		// イベント処理
		b_make_account.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				String ptnStr = "[\\w\\.\\-]+@(?:[\\w\\-]+\\.)+[\\w\\-]+";
				Pattern ptn = Pattern.compile(ptnStr);
				String mail = txt_email.getText().toString();
				Matcher mc = ptn.matcher(mail);

				if (txt_nickname.getText().toString().equals("")
						|| txt_email.getText().toString().equals("")
						|| txt_password.getText().toString().equals("")
						|| !mc.matches()) {

					Toast.makeText(getBaseContext(), "すべての項目を正しく入力してください",
							Toast.LENGTH_SHORT).show();

				} else {

					postMakeAccount pma = new postMakeAccount();
					pma.setParams(txt_nickname.getText().toString(), txt_email
							.getText().toString(), txt_password.getText()
							.toString());

					showDialog(); // プログレスダイアログの再表示
					authTask = new Task();
					authTask.execute(pma);

				}

			}
		});

	}

	/**
	 * Task バックグラウンド処理用のクラス
	 */
	protected class LoginTask extends
			AsyncTask<postLoginDetail, String, String> {

		@Override
		protected String doInBackground(postLoginDetail... params) {
			String str = "";

			str = login(params[0]);

			return str;
		}

		/**
		 * onPostExecute
		 * 
		 * @param String
		 *            result 通信結果 結果を受け取ったときに・・・メインスレッド
		 */
		@Override
		protected void onPostExecute(String result) {
			dismissDialog();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * Task バックグラウンド処理用のクラス
	 */
	protected class Task extends AsyncTask<postMakeAccount, String, String> {

		@Override
		protected String doInBackground(postMakeAccount... params) {
			String str = "";

			str = makeAccount(params[0]);

			return str;
		}

		/**
		 * onPostExecute
		 * 
		 * @param String
		 *            result 通信結果 結果を受け取ったときに・・・メインスレッド
		 */
		@Override
		protected void onPostExecute(String result) {
			dismissDialog();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
		}
	}

	class postLoginDetail {

		String nickname = "";
		String password = "";

		void setParams(String n, String p) {
			nickname = n;
			password = p;
		}

		String getNickname() {
			return nickname;
		}

		String getPassword() {
			return password;
		}

	}

	class postMakeAccount {

		String nickname = "";
		String email = "";
		String password = "";

		void setParams(String n, String m, String p) {
			nickname = n;
			email = m;
			password = p;
		}

		String getNickname() {
			return nickname;
		}

		String getEmail() {
			return email;
		}

		String getPassword() {
			return password;
		}

	}

	private String login(postLoginDetail params) {

		String msg = "";

		String username = params.getNickname();
		String password = params.getPassword();

		try {
			KiiUser loginUser = KiiUser.logIn(username, password);

		} catch (IOException e) {
			// Sign-in failed for some reasons
			// Please check IOExecption to see what went wrong...
			msg = e.getMessage();

		} catch (AppException e) {
			// Sign-in failed for some reasons
			// Please check AppException to see what went wrong...
			msg = e.getMessage();

		}

		return msg;
	}

	private String makeAccount(postMakeAccount pma) {

		String msg = "";

		KiiUser.Builder builder = KiiUser.builderWithName(pma.getNickname());
		builder.withEmail(pma.getEmail());
		KiiUser user = builder.build();

		try {
			user.register(pma.getPassword());
			msg = "メールを確認しURLをクリックして認証を完了してください";
		} catch (AppException e) {
			msg = e.getMessage();
		} catch (IOException e) {
			msg = e.getMessage();
		}

		return msg;
	}

}


HTC One X root取得後の諸問題とCID & RUUの適用に関して

HTC One X root取得後の諸問題とCID & RUUの適用に関して
先日One Xのアンロックとroot取得後幾つか問題が発生していたので
報告と対処をググった内容をメモがてら載せておきます。
*前置きとしてまだCIDはNONEですがRUUは当てられるようです
①OTA当てられない or 当てた後まともに動かない
標準ROMでroot化後にOTAが降ってきます。
更新しろと言われるのですがまずまともに適用できません。
リカバリからroot化前にリストアして無理やり適用すると
なんとかあたるのですが今度は動画再生時や
スクリーンショット撮影時恐らく音が出るタイミングでリブートします。
これ正直使い物になりません。

これはもうカスタムロムを使うか後述のRUUを当てて初期化するか
古いバージョンのまま使うしか無いです。
ただカスタムROMでもリブートの問題は出ているようですね…
*症状個体差あり?
②OTA無理やり当てるとCWM Touch Recoveryちゃんと起動しない
正直これはビビリましたがさくっと治りました
ドロイド君が一瞬表示されてリカバリがリブートされてしまって
リストアすらできない!RUUも当てられないんじゃないの!と…

完全に死んだわけではなさそうだったのでリカバリ焼きなおそうと
再度CWMをfastboot flash recoveryで流し込みましたが
症状改善せず。恐らく無理やりOTA焼いた時に変な情報が
残っちゃったんだろうなと…

Wikiを見る感じ「fastboot erase cache」でキャッシュ消せば治るようです。
が厄介なことに治りませんでした…
こっから先は個体差あるようなので最終手段で
[TOOL] HTC One X All-In-One Toolkit V1.0 [4-17-12] [PERM ROOT][Noob-Proof] – xda-developers
結局リカバリなんかをワンクリックで焼けるOneX用の上のツールをダウンロードして
右上のNext flash a Recovery > stockを選んであげたら
初期リカバリに戻されることなくCWM touchが起動しました。
恐らく2回やれば初期リカバリに戻ると思います。が試してません。
③RUU当てて初期化する
これが一番困りました。結局今のところRUUを当てるには
HTC devの公式unlockしたものをrelockするのが手っ取り早いようです。
ただそれでもCIDがNONEであることには変わりませんが
ちゃんとRUU焼けてるしいいかな。
*他の国やキャリアのRUUは試してませんので文鎮化してもしらねす
unlock時に表示されていましたがrelockはfastbootに入って
「fastboot oem lock」と打つだけです
場合によっては「fastboot clear cache」してあげたほうがいいようです。
そのあとは下からお好きなRUUをダウンロードして実行してあげてください。
[ROM]Endeavor Shipped ROM Collection
[TOOL][30/04] Automated Fastboot Commands For HTC One X – V1.2 – xda-developers
*fastboot周りのコマンド入力手助けしてくれるツールみたいです
これぐらいは頭に入れておきたいところですが…

HTC One X購入 & root化 ついでにフォント変更俺zip

HTC One X購入 & root化 ついでにフォント変更俺zip.

先日ようやく HTC One X 到着しました。
Galaxy Nexusに慣れていたのでサイズは許容範囲内です。
普通の4インチ以下から持ち変えるととんでもなくでかく感じますね…
とりあえずベンチマークも動画で残してみました

そんなことはどうでもよくてあいも変わらず中華フォントなんです。
*毎度の事ですが以下は端末の保証もなくなるし文鎮の恐れもあるので自己責任で
*あとTwitterで教えてもらったのですが現在下記の方法でやると
CIDがNoneになる可能性があります。
下手するとRUUが当てられないかも…
復旧方法がリカバリぐらいしかなくなるしいろいろハイリスクなので
もう少し様子見でもいいかも。
先生の時と同じように”fastboot oem writecid 11111111″をすると
FAILED (status read failed (Too many links))
が帰ってきてしまいました…

今のところ手段は無いですがまぁXDAの盛り上がり見てれば対処されるでしょう。
あとOne Xバッテリー抜けないから一切応答なくなった時の再起動は
電源+音量両方同時押しで。
まず公式bootloaderロック解除とroot化はこちら
One Xのroot取得 – doggisma
頻繁にロム焼きするかわかりませんが
s-offされてないからadb shellからちまちまやらなきゃいけないし
めんどくさいのでフォント変更用のzip置いておきます。
(拾い物のフォントなので権利関係問題あったら言ってください。)
*と思ったら起動中にESファイルエクスプローラで
普通にフォント上書きできちゃいました。S-OFFとは何だったのか。
ということであまり意味のない俺zipです…

Clockworkmod recoveryから焼くだけです。
見にくいぞこのフォントって人はまぁ入れ替えて好きにしてください。
フォント変更用zipはこちら
では。

【プレゼント実施中】あにまるバッテリーのレビューを書いてストラップをゲット!

【プレゼント実施中】あにまるバッテリーのレビューを書いてストラップをゲット!
以前のエントリーにあるAndroidアプリ「うさうさバッテリー」
他の動物全11種類をまとめた【あにまるバッテリー】が
ついにauスマートパスの「アプリとり放題」で配信開始されました!
それにともなってAndroidマーケットでは
通常300円のところを100円に値下げ中!
さらにブログにレビューを書いてくれたら
うさぎのストラップをもれなくプレゼントしちゃいます!
(数量には限りがありますので早めにお申し込みください)
*無くなり次第受け付け終了いたします
Androidマーケットauスマートパスから
ダウンロードして記事を書いた後
下記のフォームから記事のURL等をご記入ください
【ここから入力】
*3つのお願い
・レビューはうさうさバッテリーや他の動物でも問題ありませんが
「auスマートパス」で「あにまるバッテリー」が配信されていることを必ず記入してください
*「」内の文言は必須です
・auスマートパス内のページ
「 http://pass.auone.jp/app/detail?app_id=6353700001111 」
へのリンクをおねがいたします。

・アプリのスクリーンショットか無い場合は下記の画像を150px以上
以上のサイズで表示してください

http://animal.abalol.com/animal_battery.png


応募お待ちしております!

あにまるバッテリー auスマートパス配信記念プレゼント!

あにまるバッテリー auスマートパス配信記念プレゼント!
以前のエントリーにあるAndroidアプリ「うさうさバッテリー」
他の動物全11種類をまとめた【あにまるバッテリー】が
ついにauスマートパスの「アプリとり放題」で配信開始されました!
【auスマートパスでダウンロード】
それに伴い日ごろの感謝もこめて
うさうさのストラッププレゼントキャンペーンを行いたいと思います!

①ツイッターでゲット!


 ツイッターで下記のURLからそのまま呟いてくれたら
 抽選で10名様(人数はツイート数次第で増やすかも)にプレゼント!
 流れてきたツイートを公式RTでもOKだよ!
 【ここをクリックしてツイートする】
 
③Google+でもうさうさストラップ抽選でプレゼントします!

http://goo.gl/a6Ovk

こちらの投稿を共有するだけ!
 他にもいろいろ考えてるので気が向いたら応募してね!

Androidアプリの汎用エラーレポート収集サーバを公開

Androidのアプリを公開して使ってもらうとエラーレポートの収集をしたいと思った時
現状マーケット以外には用意されていません。
Eclipseをつないでデバッグできる環境以外では詳細がわからず
再現待ちなんていう地味な作業が求められます。
adamrockerさんの古い記事にそんなレポートをサーバに収集する記事がありました。
throw Life – 「Androidアプリのバグ報告システムを考える」
コメント欄にサーバーサイドを作った方の投稿(http://aexceptions.appspot.com/)もあり
もう揃ってるじゃん!とおもったのですが
アプリ側からサーバーに渡す項目を追加したりできなさそう
(渡しても表示してくれなさそう?)だったので
ログインも無くフリーでかつ内容も自由なサーバサイドを公開しました。
いかんせん3時間そこそこで作ったので雑ですが
とりあえず自分の用途には問題なく使えているので
もしよかったら使ってみてください。
ばぐれぽた「http://abalol.com/bug_report/」 からどうぞ~
早い話がただPOSTされた内容を表示するだけなので下の処理さえあればよし。

List nvps = new ArrayList();
String bug = getFileBody(BUG_REPORT_FILE);
nvps.add(new BasicNameValuePair("app", sContext.getPackageName()));
nvps.add(new BasicNameValuePair("pass", "パスワード"));
nvps.add(new BasicNameValuePair("dev", Build.DEVICE));
nvps.add(new BasicNameValuePair("mod", Build.MODEL));
nvps.add(new BasicNameValuePair("sdk", Build.VERSION.SDK));
nvps.add(new BasicNameValuePair("ver", sPackInfo.versionName));
nvps.add(new BasicNameValuePair("bug", bug));
nvps.add(new BasicNameValuePair("必要なら", "場合に応じて"));
nvps.add(new BasicNameValuePair("お好きなだけ", "どうぞ"));
try {
HttpPost httpPost = new HttpPost("http://abalol.com/bug_report/getBug.php");
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.execute(httpPost);
} catch (IOException e) {
e.printStackTrace();
}

【Androidアプリ】シェアメモ - メッセージ送信&共有メモ

【Androidアプリ】シェアメモ - メッセージ送信&共有メモ

シェアメモとは?
AndroidやPCのブラウザで利用可能な
同時に複数の端末で情報共有できる
オンラインメモ&アラートアプリ「シェアメモ」。
  下記の内容が登録等一切不要で全て無料でご利用いただけます。
①個人の複数端末やオフ会等のグループ間で簡単にメモを共有したいとき
  メールや会員登録が必要なものは面倒ですがシェアメモなら
  みんなに同じキーを伝えるだけで相互に送受信できます。
  (人数に制限はありません)
②使用していない端末を家に置いておきシェアメモを常駐させ
  メールや電話に気づかない相手にメモを送信し音で通知できます。
  (もともと使ってない端末に常駐させて仕事が終わって帰るときにメールに気づかない嫁に
  メモを送信したり帰り際に買ってきて欲しいものを連絡し合うために作成しました)
④通知音をメッセージ確認するまで止まらないようにできるので
  離れた複数の相手へのモーニングコール変わりにも使用できそうです。
③パソコンからメモを送受信可能になりました。
  ブラウザさえあればメモの確認や送信が可能になります。
  なんかまだまだありそうです。使い方はあなた次第。
シェアメモ – Androidアプリ
https://market.android.com/details?id=abalol.com.sma
シェアメモ Webアプリ
http://abalol.com/share/
*現在送受信される情報は暗号化等行なっておりませんので
 クレジットカードやその他個人情報等は絶対に送信しないでください。
 万が一、キーが他人にバレた場合はすべての情報を閲覧される恐れがあります。