B-Teck!

お仕事からゲームまで幅広く

【Android/Kotlin】端末内に保存されたQRコードから情報を読み取る

下記の記事の続きです blog.beatdjam.com

端末組み込みの画像一覧からQRコードの画像を取得して、テキストを読み取るまで。

端末内の画像一覧から任意の画像を取得するためのIntentを作成

画像一覧を表示し、選択した画像の情報を得るためのIntentを作成します。

/**
 * 端末内画像取得用のActivityを起動するIntentを作成
 */
fun createGetDeviceImageIntent() = Intent(Intent.ACTION_OPEN_DOCUMENT).also {
 it.addCategory(Intent.CATEGORY_OPENABLE)
 it.type = "image/*"
}

startActivityForResult() で起動することで、onActivityResult() 内で Intent::data から対象画像のUriオブジェクトを取り出すことができます。

取得したUrlからBitmap形式でファイルを取得

/**
 * 画像選択Intentから渡されたURIを用いて、Bitmap取得を行う
 */
fun getBitmapFromUri(context: Context, uri: Uri?) = when {
    uri != null -> context.contentResolver
        .openFileDescriptor(uri, "r")
        ?.use { BitmapFactory.decodeFileDescriptor(it.fileDescriptor) }
    else -> null
}

Bitmapファイルを入力としてQRコードの情報を読み取る

/**
 * bitmapからQRCode読み取りを実行
 */
fun readQRCodeFromImage(bitmap: Bitmap) = with(bitmap) {
    val pixels = IntArray(width * height)
    getPixels(pixels, 0, width, 0, 0, width, height)
    val source = RGBLuminanceSource(width, height, pixels)
    val binaryBitmap = BinaryBitmap(HybridBinarizer(source))
    MultiFormatReader().decode(binaryBitmap)?.text
}

読み取りで触ったpackageがこのあたりだったので、ZXing Android Embeddedじゃなくて生のZXing触るしかbitmapから読み込む方法がなさそうだった。

* android.graphics.Bitmap
* com.google.zxing.BinaryBitmap
* com.google.zxing.MultiFormatReader
* com.google.zxing.RGBLuminanceSource
* com.google.zxing.common.HybridBinarizer

【Java/Kotlin】resourcesディレクトリにあるファイルを読む

ルートからの絶対パスで指定したリソースファイルを取得するスニペット。
IOExceptionはそのまま外に投げているので必要があればcatchしてリカバリーまで書くこと。

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;

public class JavaResource {
    public String javaResourceAccess(String fileName) throws IOException {
        final InputStream someStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
        if (someStream == null) return null;

        try (BufferedReader br = new BufferedReader(new InputStreamReader(someStream, StandardCharsets.UTF_8))) {
            // Kotlin版のBufferedReader.readText()がsuffixに"\n"が付与されているため、合わせてつけている
            // 通常利用の場合は `Collectors.joining("\n")` でもよい
            return br.lines().collect(Collectors.joining("\n", "", "\n"));
        }
    }
}

Kotlin

class KotlinResource {
    @Throws(IOException::class)
    fun kotlinResourceAccess(fileName : String) = this.javaClass
        .classLoader
        .getResourceAsStream(fileName)
        ?.bufferedReader()
        ?.use { it.readText() }
}

【タスク管理】Todoist、Kanbanist、(+Toggl)を利用して快適にタスク管理をする

※Todoistの有料プランで利用できる機能を前提とした記事です。

私は基本的に日常のタスクをTodoistで管理しています。
f:id:beatdjam:20200530182159p:plain:w300

Todoistは一覧性の高さがある一方で、タスクの状態管理が難しいという問題がありました。
とはいえ、Trello等複数のツールを並行利用するのは、気が進みません。

調べてみたところ、Todoistのタスクをカンバン形式にできるツールを発見しました。
それがKanbanistです。 このツールを一ヶ月ほど運用してみたところ、使い勝手が良かったので紹介しようというのが本記事です。

Kanbanistでできること

タスクの表示

Kanbanistは、Todoistのタスクを直接カンバン上に表示できます。

↓は冒頭のタスクをKanbanistに表示させたものです
f:id:beatdjam:20200530183521p:plain:w300

レーンの作成

Kanbanistにおけるレーンは、Todoistのラベル機能(有料機能)を利用したものです。
これが冒頭でTodoistの有料プランで利用できる機能と書いたものです。

このように、タスクに紐づくラベルを付与すると、Kanbanistに対応するレーンが作成されます。 f:id:beatdjam:20200530184205p:plain   f:id:beatdjam:20200530184237p:plain:w300

表示するラベルも絞り込みができるので、普段からタスク管理にラベルを利用していても安心して利用できます。
f:id:beatdjam:20200530184709p:plain:w150

タスクのフィルタリング

Kanbanistは、タスクを様々な形でフィルタリングして表示することができます。
f:id:beatdjam:20200530185351p:plain

左から

  • 先述したリスト(ラベル)の絞り込み
  • Todoistのプロジェクト単位での絞り込み
  • TodoistのPriorityでの絞り込み
  • 日付での絞り込み
    f:id:beatdjam:20200530185609p:plain:w150
  • 自分にアサインされたタスクの絞り込み

となっています

タスクの登録

[タスク名] [#Project] [date] を入力することで、新しいタスクをKanbanist上からも登録できます。
補完等が出ないので、私はあまり使いませんが…
f:id:beatdjam:20200530190003p:plain
f:id:beatdjam:20200530190028p:plain:w200   f:id:beatdjam:20200530190132p:plain

Kanbanistの利用方法

Todoistと Kanbanistの連携

Todoistの[設定画面-連携機能]から、 連携用のAPIトークンを取得します。
f:id:beatdjam:20200530190708p:plain:w300

Kanbanistを開いて、連携用トークン入力画面を開きます
f:id:beatdjam:20200530191019p:plain:w300

先程取得したトークンを入力してLoginすれば利用開始できます。
f:id:beatdjam:20200530191043p:plain:w300

KanbanistとTogglの連携

KanbanistはTogglのChrome拡張機能に対応しています。
連携することで、TogglのタイムトラッキングをKanbanist上から開始できて便利です。

Tooglの拡張機能の[設定画面-Integrations]で、Kanbanist上でのToggl Buttonを利用可能にします。
f:id:beatdjam:20200530191337p:plain:w300

このようにKanbanist上のタスクにToggl Buttonのアイコンが表示され、トラッキングが開始できます。
f:id:beatdjam:20200530191644p:plain   f:id:beatdjam:20200530191652p:plain:w300

おわりに

KanbanistはOSSとして開発されています。気になる挙動や追加して欲しい機能があればIssue立てたりしてもいいかもしれないです。
GitHub - mwakerman/kanbanist: The missing kanban board for Todoist

私の運用では、予定入力や一週間、一ヶ月などのタスクの確認・整理を行うときはTodoistを、当日のタスク管理はすべてKanbanistを利用する形で棲み分けをするといい感じでした。
非常に便利なツールですので、利用できる方はぜひ触ってみてください。