Hatena::ブログ(Diary)

しっくはっく

2010-10-15

AndroidでWebのログイン処理とか

| 10:40

HttpClientでログイン処理してWebViewにCookie引き継ぐのに手間取ったのでニコニコ動画へのログインサンプル書いとく。

基本的にはCookieStoreのCookieをCookieManagerに突っ込めば動くっぽい。

後、楽したければHttpClient使わないでもWebViewからjavascript叩けば何とかなる。

(jsでゴリゴリやんのはあまり好ましい手段ではないと思う)

なんか指摘があれば教えてくれると嬉しいです。

// WebViewの準備。WebSettingsはお好みで
WebView webview = new WebView(this);
WebSettings settings=webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setBlockNetworkImage(true);

// WebViewで使うcookieの準備
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().setAcceptCookie(true);
CookieManager.getInstance().removeExpiredCookie();

// HttpClientの準備
DefaultHttpClient httpClient;
httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
httpClient.getParams().setParameter("http.connection.timeout", 5000);
httpClient.getParams().setParameter("http.socket.timeout", 3000);
HttpPost httppost = new HttpPost("https://secure.nicovideo.jp/secure/login");
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(3);
nameValuePair.add(new BasicNameValuePair("mail", ""));
nameValuePair.add(new BasicNameValuePair("password", ""));
nameValuePair.add(new BasicNameValuePair("site", "niconico"));

// ログイン処理
try {
	httppost.setEntity(new UrlEncodedFormEntity(nameValuePair));
	HttpResponse response = httpClient.execute(httppost);
	ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	response.getEntity().writeTo(byteArrayOutputStream);
} catch (Exception e) {
	// FIXME
}

// HttpClientで得たCookieの情報をWebViewでも利用できるようにする
CookieStore cookieStr = httpClient.getCookieStore();
Cookie cookie = null;
if ( cookieStr != null ) {
	List<Cookie> cookies = cookieStr.getCookies();
	if (!cookies.isEmpty()) {
		for (int i = 0; i < cookies.size(); i++) {
			cookie = cookies.get(i);
		}
	}
	if (cookie != null) {
		String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();
		CookieManager.getInstance().setCookie( "nicovideo.jp", cookieString);
		CookieSyncManager.getInstance().sync();
	}
}

// ログイン状態で画面にアクセス
webview.loadUrl("http://www.nicovideo.jp/");
setContentView(webview);

Niroid更新

| 10:40

バグFixUIを変えるか悩み中。

Niroid

日付 バージョン 更新内容
10/15 v0.1.2

・検索等の処理をキャンセルした後にリストクリックで強制終了してしまう問題を修正。

10/11 v0.1.1

・検索・リスト表示の処理改善。

09/19 v0.1.0

・初回登録。

2010-10-14

更新情報

| 16:18

そういえばAniradioとNiroid更新してた。

更新履歴いつも引っ張って書いてるけどどっかにまとめた方が良い気がする。。。

気が向いたら整理したいけどブログで記事整理ってなんか違う気がしね?

Aniradio

日付 バージョン 更新内容
10/11 v0.2.0

フィルタ(検索)機能追加

アニたまキャッシュを日本語で行うよう変更

アニたま再生を安定化

09/19 v0.1.0

・初回登録。

Niroid

日付 バージョン 更新内容
10/11 v0.1.1

・検索・リスト表示の処理改善。

09/19 v0.1.0

・初回登録。

2010-09-19

色々更新&色々公開

| 14:56

あの楽器、anitamaを更新。

Aniradio、Niroid、Blocksを公開しました。

それにしてもブログ書かなすぎ。。

書くと頭の中整理できるしもう少し頑張る。

↓公開したアプリの紹介。

Aniradio

anitamaの改良版で音泉対応版。

anitamaを利用しても良かったけどパッケージも変えたかったりしたので別アプリとして公開しました。

あと、音泉mp3を利用している為、2.2以外のユーザでも利用出来るはず。

Niroid

ニコニコ動画の再生支援アプリ

既に素晴らしいアプリが公開されてはいるけどまぁ自分でもやってみたくなったので。

特徴としてはログインに対応している事位。

DefaultHttpClientでログイン処理を行ってWebViewにCookie引き継ぐ形で実装してます。

これはそのうちまとめて記事にする予定。

Blocks

ブロック崩しゲーム。

斑鳩やって楽しかったので玉に属性をつけてみた。

ゲームとしての体裁が整ってない。。。


↓更新履歴

Aniradio

日付 バージョン 更新内容
09/19 v0.1.0

・初回登録。

Niroid

日付 バージョン 更新内容
09/19 v0.1.0

・初回登録。

Blocks

日付 バージョン 更新内容
09/19 v0.1.0

・初回登録。

anitama

日付 バージョン 更新内容
09/19 v1.1.0

・ローカルファイルを日本語で表示する用に修正。

・Niroidに統合する旨を記載。

(そのうち公開停止予定)

07/19 v1.0.0

・初回登録。

あの楽器

日付 バージョン 更新内容
09/19 v2.1.0

・3段ピアノの追加

・タッチに合わせて音を止める機能を追加

・3段ピアノかつ当て振り時に鍵盤が光るエフェクトを追加

07/20 v2.0.1

・音源修正

07/11 v2.0.0

当て振り機能の楽曲追加

・マルチタッチにβ対応

・音源、描画、メニュー周り改修

・admobの追加

04/21 v1.1.0 鍵盤のピアノモード追加。

音色追加。

エフェクトの色を追加。

エフェクト、音のON/OFFを切り替え可能に変更。

当て振り機能追加(きらきら星)。

当て振り機能を利用しても転調は行われます。

 ピアノモードでご利用頂くと音が一定に保たれるかと思います。

04/14 v.1.0.1 メニューの表記を音階から移調に修正。ドを追加。
v.1.0 初回登録。

2010-07-21

androidでマルチタッチ

| 17:44

リリース情報だけじゃ何なので実装のメモ。

今回はマルチタッチにの実装について。

ざっくりとソース。動作は未確認!

	int maxtouch = 2;
	float touchX[] = new float[maxtouch];
	float touchY[] = new float[maxtouch];
	int action[] = new int[maxtouch];
	boolean touched[] = new boolean[maxtouch];
	int act = event.getAction();
	int ptrId = event.getPointerId(0);

	if (event.getPointerCount() > 1) {
		ptrId = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
	}

	act = act & MotionEvent.ACTION_MASK;
	if (act == MotionEvent.ACTION_POINTER_DOWN
		|| act == MotionEvent.ACTION_POINTER_UP ) {
		// ACTION_POINTER_DOWN(5)をACTION_DOWN(0)。ACTION_POINTER_UP(6)をACTION_UP(1)へ変換する。
		act = act - 5;
	}

	if (act == MotionEvent.ACTION_DOWN) {
		for (int i = 0; i < event.getPointerCount(); i++) {
			float x = event.getX(i);
			float y = event.getY(i);
			touchX[event.getPointerId(i)] = x;
			touchY[event.getPointerId(i)] = y;
		}
		action[ptrId] = MotionEvent.ACTION_DOWN;
		touched[ptrId] = true;
	}
	else if (act == MotionEvent.ACTION_MOVE) {
		for (int i = 0; i < event.getPointerCount(); i++) {
			float x = event.getX(i);
			float y = event.getY(i);
			touchX[event.getPointerId(i)] = x;
			touchY[event.getPointerId(i)] = y;
		}
		action[ptrId] = MotionEvent.ACTION_MOVE;
	}
	else if (act == MotionEvent.ACTION_UP) {
		touched[ptrId] = false;
		if (event.getPointerCount() == 1) {
			for (int i = 0; i < event.getPointerCount(); i++) {
				touched[i] = false;
			}
		}
		action[ptrId] = MotionEvent.ACTION_UP;
	}
	else if (act == MotionEvent.ACTION_CANCEL) {
		touched[ptrId] = false;
		if (event.getPointerCount() == 1) {
			for (int i = 0; i < event.getPointerCount(); i++) {
				touched[i] = false;
			}
		}
		action[ptrId] = MotionEvent.ACTION_CANCEL;
	}

基本はタッチしたポインタの特定とACTIONがACTION_POINTER_n_DOWNとか分かりづらい感じに渡されるのでマスクして普通のACTIONに直してるだけ。

1.6環境と共存する場合はBuild.VERSION.SDK_INTとかで判定して呼ぶなりすれば良い。

(2.1環境でビルドしないとエラーが出るのでビルドは2.1。Manifest.xmlandroid:minSdkVersionを4とかにする)

あの楽器は通常のタッチクラスとタッチクラスを継承したマルチタッチクラスを作成して

Build.VERSION.SDK_INTによって生成するクラスを分けています。

後、x,y座標は毎回まわしてとってるけどイベント起こしたポインタだけで良い気がする。

何となく精度が低い気がするので間違ってる部分があれば教えてください!

ななしななし 2011/06/21 08:35 マルチタッチの実装としては非常に不十分です。
# 特に-5してるあたりが。応用がきかない実装です。
マスクビットとか、その辺りを掘り下げて勉強してみてはいかがでしょうか。

2010-07-20

色々更新&anitama公開

| 11:07

あの楽器とあの動画を更新しました。

あの楽器はこれでxperiaに対応。

また、anitamaも公開。

anitamaはアニたまどっとコムの再生サポートアプリ

音声ファイルがflvなのでfroyoのみに対応。

あと、あの動画で保存するファイルはmp4とかが多いっぽいので

froyo以外でも再生できる気がする。

試してうまく行けば1.6向けでも出せるかも。

↓更新履歴

anitama

日付 バージョン 更新内容
07/19 v1.0.0

・初回登録。

あの動画

日付 バージョン 更新内容
07/11 v0.3.2

・ランキングクリック時にエラーが発生してしまうのを修正。

07/19 v0.3.1

・保存機能を修正。

・メニューから保存したファイルを参照し他アプリに渡せるように修正。

これによりmp4形式のファイルであれば大体再生できるように。

07/11 v0.3.0

・動画の保存にβ対応

06/29 v0.2.0

・動画再生中にスリープへ移行しないように変更。

・動画再生画面の改善

06/16 v.0.1.0 初回登録。

あの楽器

日付 バージョン 更新内容
07/20 v2.0.1

・音源修正

07/11 v2.0.0

当て振り機能の楽曲追加

・マルチタッチにβ対応

・音源、描画、メニュー周り改修

・admobの追加

04/21 v1.1.0 鍵盤のピアノモード追加。

音色追加。

エフェクトの色を追加。

エフェクト、音のON/OFFを切り替え可能に変更。

当て振り機能追加(きらきら星)。

当て振り機能を利用しても転調は行われます。

 ピアノモードでご利用頂くと音が一定に保たれるかと思います。

04/14 v.1.0.1 メニューの表記を音階から移調に修正。ドを追加。
v.1.0 初回登録。