10

Mac でアプリを開発するのはまったくの初心者です。ここでは、Qt を使用して 2 ~ 3 個のアプリのみを開発し、objective-c / cocoa / xcode を使用して開発したアプリはありません。

Qt 4 (具体的には 4.8) の Mac mini (OS X Lion) に SD カードが挿入されたことを検出する方法はありますか?

私はWebとstackoverflowで(再)検索しました-いくつかの結果が出ました-しかし、すべてAndroidとWindows用で、Mac(mini OS X Lion)とは関係ありません。

今まで私はこれを見つけました:

  • Mac (mini) では、カード リーダーは他の USB デバイスと同じように扱われます。
  • この例は、Mac Developer Libraryでも見つかりました。このリンクがすべての人にアクセスできることを願っています。
    この例は...「USBデバイスがシステムに接続またはシステムから削除されたときに非同期コールバックを設定するためにIOKitLibおよびIOUSBLibを使用する方法を示しています」。したがって、それは達成可能です。
    Qtでも同じことをしたい。

SD カードが挿入されたことを検出してから、アプリを表示し、入力を取得して、選択したファイルをカードからローカル ディスクに移動します。
明らかに、すべてが簡単です。カードを検出して (トレイまたは最小化された状態から) アプリを表示することだけが重要で難しい部分です。

正しい方向に向けていただければ幸いです。
前もって感謝します!!


アップデート:

さらに調査したところ、次のことがわかりました。

  • Linux ではudev(libudev)、このようなことを達成するために使用できます。
  • しかし、udev は Linux 固有のものであり、OS X では見つからないことがわかりましたここで
    の回答はに提案します。ここここで非常によく似たものを見つけましたが、 udevルールを使用するLinuxの場合:(use the diskutil activity command to continuously monitor disks being mounted or ejected
  • 最新の、一見最も関連性の高い発見は次のとおりです。
    • diskutil plistそしてIOKit(DiskArbitration)、私が求める解決策の一部でなければなりません
  • 最後に、ここで私は知りましlaunchd plistLingon

今...昨日よりも多くのものを持っていますが、これらすべてをまとめてQtアプリで使用するには、まだ助けが必要です. 誰かが私を最終結果に導くことに非常に感謝しています。私はこれに取り組み続け、実際に何か有用なものを作成できるかどうかを更新します.

前もって感謝します!!: )

4

1 に答える 1

3

DiskArbitrationフレームワークを使用して、マウントされている新しいディスクを監視する起動エージェントを作成する必要があると思います。このエージェントは、ユーザーがログインしたときにバックグラウンドで実行するように設定されます。ヘルパーは、新しいディスクがマウントされていることを検出すると、ディスクを表すプロパティを調べて、アプリケーションに関心があるかどうかを判断できます。そうである場合は、 LaunchServicesAPIを使用してアプリケーションのユーザー向け部分を起動できます。DADiskRef

DiskArbitrationを使用してディスクマウントイベントに登録するコードのスケッチは次のとおりです。

#include <Foundation/Foundation.h>
#include <DiskArbitration/DiskArbitration.h>

static void diskAppearedCallback(DADiskRef disk, void* context)
{
    CFDictionaryRef description = DADiskCopyDescription(disk);
    NSLog(@"Disk appeared: %@", description);
    CFRelease(description);
}

int main(int argc, char **argv)
{
    DASessionRef session = DASessionCreate(kCFAllocatorDefault);
    DARegisterDiskAppearedCallback(session, kDADiskDescriptionMatchVolumeMountable, diskAppearedCallback, 0);
    DASessionScheduleWithRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

    CFRunLoopRun();

    return 0;
}

によって返されるディクショナリにはDADiskCopyDescription、メディアがリムーバブルかイジェクト可能かなど、新しくマウントされたディスクに関心があるかどうかを判断するのに役立つ属性がいくつか含まれています。

于 2013-01-20T10:07:30.527 に答える