run_prettify.js

2012年11月25日日曜日

File Shortcut v2.0.0-2.0.1

久しぶりに更新した気がします。Nexus7買ってルンルンしながら作りました。以下v2.0.0変更内容。

  • UIの刷新
  • ファイル選択をファイラー・ギャラリーからも可能に
  • MIMEタイプの編集を可能に
  • ウェブページへのショートカットを廃止
  • バグ修正(大きい画像を選択しても落ちないように)
  • 横画面でOKボタンを押せない不具合の修正(11/26 v2.0.1)

UIっていうかアプリ自体、一から作り直しました。ICS未満の端末でもISCっぽくなったと思うんですがいかがでしょうか。従来のダイアログ方式はあまり使いやすくないなと思ったので、こんな感じになりました。だいぶマシになったと自分では思ってます。

ファイラー・ギャラリーアプリからもファイルを選べるようになりました。一応PDFとかもあるだろうから共有からの追加にも引き続き対応しています。

ウェブページへのショートカットは廃止しました。「『ファイルショートカット』にウェブページは相応しくない」「処理が複雑になる」「他のアプリで代用できる」などが理由です。ただ、それなりに有用だとは僕自身も思っているので、これから別アプリとして作成します。

待てねーよksって人は、前のバージョン(記事末尾参照)を使うか、他のアプリで代用してください(Desktop VisualizeRでURLをコピーした状態でアクションをクリップボードにするとできます)。

アプリのサイズがでかくなったのは、ICS未満をICSもどきにするライブラリを追加したためです。

MIMEタイプについて

ファイルの形式だと思ってください。例えば、テキストファイルなら「text/plain」、画像なら「image/jpeg」とか「image/png」って感じです。

ファイルの拡張子で自動判別するので、通常は編集する必要ありません。というか、ファイルを開くアプリを決める情報なので、下手に弄ってしまうと正しくファイルを開けなくなります。

この項目を編集できるようにしたことで、「拡張子がないファイルにも手動でファイル形式を入力できる」「動画ファイルを音声ファイルとして開く」みたいなことができるようになります。MIMEタイプがどんなものかわかっている方のみ使用してください(そのうちヘルプみたいなのを書くつもりです)。

不具合など

テストは念入りにしたつもりですが、まだバグ持ちの可能性もあります。もし全く動かないという場合は前バージョンを使ってください。多少安定はしているはずです。

http://ux.getuploader.com/75py/download/1/File_Shortcut_1.1.0.apk

また、前バージョンで「Nexus7(JB)で『対応していない』と言われる」というご報告がありましたが、僕のN7ではこの症状を確認できませんでした。

以上です。何かありましたらコメント欄、またはメール、ツイッターでご連絡ください。

2012年11月18日日曜日

「文書に対する文法制約dtdまたはxmlスキーマが検出されませんでした」を消す方法

Eclipse、Lint先生の「文書に対する文法制約dtdまたはxmlスキーマが検出されませんでした」を消す方法。

一応ファイルの冒頭に「<!DOCTYPE ルート(RelativeLayoutとかmanifestとか)>」で消せるわけですが、如何せんめんどくさい。

こんな時こそGoogle先生(英語)です。

Fix The No Grammar Constraints (DTD Or XML schema) Warning In Android | Tech Tips & Tricks

感謝感謝。書いてあるのそのまんまですが、訳すと以下のようになります。

  1. ウィンドウ
  2. 設定
  3. XML
  4. XMLファイル
  5. 検証
  6. 文法指定なし
  7. 無視

2012年11月1日木曜日

secroidのBashful Clockに関する記述について

secroidは、ネットエージェント株式会社が公開しているユーザーにとってのリスクレベルと内容の情報をアプリごとに公開しているサイトです。

まだベータ版だそうで、検索がおかしいらしくアプリ名で探しても見つからなかったのですが、グーグルで「secroid <パッケージ名>」を検索したらBashful Clockのページを見つけました。

これを書いている11/01現在、secroidが検査してくれたのはバージョン2.0.4のようです(11/01の最新版は2.1.2)。しかしまあ、権限や操作している中身は大差ないので、バージョンが最新版であろうと結果は同じだと思います。

ユーザーの視点からすれば、secroidの取り組みは有用ですが、過信は禁物です。「HIGH」とかはちょっと要求パーミッションが多いと簡単につくっぽいですし。ですが、一応中身も見て「広告があるよ」とか「アプリ内で使ってるよ」とか教えてくれるようなので、一つの参考資料にはなると思います。

secroidの内容を鵜呑みにすると、Bashful Clockは「若干インストールするのをためらってしまうアプリ」になってしまいます。そこで、悪意あることはしてないですよってことで、Bashful Clockについてsecroidに書かれていることに対する説明をしておこうというのが、この文章の主旨です。

なお、これはあくまで自己申告です。嘘をつく気はありませんが、それを信用するかどうかは皆さん次第です。信用できないと思うようでしたら、僕の作ったアプリの使用を取り止めてください。


「このアプリに潜むリスク」について

取り上げられているのは以下の三項目です。

  • SDカードの内容を読んでいます
  • バックグラウンドで動作します
  • レシーバを登録します

SDカードの読み込み

secroidには「目的:不明」「送信先:不明」と書いてあります。どういう原理でこれを不明としたのかちょっとわからないんですが、ユーザーとしては不安ですよね。

目的は「自前フォントファイルの読み込み」と「バックアップファイルの読み込み(と書き込み)」です。それ以外には何もしていません。

また、仮にそれ以外のファイルを読み書きしていても、そこで得た情報を外部に送信することはたぶん不可能です。現在僕は、インターネット権限を持ったアプリを公開していません。

バックグラウンドで動作

これは言うまでもないですが、時計を自動表示するためのサービスのことです。画面点灯やロック解除を検知するためには、バックグラウンドにサービスを常駐させる必要があります。

レシーバを登録

これも「目的:不明」「送信先:不明」になってるんですよね。なんでかなあ……。

レシーバーは、静的に登録しているのが一つ、動的にが四つです。動的にってのは、前述のサービスによって登録したりしなかったりしてるってことです。詳細は別ページをご覧ください。Androidユーザー向け 「何となくわかるレシーバー講座」

まず静的なやつ、これはBOOT_COMPLETEDです。端末の起動完了を検知して、時計の自動表示機能が有効になっている場合、サービスを開始するために使用します。BOOT_COMPLETEDAndroidManifest.xmlに書かれています。

動的なやつは、まず時計更新用にACTION_TIME_TICK。これは、一分おきにOS側が通知を出してくれるやつです。秒表示ありのときはタイマーで1000ミリ秒ずつ更新してるんですが、秒表示なしのときはACTION_TIME_TICKを受信することでバッテリー負荷を抑えています。

次にACTION_BATTERY_CHANGED。これは、ベータ機能であるバッテリー残量表示のために使用します。これを登録することで、現在のバッテリー残量を取得できます。

残り二つはACTION_SCREEN_ONACTION_USER_PRESENT。それぞれ「スクリーンオン」と「ロック解除」を検知します。

「アクセス許可」について

  • 自動起動。起動完了の受信
  • USB ストレージのコンテンツの変更/削除、SD カードのコンテンツの変更/削除
  • システムレベルの警告の表示

自動起動とSDカード読み書きについては説明済みですね。USBストレージってのはちゃんと調べていませんが、SDカード書き込み(android.permission.WRITE_EXTERNAL_STORAGE)の権限が内包しているんだと思います。

システムレベルの警告について。secroidには「システムの警告ウィンドウの表示をアプリに許可します。この許可を悪意のあるアプリに利用されると、画面全体が乗っ取られる恐れがあります。」と書かれています。この項目については別ページに詳しい説明を書きましたので、興味のある方は読んでください。Androidユーザー向け 「何となくわかる表示レイヤー講座 ~オーバーレイ表示の仕組み~」

Bashful Clockでは、時計表示にはシステムオーバーレイを使っています。「タップで終了する」が有効になっている場合は、システムアラートを使って時計と同じ大きさの透明なビューを表示させています。こうすることで、「ロックが解除された後なら触れば終了する」時計が表示できるってわけです。


個人的には、「このアプリに潜むリスク」にオーバーレイに関する記述がないのが疑問ですね。レシーバの登録なんかよりよっぽど重要だと思うんですけど……。

とりあえず説明は以上です。何か質問などありましたらご連絡ください。

Androidユーザー向け 「何となくわかるレシーバー講座」

secroidに「レシーバを登録しています」って項目があるので、何のことやねんってならないための解説です。何となくわかる(かもしれない)シリーズ第二弾。

開発者向けの話ではないので、ざっくり説明します。まあ雰囲気をつかんでいただければ。何か質問とかあったらコメントしてください。


レシーバーってなに?

フルネームは「BroadcastReceiver(ブロードキャストレシーバー)」です。つまり、「どこかからブロードキャストされた何か」を受信するのがレシーバーです。broadcastreceiveの意味を見れば、まあそのまんまだなと思いますよね。

何を受け取るの?

例えば、こんなものがあります。

  • スクリーンがオンになった
  • 端末の起動が完了した
  • バッテリー残量が変化した
  • バッテリー残量が少なくなった
  • アプリがインストールされた
  • アプリが更新された
  • アプリがアンインストールされた

誰が送信してるの?

前項の例では、Androidシステム側がばしばし飛ばしてくれます。

つまり、システムがばんばんブロードキャストを飛ばしてるから、情報が欲しいアプリは各々でレシーバーを登録することで、いろんな状況の変化を簡単に検知できるってわけです。

ちなみに、独自にブロードキャストを送信したり、それを受信することもできます。

静的な登録と動的な登録

ブロードキャストには、AndroidManifest.xml(アプリのバージョン、要求パーミッション、使うアクティビティなどの情報をまとめたファイル)に書き込むだけで受信できるタイプと、サービスやアクティビティから登録する必要があるタイプがあります。

前者の代表的な例は「BOOT_COMPLETED」ですね。端末の起動完了を検知する場合は、AndroidManifest.xmlに書き込むだけでオッケーです。後者は色々ありますが、スクリーンオンの検知とかが当てはまります。

ユーザー視点からの二つの差ですが、後者の場合は通常「サービスを常駐させて受信する」必要があります。電話の誤発信防止アプリやTaskerなどのアプリが常駐するのは、こういったブロードキャストを受信するためです。(もちろん、サービス常駐の目的はブロードキャストだけではありません。あくまで一例です。)

Androidユーザー向け 「何となくわかる表示レイヤー講座 ~オーバーレイ表示の仕組み~」

「システムレベルの警告の表示」のパーミッションについて説明する際に、これを分かってもらえると納得できるかなと思ったので書きました。この権限を使うと、任意のビューをオーバーレイ表示できます。

ここでは、ざっくり簡単にAndroidのレイヤーについて解説します。頑張ってかみ砕いたつもりですが、質問などがありましたらご連絡ください。

レイヤーって?

レイヤー層、階層、層にする、層をなす、などの意味を持つ英単語です。ペイントソフトやフォトレタッチソフトなどで、画像を載せる仮想的なシートのことをレイヤということがありますよね。あれをイメージしてもらえると良いです。何層も絵を重ねて最終的に一枚にするイメージです。

例えば?

アプリを起動中にステータスバーをびろーんってすると、通知領域が広がりますよね。あれは、「通知領域のレイヤー」が「アプリのレイヤー」よりも上位にあるからです。上位にあるレイヤーが上にくるので、アプリは隠れて通知領域が表示されます。

どんなレイヤーがあるの?

本当はもっとたくさんありますが、一部を抜粋して簡単に挙げてみます。OSのバージョンごとに違いがあるので、ここでは最新のJBについて取り上げます。下に行くほど上位のレイヤーです。

  1. 通常のアプリ
  2. 着信画面
  3. トースト表示
  4. システムアラート
  5. 文字入力
  6. キーガード
  7. ステータスバー
  8. システムオーバーレイ

例えば、通常のアプリより着信用のレイヤーの方が上なので、電話がくるとすぐ表示されます。スリープ状態から復帰したときに起動中のアプリではなくキーガードが表示されるのも、キーガードのレイヤーが上位にあるからです。

「システムアラート」と「システムオーバーレイ」

何やら分かりづらい「システムアラート」「システムオーバーレイ」なるものがありますね。

システムアラートは、バッテリー残量が少ないよ!って時の警告などに使われるレイヤーです。システムオーバーレイは名前のまんまで、いつでも上に表示できるよってレイヤーです。

この二つは、オーバーレイ表示を行っているアプリが使っているものだと思ってください。二つの違いは「触れるかどうか」と「キーガードより上位かどうか」です。

システムアラートの方は、必要に応じてタッチイベントを取得できますが、キーガード上では表示できません。キーガードよりも下位のレイヤーだからです。

システムオーバーレイにはフォーカスを与えることができません。もしこのレイヤーが触れる場合、キーガードに干渉してしまうからです。

アプリ名を出した方が分かりやすいですね。SwipePadやWave Launcherのスワイプ起動に使われているのがシステムアラートです(たぶん)。Migiuedやババァで使われているのがシステムオーバーレイです(たぶん)。

パーミッション

レイヤーの操作を行うには、「android.permission.SYSTEM_ALERT_WINDOW」(システムレベルの警告の表示)の権限が必要になります。この権限を要求するアプリは、前述のレイヤーを使って、画面に何かしらを表示させる機能を持っているということになります。

この機能の危険性

apkファイルからアプリをインストールする際、「インストール」ボタンの上にオーバーレイ表示が乗っかっていると、インストールボタンが押せません。これはセキュリティ上の仕様です。だって、「インストール」って表示の上に例えば「このファイルを削除する」って表示されちゃったら危ないじゃないですか。なので、apkファイルからインストールする場合は、オーバーレイ表示をするアプリをいったん無効にする必要があります。

このように、この権限は割と危険な部類に入ります。画面いっぱいに真っ黒なシステムアラート(タッチイベントあり)を表示されたら、もう何も操作できなくなります。そんな愉快犯的な人間はそれほどいないとは思いますが、そういった危険もあるということを覚えておいてください。

2012年10月26日金曜日

Overlay Toast(ブロードキャストを受信してトースト表示するアプリ)

ブロードキャストを受信してトースト表示するアプリ。せっかく作ったんで野良で公開します。

ブロードキャストを送信できるアプリ、LlamaとかTasker用です。Taskerはもともとできるけど、これだとロック画面上でも表示できます。表示秒数も指定可。Taskerの場合は変数名入れると置換してくれます。

ちなみに、僕が気まぐれでアイコンを作るか、誰かがアイコンを作ってくれた場合、野良公開をやめてPlayにアップロードしますw

ダウンロード

http://ux.getuploader.com/nora_apk/download/194/Overlay_Toast_1.2.0.apk(更新内容

http://ux.getuploader.com/nora_apk/download/191/Overlay_Toast_1.1.0.apk

http://ux.getuploader.com/nora_apk/download/190/Overlay_Toast_1.0.0.apk

使い方(Localeプラグイン)

  1. Localeプラグイン
  2. Textに表示したい文字
  3. Millisecondsに表示秒数(ミリ秒)

使い方2(Llamaの場合。ベータ版を使ってます)

  1. 「行動追加」
  2. 「Androidインテント」
  3. 送信モード「ブロードキャスト」
  4. 行動「com.nagopy.SHOW_TOAST」
  5. Add new 'extra' row
  6. keyのほうに「text」、真ん中は「string」、Valueは表示する文字列
  7. keyのほうに「ms」、真ん中は「int」、Valueは表示秒数(ミリ秒)
  8. 「了解」

最後の表示秒数は省略可能です。指定しない場合は3000ミリ秒になります。単位がミリ秒なんで、例えば10秒なら「10000」、2秒なら「2000」です。

使い方1,2は等価です。どっちでやっても同じ。ただ、Taskerで変数名を入れるときは2の方がやりやすいと思います。

パーミッション

  • システムレベルの警告の表示(トースト表示をロック画面上でも表示するべくオーバーレイするために使用)

普通のToastからビューだけ取り出して、表示は自分でやるのでこのパーミッションが必要です。でもおかげで時間指定したりロック画面より上に表示できたりします。

動作環境

OSは2.2以上、App2SD対応。テストはSH-12C(2.3.3)とエミュレーター(4.1.2)のみ。

更新履歴

v1.2.0(2012/10/28)

  • Localeプラグインとして動作するように
  • Taskerの変数を受け取れるように

ブロードキャスト送信とかめんどくさいことしなくてもトースト表示できるようになりました。Taskerの場合はtextに変数名を入れると変数の値になって表示されます(「%BATT」でバッテリー残量になったりとか)

v1.0.1(2012/10/27)

  • 説明画面を追加
  • 「text」で送る形式を文字列以外にも対応

説明画面いらねーよとか言わないでください。OSが3.1以上だと、一度でもアクティビティを起動しないとブロードキャストを受信できないらしいです。

せっかくなんで「com.nagopy.SHOW_TOAST」のコピーボタンを配置しました。おせっかいな文章も交じってますがまあ注意喚起の一環だと思って見逃してください。

文字列以外も、ってのは、現状ではLlamaには関係ないです(stringじゃなくても表示できるってだけ)。Taskerだと変数の型が何であれ表示できるようになります。

2012年10月24日水曜日

Bashful Clock v2.1.0~v2.1.2


24日と25日にかけて計三回アップデートを行いました。v2.1.0、v2.1.1をインストールした方は再度アップデートをお願いします。

更新内容(v2.1.2)

  • 秒表示無効時に正常に動作しない不具合を修正
  • カスタムビュー設定画面がスクロールできない不具合を修正
  • ファイル選択時の前回フォルダ記憶をフォントとリストアで分離
  • 一部環境で時計表示が消えないことがある不具合の修正

更新内容(v2.1.1)

  • 「タップで終了させる」に関するバグの修正

更新内容(v2.1.0)

  • フェードアウト使用時のバッテリー負荷の改善(当社比)
  • フォントをBold、Italic、Bold_Italicにできるように
  • 「ロック画面で常に表示、ロック解除で非表示」モードの追加
  • 文字サイズ上限の引き上げ(150から200へ)
  • バッテリー表示の色・文字サイズ指定可能に
  • カスタムフォーマットで「#P#」を指定するとバッテリー残量に置き換えるように

v2.1.0より前のバージョンでは、フェードアウト使用時のバッテリー負荷が非常に高いです。アニメーション中はCPU使用率が跳ね上がるんですが、更新前はなぜか「通常表示中もCPUを食いまくる」という状況でしたorz 今回の更新でCPU使用はフェードアウト中のみになるので、負荷は軽減されます。が、それなりにCPU食うのは変わらないので、フェードアウトはせいぜい1,2秒にするのをオススメします。その方が恥ずかしがり屋っぽいし(後付の理由w)。

そのほかはだいたい要望に応えた感じです。

バッテリー残量の配置についてはとりあえず見送りました。代わりに追加したのが「カスタムフォーマットの『#P#』をバッテリー残量(0~100)に置き換える」です。意味はそのまんま。これによって、カスタムビューだろうとなんだろうと、カスタムフォーマットを有効にすればバッテリー残量を表示できます。どれくらい需要があるのかは未知数ですが、まあベータ機能ですから大目に見てくださいw

三回も更新したのは、ほとんどタイマー処理関係のミスでした。ご迷惑をおかけいたしました。メールでご連絡くださった方、ありがとうございました!

今後の更新予定

とりあえず前回から検討しているのが2つ。「常時表示モードの追加」と「カスタムビュー回りの強化(分と秒で大きさを変えたりできるようビューを複数持てるようにするとか、複数プロファイルを保存できるようにするとか)」です。前者は簡単ですが必要性があまりない気がしてるので次回あたりにTODOから外そうかと。後者はとてつもなく改修が面倒なので保留中です。僕の気力がある時にやりますw

てか一つ実装し忘れを思い出しました。カスタムビュー設定画面の背景色を変えられるようにするつもりだったのに……。これは次回実装します。

あと、ちょっと先の話ですが「クリスマススキップ機能」とかどうですかね? ……いらない?(笑)

他にも何かご要望がありましたら、大抵のことは前向きに検討しますので気軽にご連絡ください。メール、ツイッター、もしくはブログコメント欄にて。Playストアのコメント欄は返信できなくてお互い不幸になりますからやめてくださいね!