如何正确连接到Google Cast设备并使用自定义接收器投放网址?

时间:2015-01-08 13:28:31

标签: ios swift casting chromecast google-cast

为了创建这个,我在Github上使用了Google Cast参考https://github.com/googlecast/CastHelloText-ios& https://github.com/googlecast/CastVideos-ios

然后,如果您下载它,请查看与Google Cast有关的代码块。如果您看到发生此错误的内容,请告知我们。因为我老实说不知道这是一个Xcode还是一个Google Cast错误..或者是最常见的错误..人类

启动模拟器,它会在网络中查找有效的Chrome Cast设备。如果发现投射按钮将出现。当您按下强制转换按钮时,它将转到chooseDevice()功能,并且会在您的网络中显示带有设备的UIAlertController,然后您可以选择要投射到的设备。

如果您点击设备,它将转到connectToDevice()功能并建立连接。

当它连接时,它应该转到下一个名为“deviceManagerDidConnect”的函数。所以我收到一条消息“已连接”... 5秒后我收到一条错误消息“Error Domain = com.google.GCKError Code = 2.Network connection timeout”。当我重建项目时,我得到了一个不同的结果..在“deviceManagerDidConnect”之后它现在转到“didConnectToCastApplication”功能并且第一次没有发生。这是一个错误还是我做错了什么?

我期望它会转到“deviceManagerDidConnect”,然后它将转到“didConnectToCastApplication”功能。在那之后所有的作品我想要投射一个WKWebView ..我知道不支持。所以我想在Textfield中投出一个URL。

您使用的是哪个版本的产品?什么操作系统?
GoogleCastSDK-2.5.1-Release,OS X Yosemite 10.10.1 Xcode版本6.1.1(6A2008a)

提前致谢并度过美好的一天,

FERI

您可以在下面找到我的代码..

    // ==================== Google Cast ====================
    // ==================== chooseDevice() ====================
func chooseDevice() {
    if selectedDevice == nil {
        let alertController = UIAlertController(title: "Choose device..", message: "", preferredStyle: .ActionSheet)

        for device in deviceScanner.devices {
            alertController.addAction(UIAlertAction(title: device.friendlyName, style: .Default, handler: { alertAction in
                self.selectedDevice = device as GCKDevice
                self.connectToDevice()
            }))
        }

        let addCancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: { alertAction in
            alertController.dismissViewControllerAnimated(true, completion: nil)
        })

        // Add action to the controller
        alertController.addAction(addCancelAction)

        // Finaly present the action controller
        presentViewController(alertController, animated: true, completion: nil)
    }
    else {
        updateButtonStates()

        let mediaTitle = self.mediaInformation?.metadata.stringForKey(kGCKMetadataKeyTitle)
        //            mediaTitle.metadata.stringForKey(kGCKMetadataKeyTitle) //Silver Essence Castaway
        //            var mediaTitle = mediaInformation.metadata.stringForKey(kGCKMetadataKeyTitle)

        NSLog("De waarde van kGCKMetadataKeyTitle is: \(kGCKMetadataKeyTitle)")

        let alertController = UIAlertController(title: "Casting to: \(selectedDevice.friendlyName)", message: nil, preferredStyle: .ActionSheet)

        let addDisconnectingAction = UIAlertAction(title: "Disconnect device", style: .Destructive, handler: { alertAction in
                            println("De waarde van mediaInformation is: \(mediaTitle)")
                            if mediaTitle != nil {
                                (mediaTitle != nil ? 1 : 0)
                                alertController.dismissViewControllerAnimated(true, completion: nil)
                                println("the else UIAlertController")
                            }
        })

        let addCancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: { alertAction in
                            println("De waarde van mediaInformation is: \(mediaTitle)")
                            if mediaTitle != nil {
                                (mediaTitle != nil ? 2 : 1)
                                alertController.dismissViewControllerAnimated(true, completion: nil)
                                println("else uiactionsheet")
                            }
        })

        // Add action to the controller
        alertController.addAction(addDisconnectingAction)
        alertController.addAction(addCancelAction)

        // Finaly present the action controller
        self.presentViewController(alertController, animated: true, completion: nil)
    }
}

    // ==================== updateStatsFromDevice() ====================
func updateStatsFromDevice() {
    if mediaControlChannel != nil {
        mediaInformation = mediaControlChannel.mediaStatus.mediaInformation
    }
}

    // ==================== isConnected() ====================
func isConnected() -> Bool {
    return deviceManager.isConnected
}

    // ==================== connectToDevice() ====================
func connectToDevice() {
    if selectedDevice != nil {
        //            var info = NSBundle.mainBundle().infoDictionary!["CFBundleIdentifier"] as? NSString
        //            deviceManager = GCKDeviceManager(device: selectedDevice, clientPackageName: info)
        deviceManager = GCKDeviceManager(device: selectedDevice, clientPackageName: "CFBundleIdentifier")


        //            NSLog("de waarde van info is \(info)")
        NSLog("de waarde van selectedDevice is \(selectedDevice)")

        deviceManager.delegate = self
        deviceManager.connect()
    }
}

    // ==================== deviceDisconnected() ====================
func deviceDisconnected() {
    NSLog("Device disconneted: \(selectedDevice.friendlyName)")
    deviceManager = nil
    selectedDevice = nil
    mediaControlChannel = nil
    textChannel = nil
}

    // ==================== updateButtonStates() ====================
func updateButtonStates() {
    if (deviceScanner.devices.count == 0) {
        // Hide the cast button
        chromecastButton.setImage(btnImage, forState: .Normal)
        chromecastButton.hidden = true
    }
    if (deviceScanner.devices.count > 0) {

        chromecastButton.setImage(btnImage, forState: .Normal)
        chromecastButton.hidden = false

        // Show cast button
        if (deviceManager != nil) {
            chromecastButton.setImage(btnImageSelected, forState: .Normal)
            chromecastButton.hidden = false
        }
    }
}

    // ==================== sendText ====================
@IBAction func sendText(sender: AnyObject) {
    NSLog("Cast video")

    if deviceManager == nil {
        var alert = UIAlertController(title: "Not connected", message: "Please connect to Cast device", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
        presentViewController(alert, animated: true, completion: nil)

        return
    }

    // Define media metadata
    var metaData = GCKMediaMetadata(metadataType: GCKMediaMetadataType.User)
    metaData.objectForKey("CFBundleVersion")

    metaData.setString("Bug Bunny!", forKey: kGCKMetadataKeyTitle)
    metaData.setString("dit is allemaal maar was subtitles", forKey: kGCKMetadataKeySubtitle)
    var url = NSURL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg")
    metaData.addImage(GCKImage(URL: url, width: 480, height: 360))

    //        var mediaInformation = GCKMediaInformation(contentID: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", streamType: .None, contentType: "video/mp4", metadata: metaData as GCKMediaMetadata, streamDuration: 0, customData: nil)
    mediaInformation = GCKMediaInformation(contentID: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", streamType: GCKMediaStreamType.None, contentType: "video/mp4", metadata: metaData, streamDuration: 0, customData: nil)


    NSLog("waarde van mediainformation is : \(mediaInformation)")

    self.mediaControlChannel?.loadMedia(mediaInformation, autoplay: true, playPosition: 0)
    //        textChannel.sendTextMessage(textFieldUrl.text)
}

    // MARK: GCKDeviceScannerListener
    // ==================== deviceDidComeOnline() ====================
func deviceDidComeOnline(device: GCKDevice!) {
    NSLog("device found! \(device.friendlyName)")
    updateButtonStates()
}

    // ==================== deviceDidGoOffline() ====================
func deviceDidGoOffline(device: GCKDevice!) {
    NSLog("device did go offline \(device.friendlyName)")
    updateButtonStates()
}

    // MARK: UIActionSheetDelegate
    // ==================== actionSheet() ====================
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    if selectedDevice == nil {
        if buttonIndex < deviceScanner.devices.count {
            selectedDevice = deviceScanner.devices[buttonIndex] as GCKDevice
            NSLog("Selecting device: \(selectedDevice.friendlyName)")
            connectToDevice()
        }
    }
    else {
        if buttonIndex == 1 {
            NSLog("Disconnecting device: \(selectedDevice.friendlyName)")
            deviceManager.leaveApplication()
            deviceManager.disconnect()
            deviceDisconnected()
            updateButtonStates()
        }
        else if buttonIndex == 0 {
            // Join the existing session
        }
    }
}

    // MARK: GCKDeviceManagerDelegate
    // ==================== deviceManagerDidConnect() ====================
func deviceManagerDidConnect(deviceManager: GCKDeviceManager!) {
    NSLog("Connected!")
    updateButtonStates()
    self.deviceManager.launchApplication(kReceiverAppID)
}

    // ==================== didConnectToCastApplication() ====================
func deviceManager(deviceManager: GCKDeviceManager!, didConnectToCastApplication applicationMetadata: GCKApplicationMetadata!, sessionID: String!, launchedApplication: Bool) {
    NSLog("application has launched")


    // textChannel = HTCGTextChannel(namespace: "urn:x-cast:com.silver.essence.Silver")
    // self.deviceManager.addChannel(textChannel)


    mediaControlChannel = GCKMediaControlChannel()
    mediaControlChannel.delegate = self
    self.deviceManager.addChannel(mediaControlChannel)
    mediaControlChannel.requestStatus()
}

    // ==================== didFailToConnectToApplicationWithError() ====================
func deviceManager(deviceManager: GCKDeviceManager!, didFailToConnectToApplicationWithError error: NSError!) {
    showError(error)

    deviceDisconnected()
    updateButtonStates()
}

    // ==================== didFailToConnectWithError() ====================
func deviceManager(deviceManager: GCKDeviceManager!, didFailToConnectWithError error: NSError!) {
    showError(error)

    deviceDisconnected()
    updateButtonStates()
}

    // ==================== didDisconnectWithError() ====================
func deviceManager(deviceManager: GCKDeviceManager!, didDisconnectWithError error: NSError!) {
    NSLog("Received notification that device disconnected")

    if error != nil {
        showError(error)
    }

    deviceDisconnected()
    updateButtonStates()
}

    // ==================== didReceiveApplicationMetadata() ====================
func deviceManager(deviceManager: GCKDeviceManager!, didReceiveApplicationMetadata metadata: GCKApplicationMetadata!) {
    applicationMetadata = metadata
}

    // ==================== showError() ====================
func showError(error: NSError) {
    var alert = UIAlertController(title: "Something went wrong", message: error.description, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
    presentViewController(alert, animated: true, completion: nil)
}

    // ==================== viewDidLoad() ====================
override func viewDidLoad() {
    super.viewDidLoad()
    self.loadNSUserDefaults()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "saveNSUserDefaults", name: "kSaveSwitchesStatesNotification", object: nil);
    navigationItem.title = "Settings"

    // ==================== Adding the Chromecast button ====================
    //        kReceiverAppID = kGCKMediaDefaultReceiverApplicationID

    NSLog("de waarde van kReceiverAppID in viewDidLoad() is : \(kReceiverAppID)")

    btnImage = UIImage(named: "icon-cast-identified")
    btnImageSelected = UIImage(named: "icon-cast-connected")

    chromecastButton = UIButton()
    chromecastButton.setImage(UIImage(named: "icon-cast-identified"), forState: .Normal)
    chromecastButton.frame = CGRectMake(0, 0, 45, 45)
    chromecastButton.addTarget(self, action: "chooseDevice", forControlEvents: .TouchUpInside)
    chromecastButton.hidden = true

    var rightItem:UIBarButtonItem = UIBarButtonItem()
    rightItem.customView = chromecastButton
    self.navigationItem.leftBarButtonItem = rightItem

    // ==================== Scan for Chromecast devices ====================
    deviceScanner = GCKDeviceScanner()
    filterCriteria = GCKFilterCriteria(forAvailableApplicationWithID: kReceiverAppID)
    deviceScanner.filterCriteria = filterCriteria
    deviceScanner.addListener(self)
    deviceScanner.startScan()
}

1 个答案:

答案 0 :(得分:3)

最后我发现了问题!它在接收器中。连接到网络中的演员设备时接收器正在加载的HTML文件。确保您的HTML文件具有连接回应用程序的正确功能。 希望这可以帮助那些遇到同样问题的人,而不是在几周内考虑解决方案..

如果您不知道需要哪些功能,请查看Google提供给我们的示例。 https://github.com/googlecast/