{"id":469,"date":"2022-12-15T23:45:46","date_gmt":"2022-12-15T23:45:46","guid":{"rendered":"https:\/\/krushton.com\/blog\/?p=469"},"modified":"2022-12-21T00:17:56","modified_gmt":"2022-12-21T00:17:56","slug":"cheap-android-phone-based-rfid-music-player-like-yoto-or-toniebox","status":"publish","type":"post","link":"https:\/\/krushton.com\/blog\/cheap-android-phone-based-rfid-music-player-like-yoto-or-toniebox\/","title":{"rendered":"RFID card music player (Yoto clone)"},"content":{"rendered":"<p>For the last few years running, the hottest holiday toy for the under 5 year old set has been an RFID-powered music player like the <a href=\"https:\/\/us.yotoplay.com\/\">Yoto<\/a> or <a href=\"https:\/\/us.tonies.com\/\">Toniebox<\/a>. Kids love the freedom to choose what to listen to and parents love that their children get to enjoy media without the overstimulation of screens (or having one of their kids&#8217; first words be &#8220;OKGoogle&#8221;.)<\/p>\n<p>I looked into buying one of these for my toddler twins, but at $100+ it&#8217;s a tough sell, especially since the underlying tech is pretty simple &#8211; just a hardware box with an RFID scanner and a wifi enabled speaker. I&#8217;d actually built something similar in a grad school project, except it was a teddy bear and the focus was learning games and not music (<a href=\"https:\/\/krushton.com\/blog\/fuzzy-logic\/\">Fuzzy Logic<\/a>). Also, the products charge a LOT for the &#8220;build your own&#8221; cards feature, which uses blank RFID cards that the parent maps to media of their choice &#8211; even though blank RFID cards can be purchased for under 50 cents.<\/p>\n<p>Enter my app, Spotify Cards. This app takes advantage of the fact that most Android phones have built in RFID readers on them. It also uses the Spotify Player API for Android to play songs in the background on Spotify. Using this app, a parent (for now, me :)) can buy packs of blank RFID cards and link them up to Spotify songs, creating a delightful and simple replica of the Yoto player experience. I typically launch the app and then lock the screen using the Android screen lock feature, so the kids can listen to music unattended.<\/p>\n<h3>Admin Interface &#8211; Adding Cards<\/h3>\n<figure id=\"attachment_474\" aria-describedby=\"caption-attachment-474\" style=\"width: 242px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-474\" src=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-182x300.png\" alt=\"SpotifyCards List View\" width=\"242\" height=\"400\" srcset=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-182x300.png 182w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-621x1024.png 621w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-768x1267.png 768w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-931x1536.png 931w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-1241x2048.png 1241w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-500x825.png 500w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-800x1320.png 800w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1-1280x2112.png 1280w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-1.png 1440w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><figcaption id=\"caption-attachment-474\" class=\"wp-caption-text\">Main view is a list of added cards. Tapping the card will play the selected song on Spotify.<\/figcaption><\/figure>\n<figure id=\"attachment_478\" aria-describedby=\"caption-attachment-478\" style=\"width: 242px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-478\" src=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-182x300.png\" alt=\"Actions\" width=\"242\" height=\"400\" srcset=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-182x300.png 182w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-621x1024.png 621w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-768x1267.png 768w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-931x1536.png 931w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-1241x2048.png 1241w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-500x825.png 500w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-800x1320.png 800w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5-1280x2112.png 1280w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-5.png 1440w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><figcaption id=\"caption-attachment-478\" class=\"wp-caption-text\">Swipe on the list item to take action &#8211; edit or delete<\/figcaption><\/figure>\n<figure id=\"attachment_475\" aria-describedby=\"caption-attachment-475\" style=\"width: 242px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-475\" src=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-182x300.png\" alt=\"Add or update cards\" width=\"242\" height=\"400\" srcset=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-182x300.png 182w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-621x1024.png 621w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-768x1267.png 768w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-931x1536.png 931w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-1241x2048.png 1241w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-500x825.png 500w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-800x1320.png 800w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2-1280x2112.png 1280w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-2.png 1440w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><figcaption id=\"caption-attachment-475\" class=\"wp-caption-text\">Add or update card view. To link a song, a user can simply paste in the &#8220;Share&#8221; URL from Spotify for ease of use<\/figcaption><\/figure>\n<figure id=\"attachment_479\" aria-describedby=\"caption-attachment-479\" style=\"width: 242px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-479\" src=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-182x300.png\" alt=\"List empty state\" width=\"242\" height=\"400\" srcset=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-182x300.png 182w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-621x1024.png 621w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-768x1267.png 768w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-931x1536.png 931w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-1241x2048.png 1241w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-500x825.png 500w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-800x1320.png 800w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6-1280x2112.png 1280w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-6.png 1440w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><figcaption id=\"caption-attachment-479\" class=\"wp-caption-text\">Empty state\/welcome screen for card list<\/figcaption><\/figure>\n<figure id=\"attachment_476\" aria-describedby=\"caption-attachment-476\" style=\"width: 242px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-476\" src=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-182x300.png\" alt=\"Onboarding screen\" width=\"242\" height=\"400\" srcset=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-182x300.png 182w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-621x1024.png 621w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-768x1267.png 768w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-931x1536.png 931w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-1241x2048.png 1241w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-500x825.png 500w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-800x1320.png 800w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3-1280x2112.png 1280w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-3.png 1440w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><figcaption id=\"caption-attachment-476\" class=\"wp-caption-text\">Once launched into player mode, the user is prompted to scan a card.<\/figcaption><\/figure>\n<figure id=\"attachment_477\" aria-describedby=\"caption-attachment-477\" style=\"width: 242px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-477\" src=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-182x300.png\" alt=\"Player screen\" width=\"242\" height=\"400\" srcset=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-182x300.png 182w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-621x1024.png 621w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-768x1267.png 768w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-931x1536.png 931w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-1241x2048.png 1241w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-500x825.png 500w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-800x1320.png 800w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4-1280x2112.png 1280w, https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/Android-Small-4.png 1440w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><figcaption id=\"caption-attachment-477\" class=\"wp-caption-text\">While the song is playing the UI is very simple and adapted for non readers. All that is shown is a track image and two controls for pausing\/playing the music and resetting.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>Demo Video<\/h3>\n<p>Here it is in action! Note &#8211; this is showing the V1 UI before I finished the more polished design.<\/p>\n<div style=\"width: 960px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-469-1\" width=\"960\" height=\"1707\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/20211022_184422_1-1.mp4?_=1\" \/><a href=\"https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/20211022_184422_1-1.mp4\">https:\/\/krushton.com\/blog\/wp-content\/uploads\/2022\/12\/20211022_184422_1-1.mp4<\/a><\/video><\/div>\n","protected":false},"excerpt":{"rendered":"<p>For the last few years running, the hottest holiday toy for the under 5 year old set has been an RFID-powered music player like the Yoto or Toniebox. Kids love the freedom to choose what to listen to and parents love that their children get to enjoy media without the overstimulation of screens (or having &hellip;<\/p>\n","protected":false},"author":1,"featured_media":489,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_vp_format_video_url":"","_vp_image_focal_point":[],"footnotes":""},"categories":[1],"tags":[],"class_list":["post-469","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"wps_subtitle":"","_links":{"self":[{"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/posts\/469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/comments?post=469"}],"version-history":[{"count":10,"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/posts\/469\/revisions"}],"predecessor-version":[{"id":498,"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/posts\/469\/revisions\/498"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/media\/489"}],"wp:attachment":[{"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/media?parent=469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/categories?post=469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/krushton.com\/blog\/wp-json\/wp\/v2\/tags?post=469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}