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ファイルからインストールする場合は、オーバーレイ表示をするアプリをいったん無効にする必要があります。

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