Java初心者が携帯百景投稿用クライアントを作る その1
HT-03Aで撮影した写真を携帯百景に投稿する時に文字の表示位置や色をソフトキーボードで入力するのも大変だなと思い、Javaの勉強を兼ねて入力ヘルパーを作ってみる実験
やりたいこと
Androidの場合ゴリゴリとすべて作り込まなくてもIntentという仕組みを使って、こういうデータでこういうことがしたいと投げることによりその処理が可能なアプリがある場合にそのアプリが出来ますよと手を挙げてくれる仕組み(かなりの意訳ですが)があるので、今回は画像データを受けてメーラーに投げるところまでが範囲
-
- カメラアプリやギャラリーの共有メニューに入力ヘルパーアプリを追加する
AndroidManifest.xmlにintent-filterを追加
<intent-filter> <action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/jpeg"/> </intent-filter>
jpegデータが投げられたら受けます(起動)
はまったところ
- メールアドレスを指定してもメーラーのto欄に設定されない
Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, "foo@bar.com"); it.putExtra(Intent.EXTRA_SUBJECT, title); it.setType("image/jpeg"); it.putExtra(Intent.EXTRA_STREAM, Uri.parse(String.valueOf(uri))); it.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(it);
なんて固定で書いても空っぽになる。
String[] adrs = {
"foo@bar.com",
};
it.putExtra(Intent.EXTRA_EMAIL, adrs);
と配列でセットしてあげればOK
- SQLのWHERE句はWHEREは書かなくて良い
どのサンプルを見ても実際にWHERE句を書いてある例がなくて四苦八苦*1
/* 携帯百景投稿用アドレス取得 */ String[] projection = new String[] { android.provider.Contacts.ContactMethodsColumns.DATA }; final Cursor cur = managedQuery(android.provider.Contacts.ContactMethods.CONTENT_EMAIL_URI, projection, android.provider.Contacts.ContactMethodsColumns.DATA + " LIKE '%movapic.com'", null, android.provider.Contacts.ContactMethodsColumns.DATA + " ASC"); int emailColumn = cur.getColumnIndex(android.provider.Contacts.ContactMethodsColumns.DATA); spinner_mail = (Spinner) findViewById(R.id.Spinner01); ArrayAdapter<String> adapter1 = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item); adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); while (cur.moveToNext()){ adapter1.add(cur.getString(emailColumn)); } spinner_mail.setAdapter(adapter1);
これで(ローカルの)コンタクトリストからドメインがmovapic.comのメールアドレスのみを抽出してドロップダウンリストにセット出来た
はまっているところ
大量のボタンのアクションを登録するのにいちいち全部の項目に対して記述していったら無駄なので配列の数分ループさせてボタンのテキストとかだけを変えたいが、どのIdに対してイベント等を登録するかというやり方しか調べられていない。
Button button1 = (Button) findViewById(R.id.Button01); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { // 処理 } );
ようはbutton1とかButton01と固定で書いているところを変数にしたい
メモ
EditTextのカーソル位置はgetSelectionStart()で取得出来るので、getText().toString()でEditTextのテキストを取得してカーソル位置に特定の文字列(タグとか)を挿入すればOK
*1:全部必要なのでnullとか