PhoneGapを試す

AdobeがPhoneGap(の開発元)を買収したということで、Titniumだけでなくこっちも来るかも? ということでサンプルコードを試したので、その手順とハマりポイントとか。


  1. まずはgithubからテンプレートを作ってくれるコンソールアプリをダウンロード。
    git clone https://github.com/phonegap/phonegap-android.git
  2. テンプレート作成は↓の手順どおり、「./bin/create app_name」といった感じで(コンソールアプリのパスを通しておく必要あり。
    https://github.com/phonegap/phonegap-android/blob/master/README.md
  3. 出来たテンプレートをEclipseに取り込む作業は、普通に外部ソースからプロジェクト作成すればOK。
  4. で、唯一のハマりポイントは生成されたテンプレートのHTMLのソースが間違ってて
    <script type="text/javascript" charset="utf-8" src="phonegap-1.0.0"></script>
    
    を、↓に直してやる
    <script type="text/javascript" charset="utf-8" src="phonegap-1.1.0"></script>
  5. あとは、エミュレータなり実機なりで動かしてみる。
device-2011-10-06-152727.png

複数のメアドに送りたい場合、この方法じゃ無理。

mWebView.setWebViewClient(new WebViewClient() {
	@Override
	public boolean shouldOverrideUrlLoading(WebView webView, String url) {
		if(url.substring(0, 7).equals("mailto:")) {
			Uri uri = Uri.parse(url);
			Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
			startActivity(intent);
			webView.reload();
		}
		else {
			webView.loadUrl(url);
		}

		return true;
	}
});
自分で実装するの嫌だったけど(テストケース用意するのがめんどいので)、サクっと見つからなかったんで、結局自分でコード起こすことに。

	public static boolean checkDiditM10W3(String digit) {
		boolean result = false;

		// 入力文字列に数字以外が含まれた場合は、false
		if (Pattern.compile("^[0-9]+$").matcher(digit).find()) {
			// チェックデジットの算出
			int checkDigit = 0;
			String _digit = digit.substring(0, digit.length() - 1);
			for (int index = 0, length = _digit.length(); index < length; index++) {
				checkDigit += 
					Integer.parseInt(_digit.substring(index, index + 1)) * 
					(index % 2 == 0 ? 1 : 3);
			}
			checkDigit = checkDigit % 10;
			checkDigit = checkDigit == 0 ? 0 : 10 - checkDigit;

			// 算出したチェックデジットと比較
			if (digit.substring(digit.length() - 1, digit.length()).equals(String.valueOf(checkDigit))) {
				result = true;
			}
		}

		return result;
	}
	/**
	 * @param activity
	 * @param agreement
	 * @return
	 */
	public static CharSequence getRawTextData(Activity activity, int rawTextId) {
		StringBuilder stringBuilder = new StringBuilder();
		String string = "";

		BufferedReader bufferdReader =
			new BufferedReader(new InputStreamReader(activity.getResources().openRawResource(rawTextId)));
		try {
			try {
				while ((string = bufferdReader.readLine()) != null) {
					stringBuilder.append(string).append("\n");
				}
			}
			finally {
				if (bufferdReader != null) {
					bufferdReader.close();
				}
			}
		}
		catch (IOException e) {
			// 読み込みエラー時
		}
		
		return stringBuilder.toString();
	}
とある案件でBackKeyもろもろのキー操作が出来ないといった環境で、フォームにフォーカスが当たるとソフトウェアキーボードが出っぱなしになるのをどうにかしたいと調べてみたら、先人の知恵がやっぱりあった。
https://groups.google.com/group/android-sdk-japan/browse_thread/thread/e5cf528425fc7c9e/ef5ad3f5ce61af97?show_docid=ef5ad3f5ce61af97&hl=ja

フォームの外(?)をクリックされたら、非表示にするようにってことでコード的には↓な感じに
mLinearLayout = (LinearLayout) findViewById(R.id.linearlayout);
mLinearLayout.setOnClickListener(new OnClickListener() {
	public void onClick(View v) {
		InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
		imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
	}
});