2009-03-18

Java : iアプリで着信履歴を取得したい


iアプリで着信履歴を取得したい。



Q. iアプリで着信履歴を取ってこれるか?

A.
DoJa-3.0 から発着信履歴が取ってこれるようなことができるらしい。
-> DoJa-3.x プロファイルについて - Q. トラステッドiアプリ(iアプリDX)ではどのようなことが可能になりますか? を参照


Q. トラステッドiアプリ(iアプリDX)って?

A.
iモードメニューからじゃないと配信できないアプリっぽい?
-> 「iMenu」の「メニューリスト」でコンテンツ提供の申し込みは NTT DOCOMO IP申込 から



Q. まぁ、発着信履歴ってどうやって取得するの?

A.
※ API:DoJa-5.xプロファイル向けiアプリに関する技術資料 - iアプリコンテンツ開発ガイド for DoJa-5.0 APIリファレンス編

com.nttdocomo.system.CallRecord

携帯電話のネイティブの音声発着信履歴機能にアクセスする手段を提供します。

音声発着信履歴データの取得機能を提供します。 getLastRecordメソッドを実行することにより、 端末に保存されている最新の音声発着信履歴を取得することができます。 取得されたエントリには、 相手の電話番号(XString)、 相手の電話番号が登録されている電話帳エントリのID、 日時(XStringとして取得可能)、 接続が成功したか否かの情報、 発着信の種別 が設定されています。

com.nttdocomo.system.CallRecord#getLastRecord

public static CallRecord getLastRecord(int type)

発着信履歴の最新のエントリを取得します。 最後の発着信ではなく、発着信履歴に残っている最新のエントリを返します。

取得されたエントリには、 相手の電話番号(XString)、 相手の電話番号が登録されている電話帳エントリのID、 日時(XStringとして取得可能)、 接続が成功したか否かの情報、 発着信の種別が設定されています。

ただし、発信履歴の場合、 日時、接続が成功したか否かの情報、 ならびに発信の種別が設定されているかどうかは機種依存です。

パーミッションとして携帯電話情報の参照が許可されている トラステッドiアプリのみこのメソッドを呼び出すことができます。



... 最新の 1 件しか取ってこれないじゃないか!?




先ずは、実装して動かしてるか ... 。




※ 開発環境:DoJa-5.0 + J2SE1.4.2_18 + NetBeans4.1
※ 実行環境:DoJa-5.0プロファイル向けiアプリ開発ツール(iαppli Development Kit for DoJa-5.0)


下記で、プロジェクトの構築で dx.jar と dx.jam を生成

Sample.java
package dx;

public class Sample extends IApplication {

public void start() {
    Display.setCurrent(new SamplePanel());
}

/*
 * 最新の着信履歴を取得し、画面上に電話番号を表示する
 */
class SamplePanel extends Panel {
    public SamplePanel() {
        try {
            CallRecord record = CallRecord.getLastRecord(CallRecord.CALL_IN);
            XString number = new XString("");
            if (record == null) {
                number = new XString("not history.");
            } else {
                number = record.getPhoneNumber();
            }
            this.add(new Label(number));
        } catch (Throwable e) {
            this.add(new Label("internal error."));
        }

    }
}
}

ADF 設定(NetBeans4.1 -> メニュー -> (プロジェクトを選択して)DoJa-5.0 -> ADF/トラステッド動作設定)
AppName = Sample
AppClass = dx.Sample

※ 設定項目のみ記述


エミュレータで実行
SecurityViolation: x getLastRecord 0


セキュリティ違反!?


トラステッドiアプリ(iアプリDX)では TrustedAPID の設定をしないといけないらしい。
なので、TrustedAPID の項目に適当に数字 11 桁を設定してみる。

ADF 設定(NetBeans4.1 -> メニュー -> (プロジェクトを選択して)DoJa-5.0 -> ADF/トラステッド動作設定)
TrustedAPID = 12345678901

※ 設定項目のみ記述
※ 構築後に生成される dx.jam を直接書き換えてもいいんじゃないかとか



で、プロジェクトを再構築、エミュレータで実行してみる。
うごいたうごいた。



次は、適当にサーバを用意してそこから実機でダウンロード

download.html
<HTML>
 <HEAD>
   <TITLE>download</TITLE>
 </HEAD>
 <BODY>
   <OBJECT declare id="dx" data="dx.jam" type="application/x-jam"></OBJECT><BR>
   <A ijam="#dx" href="no.html">DOWNLOAD</A>
 </BODY>
</HTML>

no.html
<HTML>
 <HEAD>
   <TITLE>error</TITLE>
 </HEAD>
 <BODY>
   iアプリをダウンロードできません。<br>
 </BODY>
</HTML>



実機での実行結果
「ソフトに誤りがあるため、ダウンロードできません」




NTT docomo から TrustedAPID をもらわないとどうにもならないね。



参考
iアプリ
iアプリ | サービス・機能 | NTTドコモ
TrustedAPID
TrustedAPIDに関する推察 - 試行錯誤と創意工夫(S!アプリ開発日記+α)

2009-03-11

Java : iアプリの開発環境(DoJa-5.0 + J2SE1.4.2_18 + NetBeans4.1)を整えてみる


iアプリの開発環境(DoJa-5.0 + J2SE1.4.2_18 + NetBeans4.1)を整えてみる。




DoJa-5.0 プロファイル向けiアプリ開発ツール(iαppli Development Kit for DoJa-5.0)なんてものを使おうとしたら システム要件 の注意に

注意2 Jave2 SDK, Standard EditionVersion 1.4.2以外の動作確認はしておりません。
注意4 NetBeans IDE 4.1以外での動作確認はしておりません。

とかとか。


それはさておき、下記の順番でダウンロードしてインストール。
続いて、ごにょごにょ。詳細は DoJa-5.0 をインストールしてできたディレクトリの直下にある DevGuide.pdf の p.269 くらいから読めば十分だと思う。


んで、サンプルをつくって、いざプロジェクトを構築。... エラー。

com.nttdocomo.ui.IApplication クラスが見つからない

とな。(エラーとってなかったのでどんなエラーだったかはもう不明)
Javaのソースクラスパスに「$DOJA_HOME\lib\classes.zip」「$DOJA_HOME\iDKDoJa5.0\lib\doja_classes.zip」へ通さないといけない?でも、そんなことガイドには書いてない。IDE 使わないときに必要なんだろ。



悩むこと小一時間。



DoJa-5.0 はデフォルトだと $DOJA_HOME は

C:\iDKDoJa5.0

なのだけれども、個人的な嗜好により

C:\Program Files\...\iDKDoJa5.0

にした。それが悪かった ... 。なので、

C:\mobile\iDKDoJa5.0

に変えて再インストール。
何事もなかったかのように、プロジェクトは構築され、実行できた。
ああ。そこはかとなく 「Apache Group」というものを思い出した。



追記。
あ、DoJa-5.1 を使ってるつもりが、DoJa-5.0 だった。まいっか。

2009-03-04

Java : JavaMail を使って gmail 経由でメールを送信してみる


gmail でちょっとごにょごにょ。


public static void send(String to, String subject, String text) throws Exception {
    Properties properties = new Properties();
    properties.setProperty("mail.smtp.host", "smtp.gmail.com");
    properties.setProperty("mail.smtp.port", "587");
    properties.setProperty("mail.smtp.starttls.enable", "true");
    properties.setProperty("mail.smtp.auth", "true");
    Session session = Session.getInstance(properties, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("user_name", "password");
        }
    });
    MimeMessage message = new MimeMessage(session);
    try {
        message.setFrom(new InternetAddress("xxx@gmail.com"));
        message.setRecipients(Message.RecipientType.TO, "piyo@foo.co.jp");
        message.setSubject("test", "iso-2022-jp");
        message.setText("fooboo", "iso-2022-jp");
        Transport.send(message);
    } catch (Exception e) {
        throw e;
    }
}



なんてのを、スケジュールで定期的に実行していたら ... 。


This is an automatically generated Delivery Status Notification

Delivery to the following recipient failed permanently:

    piyo@foo.co.jp

Technical details of permanent failure:
Message rejected.  See http://mail.google.com/support/bin/answer.py?answer=69585 for more information.

  ----- Original message -----

(以下略)



とかとか。
一旦は送信されるらしい(送信済みメールに履歴が残る)けど受信トレイに素敵なメッセージとともに戻ってくる。(仮に送信されっぱなしの場合は、数時間後に送信先へ到着)

AUTH LOGIN で頻繁に認証を行うとスパムに認定されてしまうのか。
けど、他にも認定要素は盛り沢山。


下記は、あきらかに Java で実行してますな Message-ID。
Message-ID: <00000000.0.0000000000000.JavaMail.javamailuser@localhost>



参考



ちょっとやらなくちゃいけないことがあったんだ。