【问题标题】:Can not export audiofiles via "open in:" from Voice Memos App无法通过语音备忘录应用程序的“打开方式:”导出音频文件
【发布时间】:2019-09-09 17:40:40
【问题描述】:

我的应用高度依赖可以从其他应用导出到我的应用中的音频文件。 我的目标“信息”窗格中的“文档类型”配置为通过“打开方式:”从另一个应用程序的共享选项接受和导入 3 种不同类型的音频文件(mp3、m4a 和 aac)。 从 MailDropbox 将音频导出到我的应用程序可以正常工作,但 Voice Memos 甚至 iMessage 拒绝显示我的应用作为分享选项。

我发现通过 Dropbox 将音频从 Voice Memos 导出到我的应用中。但这不是一个好方法,因为它应该直接工作。

有没有人知道如何才能让语音备忘录中的音频导出正常工作?

提前致谢,保罗

【问题讨论】:

  • 我不知道为什么 Voice Memos 的 m4a 文件无法导出到 m4a 处理应用程序,但您可以通过添加将您的应用程序添加到通常的应用程序集(消息、邮件、Slack)中您的应用程序的共享扩展。您的用户需要通过点击“更多...”来启用它。

标签: ios iphone


【解决方案1】:

我确信自发布此问题以来发生了很多变化,但这是我通过“复制到:”共享选项设法将语音备忘录应用程序中的音频文件导出到我的应用程序的方法。

  • 在 XCode 中,在我的目标的 info 面板下,我添加了 com.apple.m4a-audio Document Type 并将 Supports opening documents in place(设置为 YES)添加到 自定义 iOS 目标属性(见下图)
  • 在我的AppDelegate 我实现了application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool

就是这样。现在从我设备上的语音备忘录应用程序中,如果我按下备忘录上的“共享”按钮,我会在选项列表中看到“复制到 [我的应用程序]”(可能需要通过最后一个选项“更多”启用它)

这是 Target 的 info 面板中所需更改的图片:

还有一个代码示例,用于在按下“复制到 [您的应用]”后立即在您自己的应用中播放选定的语音备忘录(将在您的 AppDelegate 中实现):

  import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    let engine = AVAudioEngine()
    let player = AVAudioPlayerNode()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
guard let copyURL = URL(string: "test.m4a", relativeTo: FileManager.default.temporaryDirectory) else {
            return false
        }
        engine.attach(player)
        engine.connect(player, to: engine.mainMixerNode, format: nil)

        do {
            // Copy voice memo to this app's temp directory
            try FileManager.default.copyItem(at: url, to: copyURL)
            // Create readable audio file from copied file
            let file = try AVAudioFile(forReading: copyURL)
            // "Load" the file into the player
            player.scheduleFile(file, at: nil, completionHandler: nil)
            try AVAudioSession.sharedInstance().setActive(true)
            try engine.start()
        } catch {
            print(error)
            return false
        }

        player.play()
        return true
    }

}

请注意,此代码仅用于说明语音备忘录的 url 已正确传播到您的应用程序以及如何将文件复制到临时目录。从那里你可能想将它传递给正确的 ViewController。

编辑:更改代码以说明如何复制文件

【讨论】:

  • 您为我节省了大量时间。我通过简单地将其加载到 AVAudioPlayer 并在应用程序数据模型中创建一个条目来使用它。
【解决方案2】:

不确定这是否会对您有所帮助,您可能需要创建一个脚本来自动执行复制到剪贴板的功能,但您可以这样做..

当发送选择栏在“更多”上时,按“应用程序”以显示接受音频文件的应用程序列表。只需在列表中选择一个应用程序,即可将与发送屏幕关联的备忘录发送给它。

请注意,“应用”单元格仅在发送单个备忘录时可见(更改“自动发送”设置时不可用)。

还可以将备忘录中包含的音频复制到剪贴板。然后另一个应用程序可以读取剪贴板的内容以导入音频。要将音频复制到剪贴板,请长按备忘录列表中的备忘录名称,然后按出现的“复制”按钮。如果没有出现“复制”按钮,您可能正在尝试复制太大的备忘录(您不应尝试复制超过 30MB 的备忘录)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多