【问题标题】:Qt 4.8 - detect insertion and removal of sd card on mac-mini (OS X Lion)Qt 4.8 - 在 mac-mini (OS X Lion) 上检测 sd 卡的插入和移除
【发布时间】:2012-12-29 01:01:29
【问题描述】:

我对在 Mac 上开发应用程序完全陌生。在这里,我只使用 Qt 开发了 2-3 个应用程序,没有使用 Objective-c / cocoa / xcode 开发。

有没有办法在 Qt 4(特别是 4.8)中检测 SD 卡何时插入 Mac mini(OS X Lion)?

我在网络和 stackoverflow 上(重新)搜索了很多 - 一些结果出现了 - 但都是针对 Android 和 Windows - 与 Mac(mini OS X Lion)无关。

到目前为止,我发现了这个:

  • 在 Mac (mini) 上,读卡器的处理方式与任何其他 USB 设备一样
  • 我还在 Mac 开发人员库中找到了这个 example。我希望所有人都可以访问此链接。
    此示例...“演示了使用 IOKitLib 和 IOUSBLib 在 USB 设备连接到系统或从系统中移除时设置异步回调”。因此是可以实现的。
    我想在 Qt 中做同样的事情。

我想检测 SD 卡何时插入,然后我想显示我的应用程序,获取一些输入并将所选文件从卡移动到本地磁盘。
显然,一切都很容易 - 仅检测卡片并显示应用程序(从托盘或最小化状态)是重要且困难的部分。

如果您能指出正确的方向,我将不胜感激。
提前致谢!!


更新:

我进一步研究发现:

  • 在 Linux 上,我们可以使用 udev(libudev) 来实现这样的目标。
  • 但后来我发现udev is Linux specific and won't find that in OS X
    答案here 建议use the diskutil activity command to continuously monitor disks being mounted or ejected
    我发现herehere 非常相似,但对于Linux 使用udev em> 规则:(
  • 最新且看似最相关的发现是:
    • diskutil plistIOKit(DiskArbitration) 必须成为我寻求的解决方案的一部分
  • 最后here我发现了launchdplistLingon

现在...我有比昨天更多的东西,但我仍然需要帮助将所有这些放在一起并在 Qt 应用程序中使用它。我非常感谢有人指导我达到最终结果。如果我真的能创造出有用的东西,我会继续努力并更新。

提前致谢!! :)

【问题讨论】:

    标签: macos qt4 notifications sd-card qt4.8


    【解决方案1】:

    我认为您需要创建一个launch agent,它使用DiskArbitration framework 来监视正在安装的新磁盘。当用户登录时,此代理将设置为在后台运行。当您的助手检测到已安装新磁盘时,它可以检查代表磁盘的DADiskRef 的属性,以确定您的应用程序是否对它感兴趣。如果是,它可以使用LaunchServices API 启动应用程序的面向用户的部分。

    使用 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 返回的字典包含许多属性,您可能会发现这些属性有助于确定新安装的磁盘是否感兴趣,包括媒体是否可移动、可弹出等。

    【讨论】:

    • 嘿bdash!感谢您的回答......这肯定会帮助我朝着正确的方向前进。我一有结果就会回来。再次非常感谢!! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2012-03-22
    • 2012-04-05
    • 2011-12-29
    相关资源
    最近更新 更多