2011/04/30

GmailResender Ver0.2.0 公開


・「カレンダーに登録」機能を追加しました。
 メール一覧のロングクリックで、メールの件名をタイトルに本文を内容に設定して、カレンダーアプリを起動します。
・設定画面を実装しました。
 起動時に表示するラベルを「受信トレイ」「送信済みメール」「前回終了時のラベル」「起動時に選択」から設定できます。

更新情報・アプリのダウンロードは、こちらです。

2011/04/29

Intentでカレンダーアプリを呼び出す方法

Intentで「タイトル」や「内容」、「場所」、「開始日時」、「終了日時」、「終日」を設定してカレンダーアプリを起動する方法。
ここここを参考にした。
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra("title", "!タイトル!");        // タイトル
intent.putExtra("description", "!内容!");    // 内容
intent.putExtra("eventLocation", "!場所!");  //場所
Calendar cal = Calendar.getInstance();
cal.set(2011, 4, 29, 20, 0);
intent.putExtra("beginTime", cal.getTimeInMillis());  // 開始日時
cal.set(2011, 4, 29, 23, 0);
intent.putExtra("endTime", cal.getTimeInMillis());    // 終了日時
intent.putExtra("allDay", true);                      // 終日
startActivity(intent);

2011/04/28

BloggerにFaviconを設定する方法

1.16x16サイズのアイコンを準備する。
2.Bloggerはicoファイルをアップロードできないので、googleサイトを利用して、ファイルキャビネットのページを作成し、そこにicoファイルをアップロードする。
3.アップロードしたファイルのリンクアドレスをコピーする。
4.Bloggerのダッシュボードから「デザイン」-「HTMLの編集」でテンプレートを編集
テンプレートの編集内容:
</head>タグの前に
<link href='hogehoge' rel='shortcut icon' type='image/x-icon'/>
を挿入する。hogehoge部分には、アップロードしたファイルのリンクアドレス(例:https://sites.google.com/site/hoge/favicon.ico)を書く
5.テンプレートを保存
以上。
※1</head>タグの直前に書くのが吉。なぜだか<head>タグの直後に書くとうまくいかない。
※2アップロードしたファイルのリンクアドレスの最後に付く「?attredirects=0」はあっても無くても問題なさそう。
今回設定したfaviconは、こんな感じ。
左から、BlogHome用、デジタル機器漬け用、Tweet日記用。

2011/04/23

PreferenceActivityの呼び出しでエラー

PreferenceActivityの呼び出しで上のようなエラーが出でて困ったので、調査方法をメモ。

Intent intentPref = new Intent(this,SettingActivity.class); // インテントへのインスタンス生成
startActivity(intentPref); // 設定画面(インテント)の起動


この、startActivity実行時にエラーになっていたのだが、理由が分からなかった。
分かってしまえばショウモナイ事なのだが調べる方法をメモしておく。
エラーをキャッチしてログに残せばいい」のだ。
上のコードを下のコードに変えてLogCatを見れば一発で解決!

Intent intentPref = new Intent(this,SettingActivity.class);    // インテントへのインスタンス生成
try {
    startActivity(intentPref); // 設定画面(インテント)の起動          
} catch (ActivityNotFoundException e) {
    Log.d(LOGTAG, "intentPrefErr=" + e.getMessage());
}

LogCatに「intentPrefErr=Unable to find explicit activity class {net.taku1974.GmailResender/net.taku1974.GmailResender.SettingActivity}; have you declared this activity in your AndroidManifest.xml?」ってでた。「AndroidManifest.xmlに宣言してる?」って。そう、マニフェストに宣言するのを忘れてただけってオチ、、、

2011/04/20

GoogleChromeで複数アカウントを使用する

複数のGoogleアカウント切り替える場合、いちいちログアウトして再ログインしないといけないが、GoogleChromeで複数のGoogleアカウント環境を同時に起動する方法がある。


設定方法:
1.ディスクトップにある「GoogleChrme」のショートカットをコピーする
2.2つ目のアカウント用にデータフォルダを作成しておく(今回はC:\hoge\hogehogeとする)
3.プロパティを開いて、「リンク先」の欄の後ろに_--user-data-dir="C:\hoge\hogehoge"と入力する(_は半角スペース)
4.作業フォルダも一応"C:\hoge\hogehoge"に変更して「OK」

これで、元々のショートカットからの起動したChromeとコピーしたショートカットから起動したChromeで全く別環境を構築できる。

家族で同じPCを使う場合や、一人で複数のGoogleアカウントを同時に利用したい時に便利。




結果がこんな感じ

2011/04/19

GmailResender Ver0.1.1 公開


アプリ紹介:
Android1.6~2.1の標準Gmailアプリの補助ソフトで標準Gmailアプリと併用する事を前提としてます。
このアプリで出来ること
・再送信(送信済みメールを送信前の状態にしてメーラーを起動します)
・返信(受信メールを引用無しの返信状態にしてメーラーを起動します)
・件名のコピー(件名をクリップボードにコピーします)
・本文のコピー(本文をクリップボードにコピーします)
・メールアドレスをアドレス帳の登録名で表示します
※メールの送受信は標準Gmailアプリにさせるので、このアプリにパスワードを入力する必要がありません。

使い方:
・メール一覧の「クリック」でメール内容をプレビュー表示
・メール一覧の「ロングクリック」でメール操作一覧を表示
・メニューの「ラベル選択」でメール一覧に表示するラベルを選択
・メニューの「アカウント」でメール一覧に表示するアカウントを選択
・メニューの「更新」でメール一覧を最新の状態に更新
・メニューの「設定」は、何もしません(現在未実装)
※標準Gmailアプリ側の「設定」-「ラベル」-「同期する日数」を長めに設定して、各ラベルを同期する設定にしてください。このアプリは同期されたメールしかメール一覧に表示しません。

未対応(今後対応するかもしれない内容):
・添付ファイルの表示
・絵文字を含む送信済みメールの再送信(絵文字部分が[OBJ]表示になってしまう)
・キャッシュのSDカードへの保存(現在は本体メモリに保存される)
・メールの削除、アーカイブ、既読にする、ラベル操作

動作確認機種:
・SO-01B Xperia X10 (2.1-update1)

ダウンロード&インストール方法:
下記リンク又はQRコードから、スマートフォンでアクセスしてください。
ダウンロードが完了したら、GmailResender011.apkを実行してください(ステータスバーから実行出来ると思います)
実行すると注意事項が表示され同意するとインストールが始まります。
「インストールはブロックされました」とメッセージが出る場合は、「設定」から提供元不明のアプリにチェックを入れてサードパーティアプリケーションのインストールを許可してください。
後は通常のアプリと同様にアイコンをクリックして起動してください。
GmailResender011.apk

2011/04/17

GmailResender Ver0.1.0 test公開

開発中のAndroidアプリのGmailResenderが、そこそこ完成したので野良アプリとしての公開方法をテスト。
下のリンクからダウンロード出来るかな?
アンドロイド端末から直接ダウンロード-インストール出来るかな?
これから実験してみるところ、、、
上手くできたら、インストールの仕方とかアプリの使い方とか投稿します。
とりあえず今回はテスト。。。

リンクからダウンロード
GmailResender010.apk

QRコードからダウンロード

カスタムタイトルバー

いつもお世話になっているここを参考にカスタムタイトルバーを使ってみた。
やりたかったことは、タイトルバーに右寄せで選択中のアカウントを表示する。選択中ラベルと重なる時は、選択中ラベルは省略せずにそのまま表示して、アカウントの方は最後を省略(...)で表示する。
できた結果がこれ↓
意外に苦労したのでソースを公開

custom_title.xmlを作成して、
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
     >
        <ImageView
            android:id="@+id/title_left_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
         />
        <TextView 
            android:id="@+id/title_left_text"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:ellipsize="none"
            android:singleLine="true"
            style="?android:attr/windowTitleStyle"
            android:gravity="center_vertical"
         />
        <TextView 
           android:id="@+id/title_right_text"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:ellipsize="end"
           android:singleLine="true"
           android:textColor="#ffffff"
           android:textStyle="italic"
           android:gravity="center_vertical"
         />
    </LinearLayout>
</RelativeLayout>

ActivityのonCreateで、
public class GmailResenderActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); // タイトルバーをカスタム宣言
    setContentView(R.layout.main);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title); // カスタムタイトル登録
タイトルバーを更新したいところで、
// タイトルバー表示
ImageView iv = (ImageView) findViewById(R.id.title_left_image); // 左側イメージアイコン
iv.setImageResource(R.drawable.icon);
TextView tv;
tv = (TextView) findViewById(R.id.title_left_text); // 左側タイトル
tv.setText(selectedLabel);       // ラベル名表示
tv = (TextView) findViewById(R.id.title_right_text); // 右側タイトル
SpannableStringBuilder spannable = new SpannableStringBuilder();
spannable.append(account);
// 右揃えの SPAN インスタンスを生成。
AlignmentSpan.Standard right_span = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE);    
// SPAN を SpannableStringBuilder に組み込む。
spannable.setSpan(right_span, 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(spannable);
で出来上がり。

2011/04/16

LogCatが表示されない時

EclipseのLogCatが突然、
「logcat read: Invalid argument」
というエラー表示以外、表示されなくなった。
対処方法:
Android SDKをインストールしたフォルダ配下の
「platform-tools」の「adb.exe」にパラメータ「logcat -c」を付けて実行することで直るらしい。
私の環境の場合、
「スタート」-「ファイル名を指定して実行(R)」から、
D:\android\android-sdk\platform-tools\adb.exe logcat -c
として、Eclipseを再起動で直りました。

2011/04/13

ListViewにコンテキストメニュー追加とクリップボードにコピー

ここ>を参考にして、ListViewにコンテキストメニュー(ロングクリックで出てくるメニュー)を追加した。

1.ListViewにロングクリックリスナーを設定していると実行時エラーになるのでロングクリックリスナーは削除しておく。
2.コンテキストメニューで何を選択されたかは、MenuItem#getTitle()で取得。
3.ListViewのどの位置で押されたかは、MenuItem#getMenuInfo()をAdapterContextMenuInfoにキャストして、AdapterContextMenuInfo#positionで取得。
4.クリップボードへのコピーはClipboardManagerを使うだけで超簡単。

//  コンテキストメニュー表示
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, view, menuInfo);
    AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo;
    ListView listView = (ListView) view;
    Map map = (Map) listView.getItemAtPosition(adapterInfo.position);
    Log.d(LOGTAG, "DBG:onCreateContextMenu position=" + adapterInfo.position);
    menu.setHeaderTitle(map.get("name").toString() + map.get("subject").toString());
    menu.add(getString(R.string.ContextMenuResend));
    menu.add(getString(R.string.ContextMenuCopySubject));
    menu.add(getString(R.string.ContextMenuCopyBody));
}
// コンテキストメニュー処理部
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) item.getMenuInfo();
    Log.d(LOGTAG, "DBG:onContextItemSelected adapterInfo.position=" + adapterInfo.position);
    String strKindOfMenu = (String)item.getTitle();
    Log.d(LOGTAG, "DBG:onContextItemSelected getTitle=" + strKindOfMenu);
    if(strKindOfMenu.equals(getString(R.string.ContextMenuResend))){ // 再送信/返信の時
        setResendMessage(adapterInfo.position);
    }else{        // クリップボードにコピーの時
        copySubjectBody(strKindOfMenu, adapterInfo.position);
    }
        return super.onContextItemSelected(item);
}
// 件名・本文をクリップボードへコピー
protected void copySubjectBody(String strKindOfCopy, int position) {
    Map<String, Object> map = (Map<String, Object>) listview.getItemAtPosition(position);
    long messageId = (Long) map.get("messageId");
    MessageCursor mc = gmail.getMessageCursorForMessageId(account, messageId);
    if(mc.next()){
        ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); // クリップボードマネージャ
        if(strKindOfCopy.equals(getString(R.string.ContextMenuCopySubject))){ // 件名をコピー
            cm.setText(mc.getSubject());  // クリップボードへ件名をコピー
        }else if(strKindOfCopy.equals(getString(R.string.ContextMenuCopyBody))){ // 本文をコピー
            cm.setText(Html.fromHtml(mc.getBody())); // クリップボードへ本文をコピー
        }
        Toast.makeText(this, strKindOfCopy + getString(R.string.msgFinish), Toast.LENGTH_SHORT).show(); // トーストで完了を表示
    }
}

2011/04/04

アイコン作成

ここを参考に、現在作製中のアプリ「GmailResender」用のアイコンを作ってみた。
Gmailアイコンを元に変形して、「Re」を追加した。こんな感じになった。
今回使用したアプリは「GIMP2」フリーでここまで出来るとは、、、すばらしい。

2011/04/01

アプリにメニューを追加する


ここここを参考に追加してみたが、メニューアイコンでつまずいたのでメモっておく。
設定アイコン(ic_menu_preferences)の方は、下図の①のようにmenu.xmlに記述すれば上手く表示されたのだがアーカイブアイコン(ic_menu_archive)の方が上手くいかない。
「android:icon="@android:drawable/ic_menu_archive"」と記述すれば、「エラー: Resource is not public.」と怒られる。
「android:icon="@*android:drawable/ic_menu_archive"」と記述すれば、エラーは無くなり実行できるが何故かではなくが表示された、、、意味不明!

仕方ないので下図の②のように記述して、③に「ic_menu_archive.png」をコピーすれば上手くいった。