Androidで給与明細PDFのパスワード入力を自動化するラッパーアプリの設計
はじめに
毎月送られてくる給与明細のPDF。セキュリティのためにパスワードがかかっていますが、毎回手入力するのは手間ですよね。
今回は、あらかじめ設定したパスワードでPDFのロックを自動解除し、好みのPDFビューアーアプリへ引き渡すAndroid向けラッパーアプリ「PDF Unlocker」の設計と実装ポイントを紹介します。
概要
このアプリは、Gmailなどに添付されたパスワード付きPDFを受け取り、バックグラウンドで解除処理を行ってから他のPDFアプリにデータを渡す役割を果たします。
- 対象: Android 6.0以上
-
主な機能:
- GmailからのPDF受け取り
- 設定済みパスワードによる自動解除
- 解除済みPDFの外部アプリへの転送
- パスワードがないファイルのスルーパス機能
システムフローと実装のポイント
1. パスワードの安全な保存
ユーザーが設定したパスワード(生年月日など)は、セキュリティを考慮して EncryptedSharedPreferences を用いて暗号化して保存することを推奨します。
2. インテントフィルターによるPDFの受け取り
Gmailなどの他アプリからPDFを開く際に、自作アプリが候補に表示されるように AndroidManifest.xml に設定を追加します。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/pdf" />
</intent-filter>
これによって、application/pdf を受け取れるようになります。
3. PdfBox-Androidによる解除処理
PDFの操作には PdfBox-Android などのライブラリを使用します。
-
isEncryptedがfalseの場合は、そのまま次のアプリへ渡します。 - ロックがかかっている場合は、保存済みのパスワードで解除し、キャッシュディレクトリ(context.cacheDir)に一時ファイルとして保存します。
4. FileProviderを用いた外部アプリへの受け渡し
Android 7.0以降、他アプリにファイルを安全に渡すには FileProvider が必須です。
一時ファイルのURIを生成し、ACTION_VIEW インテントを発行することで、ユーザーがインストールしているPDFビューアーの一覧を表示し、選択したアプリで解除済みPDFを開くことができます。
セキュリティと権限に関するアドバイス
- 一時ファイルの削除: ロックを解除したPDFは生データであるため、他アプリへ渡した後は古い一時ファイルを削除する仕組みを導入し、セキュリティを担保しましょう。
-
ストレージ権限: Gmailからのインテント経由であれば
content://URI を通じて直接読み取れるため、広範なストレージ権限が不要なケースもありますが、Android 6.0以上のランタイムパーミッション処理は念頭に置いておく必要があります。
開発中に遭遇しやすいトラブル
プロジェクトのセットアップ中、Task '{' not found というエラーが出ることがあります。これは主に以下の2点が原因です。
-
build.gradle の記述ミス:
dependenciesブロックなどで括弧{ }の閉じ忘れや不要な行がないか確認してください。 -
実行構成(Run Configuration)のゴミ: Android Studioの「Run」→「Edit Configurations」メニュー内の「Tasks」欄に、誤って
{が入っていないかチェックしてください。
まとめ
Androidの「Intent」と「FileProvider」を活用することで、面倒なパスワード入力をスキップする便利なツールが実現可能です。給与明細の確認という毎月の小さなストレスを、技術の力で解決してみてはいかがでしょうか。