0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

毎回スマホにスクショ転送する過程が面倒なのでmac appで作ってみた🐤

0
Last updated at Posted at 2026-04-09

AndroidのスクショをMacに爆速転送するアプリを Rust + Tauri で作った

はじめに

「Androidでスクショ撮ったのに、Macに持ってくるのが面倒くさい」

Googleフォトの同期を待つ、自分宛にDMで送る、ケーブル繋いでMTPでコピー……どれも微妙にダルい。

そのストレスを解消するために、Hiyoko Shot を作りました。

USB または Wi-Fi で繋いでおくだけで、スクショを撮った瞬間に自動でMacへ転送されます。

この記事では、技術的な実装の面白いところをピックアップして紹介します。


アプリの概要

Hiyoko Shot はメニューバー常駐型のmacOSユーティリティです。

  • 📱 AndroidのスクショをMacへ自動転送(USB / Wi-Fi対応)
  • 🖼 ギャラリーUIでプレビュー・ドラッグ&ドロップ共有
  • ⚡ ADB exec-out を使った低オーバーヘッド転送
  • 🦀 バックエンド: Rust、フロントエンド: React + Framer Motion、フレームワーク: Tauri
    hiyokoshot_jp_clean.png
    Screenshot 2026-04-09 at 13.50.56.png

技術的なポイント

1. ADB exec-out による直接転送

Androidのスクショ転送で真っ先に思いつくのは adb pull ですが、Hiyoko Shotでは adb exec-out を採用しています。

adb exec-out screencap -p

adb pull はAndroid端末にファイルを一時保存してからPCへコピーするのに対して、exec-out はコマンドの標準出力を直接ホスト側にストリームします。

つまり:

方式 フロー
adb pull Android側に書き込み → 転送 → Mac側で読み込み
exec-out 直接ストリーム → Mac側で受け取り

保存・転送・読み込みのオーバーヘッドを極限まで削減できます。


2. 5秒ポーリングによるインテリジェント監視

スクショの「撮った瞬間」を検知するために、ADBでAndroid側の /sdcard/DCIM/Screenshots/ を5秒おきに監視しています。

// 疑似コード
loop {
    let current_files = list_screenshots_via_adb(&device)?;
    let new_files = diff(&last_snapshot, &current_files);
    
    for file in new_files {
        transfer_file(&device, &file).await?;
    }
    
    last_snapshot = current_files;
    sleep(Duration::from_secs(5)).await;
}

アプリがバックグラウンドに隠れているときはポーリング間隔を伸ばし、CPU/メモリ消費を最小化する低負荷モードも実装しています。


3. HEIC → JPG のリアルタイム変換

最近のAndroid端末はHEICで保存するケースがあります。Mac側で扱いやすいように、転送時にリアルタイムでJPGへ変換しています。

Rustの画像処理クレートを使い、転送パイプラインの中でシームレスに変換するため、ユーザーが意識することはありません。


4. Base64方式のギャラリー表示

TauriでフロントエンドからRust側の画像ファイルを表示するとき、ファイルパスをそのまま <img src> に渡す方法だと環境によって表示されないケースがありました。

解決策として Base64エンコードしてData URIとして渡す 方式を採用。

// Rust側
let bytes = fs::read(&image_path)?;
let base64 = general_purpose::STANDARD.encode(&bytes);
Ok(format!("data:image/jpeg;base64,{}", base64))
// React側
<img src={base64DataUri} alt="screenshot" />

環境に依存せず100%確実に表示できます。


5. ネイティブ ドラッグ&ドロップ

最重要機能です。

ギャラリーの画像をSlack・Discord・Finderへそのままドラッグ&ドロップできます。Tauriの startDrag APIを使い、macOSのネイティブなドラッグセッションを開始します。

Slackにスクショを貼るとき「ファイルを探してドラッグ」ではなく「ギャラリーから直接ドロップ」で済むのは、地味ながら毎日使うと体感が大きく違います。


6. Wi-Fi接続モード

USB接続で一度ペアリングした後、同じネットワーク内であればWi-Fiでも接続できます。ADB over TCP/IPを使っており、ケーブルなしでも自動転送が続きます。

# USB接続後にTCPモードへ切り替え
adb tcpip 5555
adb connect 192.168.x.x:5555
```![hiyokoshot_jp_clean.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4392546/cbffc394-f8ce-41e3-a8da-f718e6c5a9a9.png)
![Screenshot 2026-04-09 at 13.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4392546/4c90a99f-3b07-4d4a-8d79-cee7e624f9d9.png)

---

スタック まとめ

| レイヤー | 技術 |
|----------|------|
| バックエンド | Rust |
| フロントエンド | React + Framer Motion |
| フレームワーク | Tauri |
| ADB通信 | exec-out / TCP/IP |
| 設定永続化 | tauri-plugin-store |
| 画像変換 | Rustの画像処理クレート |
| UI | メニューバーポップオーバー(ダークモード対応)|

---

おわりに

「スクショをMacに持ってくる」という超ニッチな課題ですが、毎日使う人には刺さるツールだと思っています。

Tauri + Rust でネイティブ品質のmacOSアプリを作れる体験は非常に良く、特にADBとの低レベルな連携をRustで書けるのは気持ちいいです。

興味あれば使ってみてください🐤🌷

**Hiyoko Shot** は¥1,000 / $7の買い切りです。Android + Mac ユーザーの方はぜひ。

- 🇯🇵 日本円: https://hiyokoko.gumroad.com/l/hiyokoshot_jp
- 🌍 USD: https://hiyokoko.gumroad.com/l/hiyokoshot_en
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?