JoshLmao / Spotify4Unity

🎮🎵 Add the SpotifyAPI.NET library into Unity, enabling access to the Spotify Web API, allowing for control of Spotify and accessing the world of music
https://assetstore.unity.com/packages/tools/integration/spotify4unity-ui-tools-spotify-authorization-129028
MIT License
94 stars 8 forks source link

JsonSerializationException: Unable to find a constructor to use for type SpotifyAPI.Web.Models.AvailabeDevices #26

Closed Nicovalca closed 4 years ago

Nicovalca commented 4 years ago

Describe the bug I'm not able to comunicate with spotify. The authentication process goes well in both Windows and Mobile (ios/android) but, after the onConnectChangedEvent the app on mobile Crashes unexpectedly with the error in the title (E/Unity: JsonSerializationException: Unable to find a constructor to use for type SpotifyAPI.Web.Models.AvailabeDevices. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'error', line 1, position 9.)

Building using Unity 2019.2, build setting IL2CPPP, api compatibly level .NET standard 2.0.

The MobileScene has problem too. It doesn't cause a crash (even if i can see the same error popping up in my logcat), but each command i try to send to the spotifyService return the error: E/Unity: PlatformNotSupportedException: Operation is not supported on this platform.

To Reproduce:

Expected behavior Spotify premium account linked to the unity application

Platform: Android 9

Unity Version: 2019.2.18

Nicovalca commented 4 years ago

For anyone that have this issue I solved by adding a link.xml file (anywhere inside the Asset folder will be fine) with this content:

<?xml version="1.0" encoding="utf-8" ?>
<linker>
  <assembly fullname="System">
    <type fullname="System.ComponentModel.TypeConverter" preserve="all" />    
  </assembly>

  <assembly fullname="SpotifyAPI.Web">
    <namespace fullname="SpotifyAPI.Web.Models" preserve="all" />
    <type fullname="SpotifyAPI.Web.Models" preserve="all" />
  </assembly>

   <assembly fullname="System">
        <type fullname="System.ComponentModel.TypeConverter" preserve="all"/>
        <type fullname="System.ComponentModel.ArrayConverter" preserve="all"/>
        <type fullname="System.ComponentModel.BaseNumberConverter" preserve="all"/>
        <type fullname="System.ComponentModel.BooleanConverter" preserve="all"/>
        <type fullname="System.ComponentModel.ByteConverter" preserve="all"/>
        <type fullname="System.ComponentModel.CharConverter" preserve="all"/>
        <type fullname="System.ComponentModel.CollectionConverter" preserve="all"/>
        <type fullname="System.ComponentModel.ComponentConverter" preserve="all"/>
        <type fullname="System.ComponentModel.CultureInfoConverter" preserve="all"/>
        <type fullname="System.ComponentModel.DateTimeConverter" preserve="all"/>
        <type fullname="System.ComponentModel.DecimalConverter" preserve="all"/>
        <type fullname="System.ComponentModel.DoubleConverter" preserve="all"/>
        <type fullname="System.ComponentModel.EnumConverter" preserve="all"/>
        <type fullname="System.ComponentModel.ExpandableObjectConverter" preserve="all"/>
        <type fullname="System.ComponentModel.Int16Converter" preserve="all"/>
        <type fullname="System.ComponentModel.Int32Converter" preserve="all"/>
        <type fullname="System.ComponentModel.Int64Converter" preserve="all"/>
        <type fullname="System.ComponentModel.NullableConverter" preserve="all"/>
        <type fullname="System.ComponentModel.SByteConverter" preserve="all"/>
        <type fullname="System.ComponentModel.SingleConverter" preserve="all"/>
        <type fullname="System.ComponentModel.StringConverter" preserve="all"/>
        <type fullname="System.ComponentModel.TimeSpanConverter" preserve="all"/>
        <type fullname="System.ComponentModel.UInt16Converter" preserve="all"/>
        <type fullname="System.ComponentModel.UInt32Converter" preserve="all"/>
        <type fullname="System.ComponentModel.UInt64Converter" preserve="all"/>
    </assembly>

  <assembly fullname="System.Core">
        <type fullname="System.Linq.Expressions" preserve="all"/>
        <type fullname="System.Linq.Expressions.*" preserve="all"/>
        <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
        <type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
    </assembly>
    <assembly fullname="System.Linq.Expressions">
        <type fullname="System.Linq.Expressions" preserve="all"/>
        <type fullname="System.Linq.Expressions.*" preserve="all"/>
        <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
        <type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
    </assembly>
    <assembly fullname="netstandard">
        <type fullname="System.Linq.Expressions" preserve="all"/>
        <type fullname="System.Linq.Expressions.*" preserve="all"/>
        <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
        <type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
    </assembly> 
</linker>

it seems a newtonsoft.json/IL2CPP issue. If anyone know a better solution please let me know, but so far this worked