[[Tasker]]
#setlinebreak(on)

電話を受けた・掛けた・不在着信があった時刻と場所をGoogleカレンダーに予定として挿入する。

* 仕様(概要) [#m53f0c74]

- タイミング
-- 電話の着信があり、通話があった場合
-- 電話の着信があり、通話できなかった場合(不在着信)
-- 電話の発信があった場合(電話を取ってもらえたか否かは関知しない)
- 挿入する予定に含める内容
-- 時刻(開始・終了)
-- 名前と番号(名前は登録があった場合のみ)
-- 電話を掛けた/受けた場所(「予定の場所」として記録し、Googleマップで参照できる)

* 設計 [#q9391491]

- 発信中の取消や着信拒否(された事)・話中については区別しません&br;(通話時間0秒の発信として扱います)
- 以下の赤色の箇所にActionを仕込みます
-- 待機中の中に赤色があるのは、アイドル状態への突入で発動させるという意味で書きました&br;(切断/取消/拒否/話中の個別にイベントをセットできると勘違いされるのを防ぐため)
-- 逆に着信からの切断/拒否にイベントがセットしてあるのは、それができるからです。(Missing Callイベント)

:発信|"1:発信"を記憶し、現在の位置の測定と記憶を行います
:着信|"2:着信"を記憶し、現在の位置の測定と記憶を行います
:拒否/取消(不在着信)|"3:不在着信"を記憶します(位置は着信時に記憶しているので省略します)
:待機中(になったら)|上記のステータスを利用して相手の名前と番号を調べ、位置情報が確定したあと、カレンダーに挿入します
#ref(phone_state_chart.png,nolink,)

* コード [#yd4a3f3e]
** Vars [#f8ef4f79]
手動で作る必要はありません。Taskを初めて実行したタイミングで自動生成されます。
:CallSTime|通話開始時の時刻(シリアル秒)
:CallDirection|通話の種別(1:発信, 2:着信, 3:不在着信(一旦着信で2が記録されたあと、終呼時に3になる))
:CallLocation|発信/着信があった場所(測定に時間がかかり、その間は空欄になる。)

:personName|電話の掛け先/発信元の名前(アドレス張に登録があればその名前となり、無ければ番号となる)
:personNumber|電話の掛け先/発信元の番号
:duration|電話が何分間継続したか
:durfrom|電話が何分前に開始されたか(マイナス表現)

** Profile [#r3722ae3]
番号を入力/選択し「発信」ボタンを押した直後
 Profile: Call Outgoing
 	State: Call [ Type:Outgoing Number:* ]
 Enter: Act発信記憶

誰かから電話がかかってきて、着信音が鳴る直前
 Profile: Call Incoming
 	State: Call [ Type:Incoming Number:* ]
 Enter: Act着信記憶

誰かから電話がかかってきてたが、通話開始しないまま切れた直後
 Profile: Missed Call
 	Event: Missed Call [ Caller:* ]
 Enter: Act不在着信記憶

電話が切れ、待ち受け状態(待受画面ではない)になった直後
 Profile: Phone Idle
 	Event: Phone Idle
 Enter: Act終話時記録

** Task [#fd4c0e39]

 Task: Act発信記憶
	A1: Vibrate [ Time:200 ] 
	A2: Variable Set [ Name:%CallSTime To:%TIMES Do Maths:Off Append:Off ] 
	A3: Variable Set [ Name:%CallDirection To:1 Do Maths:Off Append:Off ] 
	A4: Get Location [ Source:Any Timeout (Seconds):60 Continue Task Immediately:Off Keep Tracking:Off ] 
	A5: Variable Set [ Name:%CallLocation To:%LOC Do Maths:Off Append:Off ] 

 Task: Act着信記憶
	A1: Vibrate [ Time:200 ] 
	A2: Variable Set [ Name:%CallSTime To:%TIMES Do Maths:Off Append:Off ] 
	A3: Variable Set [ Name:%CallDirection To:2 Do Maths:Off Append:Off ] 
	A4: Get Location [ Source:Any Timeout (Seconds):60 Continue Task Immediately:Off Keep Tracking:Off ] 
	A5: Variable Set [ Name:%CallLocation To:%LOC Do Maths:Off Append:Off ] 

 Task: Act不在着信記憶
	A1: Variable Set [ Name:%CallDirection To:3 Do Maths:Off Append:Off ] 

 Task: Act終話時記録
	A1: Wait [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ] 
	A2: Variable Set [ Name:%msg To:不明な終話イベント Do Maths:Off Append:Off ] 
	<発信>
	A3: If [ %CallDirection ~ 1 ]
	A4: Variable Set [ Name:%CallPersonName To:%CONAME Do Maths:Off Append:Off ] 
	A5: Variable Set [ Name:%CallPersonNumber To:%CONUM Do Maths:Off Append:Off ] 
	A6: Variable Set [ Name:%msg To:%CallPersonName との発信通話 Do Maths:Off Append:Off ] 
	A7: Flash [ Text:%msg を終了しました。 Long:On ] 
	A8: End If 
	<着信>
	A9: If [ %CallDirection ~ 2 ]
	A10: Variable Set [ Name:%CallPersonName To:%CNAME Do Maths:Off Append:Off ] 
	A11: Variable Set [ Name:%CallPersonNumber To:%CNUM Do Maths:Off Append:Off ] 
	A12: Variable Set [ Name:%msg To:%CallPersonName からの着信通話 Do Maths:Off Append:Off ] 
	A13: Flash [ Text:%msg を終了しました。 Long:On ] 
	A14: End If 
	<不在着信>
	A15: If [ %CallDirection ~ 3 ]
	A16: Variable Set [ Name:%CallPersonNumber To:%CNUM Do Maths:Off Append:Off ] 
	A17: Variable Set [ Name:%CallPersonName To:%CNAME Do Maths:Off Append:Off ] 
	A18: Variable Set [ Name:%msg To:%CallPersonName から不在着信 Do Maths:Off Append:Off ] 
	A19: Flash [ Text:%msg がありました。 Long:On ] 
	A20: End If 
	A21: Wait Until [ MS:0 Seconds:1 Minutes:0 Hours:0 Days:0 ] If [ %CallLocation Is Set ]
	<計算と記録>
	A22: Variable Set [ Name:%duration To:floor(( %TIMES - %CallSTime ) / 60 ) Do Maths:On Append:Off ] 
	A23: Variable Set [ Name:%durfrom To:%duration * -1 Do Maths:On Append:Off ] 
	A24: Calendar Insert [ In / For (Minutes):%durfrom / %duration Calendar:Google:LifeLog Title:%msg Description:%CallPersonNumber Location:%CallLocation Available:Off All Day:Off ] 
	<終了処理>
	A25: Variable Clear [ Name:%CallLocation Pattern Matching:Off ] 
	A26: Variable Clear [ Name:%CallDirection Pattern Matching:Off ] 

ポイントは、Calendar Insertの直前でWait Until [ %CallLocation Is Set ] をしているところです。(A21)
場所の測定には時間がかかりますが、測定完了前に終話してしまっても位置の確定までカレンダー記入を待機しています。
同じタスク内であれば測定終了まで待てるのですが、今回は測定と記録を別々のタスクで行っているため、タスク間の同期を考える必要があります。

また、カレンダーに挿入する時刻は以下のような考え方で値を準備します。
これは一例ですが、「通話は 現在から -15 分後に開始し、 15 分間継続した」 のような感じです。
つまり、duration と durfrom は符号が異なる同じ量の値となります。(A22-A23)

カレンダー名は Google:LifeLog のところですが、これは各位お使いのカレンダーを指定してください。(A24)

* 重要な注意点 [#g7df65ad]

少しテストをしてみた結果、書き換えを行っています。
少しテストをしてみた結果、書き換えを行っています。2014/05/21
(以前公開していたものと変化しています)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS