Programim dhe zhvillim, javascript, python, php, html

Si të krijoni ekranin NowPlay në CarPlay Xamarin.iOS? dhe Si të vendosni pronësinë nowPlayingIdentifiers në MPPlayableContentManager?

Unë kam krijuar Audio App në Xamarin.Forms, për të luajtur audio kam përdorur plugin MediaManager.

Tani dua ta bëj atë të pajtueshëm me CarPlay.

Aplikacionet audio CarPlay kontrollohen nga MPPlayableContentManager. Ju kërkohet të zbatoni protokollin MPPlayableContentDelegate dhe MPPlayableContentDatasource për t'u lidhur me CarPlay. Ndërfaqja e përdoruesit kontrollohet nga CarPlay - gjithçka që duhet të bëni është ta ushqeni atë me të dhëna për skedat+tabelat (burimi i të dhënave) dhe t'u përgjigjeni artikujve që mund të luhen (delegoni).

Unë kam përdorur të gjithë api të kërkuara CarPlay për aplikacionin audio, por problemi është:

  • Nuk po shfaqet tani ekrani i luajtjes në simulatorin CarPlay.
  • Si të vendosni ArtWork në MPContentItem?

Klasa MPPlayableContentDelegate

public class PlayableContentDelegate : MPPlayableContentDelegate
{
    public override void PlayableContentManager(MPPlayableContentManager contentManager, NSIndexPath indexPath, Action<NSError> completionHandler)
    {
        DispatchQueue.MainQueue.DispatchAsync(() =>
        {
            UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();
            completionHandler(null);
            UIApplication.SharedApplication.EndReceivingRemoteControlEvents();

            UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();
        });
    }

    [Export("playableContentManager:initiatePlaybackOfContentItemAtIndexPath:completionHandler:")]
    public override void InitiatePlaybackOfContentItem(MPPlayableContentManager contentManager, NSIndexPath indexPath, Action<NSError> completionHandler)
    {
        try
        {
            DispatchQueue.MainQueue.DispatchAsync(() =>
            {
                UIApplication.SharedApplication.BeginReceivingRemoteControlEvents();

                var itemToPlay = BaseSettingsService.CurrentPlayList[indexPath.Row];
                var NowPlayingInfoCenter = MPNowPlayingInfoCenter.DefaultCenter;

                MPNowPlayingInfo playingInfo = new MPNowPlayingInfo();
                playingInfo.Title = itemToPlay.Title;
                playingInfo.Artist = itemToPlay.Editor;
                playingInfo.AlbumTitle = "1989";
                playingInfo.Genre = "Pop";
                playingInfo.PlaybackDuration = 231;
                playingInfo.PlaybackRate = 22;
                playingInfo.PersistentID = (ulong)111111;
                playingInfo.PlaybackQueueIndex = 3;
                playingInfo.PlaybackQueueCount = BaseSettingsService.CurrentPlayList.Count;
                playingInfo.IsLiveStream = false;
                playingInfo.MediaType = MPNowPlayingInfoMediaType.Audio;
                NowPlayingInfoCenter.NowPlaying = playingInfo;

                var id = itemToPlay.PodcastId.ToString();
                string[] s1 = new string[1];
                s1[0] = id;

                contentManager.NowPlayingIdentifiers = s1;

                completionHandler(null);

                UIApplication.SharedApplication.EndReceivingRemoteControlEvents();
            });
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

    public override nuint RetainCount { get; }

    public override void ContextUpdated(MPPlayableContentManager contentManager, MPPlayableContentManagerContext context)
    {
        try
        {
            //base.ContextUpdated(contentManager, context);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

    public override NSDictionary GetDictionaryOfValuesFromKeys(NSString[] keys)
    {
        return base.GetDictionaryOfValuesFromKeys(keys);
    }
}

Burimi i të dhënave MPPlayableContent

public class AppDelegateDataSource : MPPlayableContentDataSource
{
    public override MPContentItem ContentItem(NSIndexPath indexPath)
    {
        if (indexPath.Length == 1)
        {
            var item = new MPContentItem("PlayList");
            item.Title = "PlayList";
            item.Subtitle = "Hello";
            item.Container = true;
            item.Playable = false;
            return item;
        }
        else
        {
            var play = CurrentPlayList[indexPath.Row];
            var item = new MPContentItem(play.PodcastId);
            item.Title = play.Title;
            item.Subtitle = play.Editor;
            item.Playable = true;
            return item;
        }
    }

    public override nint NumberOfChildItems(NSIndexPath indexPath)
    {
        if (indexPath.GetIndexes().Length == 0)
            return 1;
        else
            return CurrentPlayList.Count;
    }
}

Pra, pyetja është Si duhet t'i përgjigjem artikujve të luajtshëm tani?

E di ndokush se çfarë më mungon apo cili gabim duhet të korrigjoj? Çdo ndihmë do të vlerësohej, faleminderit.


  • A keni shtuar një pikë ndërprerjeje dhe keni kontrolluar nëse kodi që shkruani është ekzekutuar? Dhe korrigjoni gabimet nga vjen Titulli dhe Titra e ndryshme? 25.09.2020
  • Po, kam kontrolluar kodin, është ekzekutuar. Dhe kur të ekzekutohej, mora emrin e saktë që dua të dërgoj @JackHua-MSFT 25.09.2020
  • 1.) Në sa larg? Ju lutemi jepni detaje se çfarë prisni dhe çfarë shihni. 2.) A keni krijuar një seancë audio dhe e keni vendosur atë aktiv në një moment? Ekrani NowPlaying nuk është i besueshëm në simulator, ju duhet kërcimi stackoverflow.com/a/54625709/415982 për ta bërë atë të funksionojë (të paktën që nga iOS13, nuk ka ide nëse 14 i ka ndryshuar gjërat përsëri…) 25.09.2020
  • @DrMickeyLauer si të krijoni seancë audio? do të thoni se NowPlaying nuk do të funksionojë në simulator? 25.09.2020
  • @Divyesh_08 Nuk po them se nuk do të funksionojë, por mund të kërkojë një zënkë të çuditshme me thirrjen beginReceivingRemoteControlEvents() dhe endReceivingRemoteControlEvents(). Sa i përket seancës audio, duhet të merrni AVAudioSession.sharedInstance() aktuale dhe më pas të paktën të vendosni një konfigurim (setConfiguration() dhe ta vendosni atë aktiv (setActive()), përndryshe iOS nuk do të kalojë asnjë audio. 26.09.2020
  • @DrMickeyLauer faleminderit për informacionin. Por unë nuk kam përdorur AVAudio, jam duke punuar me shtojcën MediaManager të Xamarin.Forms. Por përsëri faleminderit. 26.09.2020
  • Ju keni marrë të drejtat e CarPlay??? Me sa di unë ato u jepen vetëm kompanive shumë, shumë të mëdha, kështu që dyshoj shumë. Nëse nuk e keni, atëherë... edhe nëse funksionon në simulator, nuk do të funksionojë në pajisjen reale. 26.09.2020
  • Në rregull, nëse po shikoj në vendin e duhur, atëherë github.com/Baseflow/XamarinMediaManager/blob/ do të kujdeset për seancën audio. 26.09.2020
  • @IvanIčin Nuk e kam bërë ende procesin e kërkesës për të drejtën, por shpresoj që pasi ta bëj atë proces do të marr përgjigje pozitive nga Apple. 26.09.2020
  • @Divyesh_08 vetëm për informim, kam shkruar tre herë dhe nuk kam marrë asnjë përgjigje, pozitive apo negative. Nga mbështetja tjetër kam marrë konfirmimin se kështu funksionon. Pra, fillimisht filloni me të drejtën. 26.09.2020

Përgjigjet:


1

Për të marrë ekranin NowPlaying, duhet të vendosni pa dështuar dy gjëra.

  1. MPRemoteCommandCenter
var commandCenter = MPRemoteCommandCenter.Shared;
commandCenter.PlayCommand.Enabled = true;
commandCenter.StopCommand.Enabled = true;
  1. MPPlayableContentManager.NowPlayingIdentifiers
var urlId = "11111";
string[] identifier = new string[1];
identifier[0] = urlId;

contentManager = MPPlayableContentManager.Shared;
contentManager.NowPlayingIdentifiers = identifier;
21.04.2021
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..