Java初心者が携帯百景投稿用クライアントを作る その1

HT-03Aで撮影した写真を携帯百景に投稿する時に文字の表示位置や色をソフトキーボードで入力するのも大変だなと思い、Javaの勉強を兼ねて入力ヘルパーを作ってみる実験

やりたいこと

    1. カメラアプリやギャラリーの共有メニューに入力ヘルパーアプリを追加する
    2. ヘルパーアプリではコンタクトリストから投稿用メールアドレスを取得、文字色や文字位置、サイズをドロップダウンリストから選択出来るようにする
    3. 投稿ボタンをクリックで予め送信先アドレス、タイトル(表示コマンド)がセットされた状態でメーラーアプリを起動する
    4. メールを送信後にカメラアプリまたはギャラリーへ戻る

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とか