{"id":5421,"date":"2024-12-28T14:10:36","date_gmt":"2024-12-28T14:10:36","guid":{"rendered":"https:\/\/obsidiansofteducation.com\/?page_id=5421"},"modified":"2024-12-28T14:10:37","modified_gmt":"2024-12-28T14:10:37","slug":"mit-app-inventor-music-player","status":"publish","type":"page","link":"http:\/\/obsidiansofteducation.com\/index.php\/mit-app-inventor-music-player\/","title":{"rendered":"MIT App Inventor Music Player"},"content":{"rendered":"\n<p>Hello friends and welcome to Obsidian Soft<\/p>\n\n\n\n<p>Today, I will teach you how to make a Music Player app in which we can load songs from our device into our app, make a playlist, and play, pause, stop, go to the previous song, and the next song just like any professional music player app.<\/p>\n\n\n\n<p>Our final app will look something like this:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/ghi1IBTivC900kXzDdr5SYyorAJ_-4XFXZD1zJMRGIGp8Ibn1KVwJOS13iEzjlQQKglBqCkP_waKHk_y95PO3uh8Mgo3AE6tyN_7Bs-bx_o1GnkcLuYar7ysz3YnWeIPhE8r86x3pEVan6ZWMaM5cIww183-h400.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>As you see in the demo, the list view contains the names of the songs. To get this song name from the chosen music file, we need an extension.<\/p>\n\n\n\n<p>So, let\u2019s download the extension from this link.<br><a href=\"https:\/\/community.kodular.io\/t\/filetools-some-tools-to-work-with-files\/40051\" target=\"_blank\" rel=\"noopener\">https:\/\/community.kodular.io\/t\/filetools-some-tools-to-work-with-files\/40051<\/a><\/p>\n\n\n\n<p>We need to log in first so log in using Google account.<\/p>\n\n\n\n<p>Download the aix file.<\/p>\n\n\n\n<p>Also, I downloaded some very nice player images from Freepik:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/pause.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/next.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/play.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/previous.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/stop.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u200b\u200b<\/p>\n\n\n\n<p><a href=\"https:\/\/www.freepik.com\/free-vector\/music-player-icons_849181.htm\" target=\"_blank\" rel=\"noopener\">https:\/\/www.freepik.com\/free-vector\/music-player-icons_849181.htm<\/a><br>I also designed an Add Music button using a similar theme in Adobe Illustrator:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/addMusic.png\" alt=\"\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiPNSVj8iuZJWEoKTO2skJlM_Vll5VXmGg8MJ4DSFSTB6ge1ihiJdyEYvEiWRSJI35C8n_pK9EC7zBd5na-KqaMNpObba5Ig7LEHW_sKwR7y-YYfsGsOmICpWT03MmChInfrDNvXEaZoG3mqJl1I7oiV_e18NPTHjQfS6fQ-5mtZQWkECa8-bkHj7jjOyk\/s140\/addMusic.png\" target=\"_blank\" rel=\"noopener\"><\/a>Now, create a new project and call it MusicPlayer.<br>Import the extension by clicking on Extension in the Palette section of Designer View and then, choosing Import Extension. Choose the downloaded aix file and after it is successfully imported, drag and drop it onto the viewer.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/FG3LsslSUlfvNH8PeH05NmwnpUcXq4HR7K3-1zh4oVz6BTw6GZJrS3grgcbUJpKFMAxlWFcm1lLOVfVWx5zpAsRl8a0UmQLbTdgZ0kAtGd8E9aY_oPpC3qWhE_6l8T9W6X4HVSqrjStETdlCk-wB0N8w400-h256.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Import all buttons in the media section (I reduced the button sizes to 66 by 66 pixels as the original ones were too large)<\/p>\n\n\n\n<p>For screen1, make align horizontal and align vertical both center.<\/p>\n\n\n\n<p>Make the background color black.<br>Drag and drop a FilePicker component from the Media palette.<\/p>\n\n\n\n<p>Make height 45 and width 140 pixels. I am putting in this size as this is the size of my uploaded image for this component.<\/p>\n\n\n\n<p>Choose the appropriate uploaded image.<\/p>\n\n\n\n<p>Drag and drop a listview from the user interface below this button.<\/p>\n\n\n\n<p>Make width fill parent and height: 20%.<\/p>\n\n\n\n<p>Drag and drop a horizontal arrangement from the layout palette below the list view. Make width fill parent. And align horizontal and align vertical both center.<\/p>\n\n\n\n<p>Drag and drop a button from the user interface inside this horizontal arrangement.<\/p>\n\n\n\n<p>Rename to prevBtn. Make height and width both 66 pixels and remove text from it.<\/p>\n\n\n\n<p>Select prevBtn. Duplicate it by pressing Ctrl + C and Ctrl + V on the keyboard for Windows<\/p>\n\n\n\n<p>OR Command + C and Command + V on the keyboard for MacOS.<\/p>\n\n\n\n<p>Rename to playPauseBtn. We will toggle between the two states of playing and pausing using the same button.<\/p>\n\n\n\n<p>Choose the play image as the image for it.<\/p>\n\n\n\n<p>Again duplicate, rename to stopBtn, and choose the appropriate image.<\/p>\n\n\n\n<p>Duplicate one last time, rename to nextBtn, and choose the appropriate image.<\/p>\n\n\n\n<p>Drag and drop a notifier from the user interface. We will use it to show messages to users.<\/p>\n\n\n\n<p>Drag and drop a Player component from Media.<\/p>\n\n\n\n<p>Our screen design is done so let\u2019s go to the blocks section.<br>Let\u2019s define the global variables<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/s2nrCgmBESqi2S2UvXafKC08kku5F4xGDyeKxIH_O8uazFNAe6LfkNDae7cXHQrhtdQCbgDODe5IordIWt_gu83sXNfJoFgzPk4E5wfiPCWhVfFnk6b0h0bjeY4KPsnvodWoEutZ-Ucp9u9BF3v993Yw573-h209.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>musicPos is for maintaining the next and previous song in our list. musicPaused is for knowing that when play button is pressed, should we start the music from the very beginning or from where it was paused?<\/p>\n\n\n\n<p>And we need two lists for maintaining uris of songs and their names.<\/p>\n\n\n\n<p>When screen is initialized, first we set filePicker mimetype i.e. media typpe to Audio and we also ask for permission for reading media of type audio. The AskForPermission procedure call is inside Screen1 blocks.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/4iGJNJqoYfMG3av8lsxu4IqIY_V8VFybxoO_NLrhst5yTSr1Gib1cbR0rKLVyliLfjwLz_4cmI0hkTIRYo3V6mLe-H0g7kglsuoxjwiQd0lF7odRa4HdRJj9HMjach0OOh1GqIEJHxpTW-Mkk_b2llww578-h126.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>After the user has used the filePicker to choose music, the AfterPicking event of the filePicker component will be triggered so add the file picker\u2019s selection i.e. music file chosen by the user to the songUris list.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/6bLqgi0Qzl6mxxLPOwOdfSYFfIAEeR9giUIkgbnsA-VcfYxvWllOf7bPkSkTAzIkjvr5DWcFqOaO-PkPCF9lFco24WH3ZfRuqU0lt5VUCVFKf3VPPppknnPY_WIxscAxYIahDZRQQ6mOLiuVeIri-wgw658-h138.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Next is the reason why we need an extension.<\/p>\n\n\n\n<p>(*if you want the app to work using the Companion app on an iPhone, give some text like Song 1, Song 2 as song names instead of using the extension)<\/p>\n\n\n\n<p>We need the extension to get the file name or song name from the URI.<\/p>\n\n\n\n<p>When the user chooses a song using the file picker, the file picker\u2019s selection property is set to the URI of that music file.<\/p>\n\n\n\n<p>We can use this URI to get the file path using the extension and from that file path, we can eventually get the file name.<\/p>\n\n\n\n<p>So, make a local variable for filepath.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/zGWPSWiyNFuyp8cpFdy4W262KDB-o4vVpl1TTG9lZFpQTGah_1_WyyJnRLN1yFdx7_VmYzKDdYYc6m3xTrd4XO3Lmxdy_ft_3WUg8AkkAoBupZgRQ9kba-s6QEzZMBBYWKc7gZF9ipGkIewc-vBHqEEw466-h163.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Now, we can get the path from URI (filepPicker.selection) using the extension\u2019s PathFromUri procedure.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"71\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/3uiibqRrN1OztrbzbOSnqn2wGTXegBz460Ft2OrTLVG5wKsIq2DYdJ0fvoNicLplPpRI2lB0_8dK-nYjR09JDPJz08DlMv63Nl3F0omsHRTKnI-ffa4K9edBZAkJ9freBA6z_Swp6pxsO2tMKVqSctsw632-h71.png\" width=\"632\"><br>This path is like this: \/storage\/emulated\/0\/Music\/Some song name.mp3 and we are interested in only the song name. So, we can split this path wherever \u2018\/\u2019 comes using Text\u2019s Split block and assign this to the filePath.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/F-c3-JjcOjpGZG9G3nTT2NjVQTGiBV2E4EaCJi0nukOWdIkDolg82pBBx7_d8MqfsgHiHgPW3dU6QPG5eWT3edXG-PbmdCkvrJBG_UB1RVAcaxeV90Lrkj3ZemtMcdbaXO841R28-h16uoMfGKalWww645-h162.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Our filePath local variable is now a list containing items:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Storage<\/li>\n\n\n\n<li>Emulated<\/li>\n\n\n\n<li>0<\/li>\n\n\n\n<li>Music<\/li>\n\n\n\n<li>Some song name.mp3<\/li>\n<\/ol>\n\n\n\n<p><br>And we are interested in only the last item that is actually at index 6 which is also the length of our filePath list.<\/p>\n\n\n\n<p>So, get that last item which is the music name, and add it to our songNames list and also update the listview with the songNames list.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/AvFxbsfLG_A9M4Vs0BC1rPVfw8W5cB-XfoHOTxvlO8J8N1zCCY_nd4GVPZ6W1nvSV76m8ZAhoZyNjiNEwbZX5HozW1cfU2xDgdK-RTJSwaBApBbt6UVw80uwA8jaMVH_RoKdpahNxbWvpNEG75CYx-Iw560-h197.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Now, we have to work on our music player buttons.<\/p>\n\n\n\n<p>Get the playPause Btn click event. We have two situations:<\/p>\n\n\n\n<p>Either the icon on the button is the play one or the pause one.<\/p>\n\n\n\n<p>So put in an if else block from control and check for this condition.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/qAYbbPyjxwaLmqJSoSIf4g5s_86E_e6ywLAmeoAJTlXaGfbSwlqW3HIr07NHA0u0FhbdFfMJ4_FGl7gtB6zba5qHvbHAKHn2lb6vRkrH7TwnD1Nt8xde44Ny2CLcMzcpWEJ794iu3KQeeGdIQqEBIHAw507-h151.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>If playpause button was pressed while the play icon is showing on it, then this means we should start playing some music but we need to also know if the music was paused so that we can resume it so check for musicPaused variable. If it is false, we need to start music from the very beginning. We also need to check if the user has added some songs or not and if not, we have to show an alert using notifier.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/q7Nqk9ryDXAVuiHDF-BAX5ikjy4ylCJrt-dX0yT3tm4dYQOv-VqSqYB9FFz-KnZMr4tzdtWH0jP9oQjXKALbzUtmxchYzQmLBNXS70sophO0Rf41eq9cWRoGf26SKHbkNVMNsIc5wl_D8SY-jNhsMWsw576-h333.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>If the musicPaused variable is true, we will go in the else condition and just start the player without setting the source again.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/VOb-vc4rLpFnx60N2voezZ6nArzbkJTwVCrO8BosZIpimTJxJR3ggYkfzahuAbLxhuSsEuMtIcpSDZ6CxmDjYnq__cLbxRhIC6jmaAxaDmnFr45x50G1dVW8qEtk2g2vdvMlrc1xjIWYlg8EQtPBbN8w581-h381.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>The last else block is for the situation where the icon on the button is pause so we need to pause the music and change the icon to the play icon.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/UMvWp-2jUH0YPOwFu9ZTcLBbPT1v0HNJqkLSyre7IVkPgCcuc9xy4E-Fw9sMCF4oHC7L3_WDrAkEvy77nMRDe2J0nAWk6lWcbypRWz3UVBkO2IaSJKpaI8GP-HsS1rsJhRjXPuFUCp39_LKDCcaXtJ8w603-h442.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Now, the stop button code is fairly simple.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/ZX9siAXJjitDQW9mPXYLpoY4L7CuuS-8411lS8QcZZtZmfe63TvtnmWS91OqYp7FmSAYGkY7sm2i-rgVLYlLPlAr14uMpowMkP87rhsWnFtS7WD25xyU652iOokPLKPEpJe5fydNy2tcgpmzN3odng4w623-h184.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>What happens when the player finishes one song and has to start playing the next item in the playlist i.e. musicUris.<\/p>\n\n\n\n<p>The code will be the same as the next button code.<\/p>\n\n\n\n<p>So, let\u2019s make a procedure for this to avoid repetition of similar code. For playing the next song, we need to check if we still have at least one song left for playing and then, we increment musicPos and play the song corresponding to the incremented musicPos.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/l1GkLLGLyYEnkiHE30mfnA4j3GeiHOoirizEutacW-_acIxpfawHgVanmonXSADTVwpnQ79LBD7okwBQXcLSg_D2cL7cUoffpRI5AJWZr7rJzPoMum_UMCbzfYgHigENgMCcI_0RqmZhl4NcRhTRYHsw613-h236.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Call this procedure from both the next button click event and the player completion event.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/jeOmOFcR_zzuRF-xOChiXjC3Y97xtIU1Qt3iiAo_bGev-I6bLu6FvVZ5ZVXWTOuZ7AAT6ETTT7PTIaeoHj4eaBu7zWAjOri6WIJNMctYWsfy9jJknzVXcl0BPwQeO10BCibqo4XUoYBV6iLmn7nVwGMw320-h105.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/4q3fi41vuw4QVhe3bxabDQL5cKT1VgzSskrN9DXv0Ve1CNifAh9OfLdQtYlPuDcrDvQigJSP0bKYQQ2TrMwvb7pjoSyGKqHDZWlsQor2Xe-D6atEjI4waZTIL8GVEcEtyj-0gGVpp66ZMTKJRgtA5nkw320-h95.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Our previous button code is similar to our procedure but this time, we have to subtract one from musicPos but we only do it if there is a previous song in the playlist and we aren\u2019t already on the first song.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"253\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/86YJ_1MFq4JC4WznmDwov_bWjLltsZsm4pBQqYBCSL3k4FvQ1UV1C8AFNzxqeD9Hor9yuniq1XiOnx29eDaDax1iX3UIX3hHqnQ03n06ww-g20JDZEamA_QeAqRNFe8EvXCdSNIT3Y1zs8cMB-kLLBEw632-h253.png\" width=\"632\"><br>Last but not least, I added code for deleting items from the playlist i.e. listview by tapping on it. I used the same method in the shopping list app.<\/p>\n\n\n\n<p>Here, we need to delete from two lists and also update our musicPos. For example, we are playing song no. 4 and the user deletes song no. 2 so our musicPos should now become 3 instead of 4. We only have to do this if the user deletes a song that is in a position less than the music Pos. If the user deletes song no. 6 and we are playing song. 4 then our musicPos isn\u2019t affected by this change and it will stay 4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/V1KibfgZDeBNVTIQtkwooY_FAnWZKlYMNKdojTolP8_RFnBIQgv0bnki1woTGoqN8CnbtWfnruOzcCdeqBbDyYopEPnEFsf46yUwSs57REuYetV8sV94vd1aNRBwjrxuAeZuvNVg0WNvK7bW2qnuXQUw569-h242.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>We are done and I hope you liked this tutorial.<\/p>\n\n\n\n<p>You can further enhance this app by storing the songUris and songNames in TinyDB so that your playlist is there when you open your app again. Just remember to load the lists from tinyDB in Screen initialize and store them in TinyDB again wherever you are making changes to them such as adding items to them or removing items from them.<\/p>\n\n\n\n<p>Have fun coding this app.<\/p>\n\n\n\n<p>I hope you liked this tutorial. You can support my work by clicking the button below.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"372\" height=\"196\" src=\"https:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/image-2.png\" alt=\"\" class=\"wp-image-5423\" style=\"width:212px;height:auto\" srcset=\"http:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/image-2.png 372w, http:\/\/obsidiansofteducation.com\/wp-content\/uploads\/2024\/12\/image-2-300x158.png 300w\" sizes=\"auto, (max-width: 372px) 100vw, 372px\" \/><\/figure>\n<\/div>\n\n\n<p><a href=\"https:\/\/www.buymeacoffee.com\/obsidiansoft\" target=\"_blank\" rel=\"noopener\"><\/a>You can also watch the video here:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<p class=\"responsive-video-wrap clr\"><iframe loading=\"lazy\" title=\"MIT App Inventor Music Player (Part 1) | Mp3 player | Music Player MIT App Inventor #appinventor\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/iTeSxtAlV9k?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<\/div><\/figure>\n\n\n\n<p>Please like my videos and share them with your friends and family. Also, subscribe to my channel and press the bell icon so you don\u2019t miss any of the great projects I have planned for you.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/c\/obsidiansofteducation\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/c\/obsidiansofteducation<\/a><\/p>\n\n\n\n<p>Please like my social media pages for more educational resources and tips.<\/p>\n\n\n\n<p>Facebook:<a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/7140650632339107612#\" target=\"_blank\" rel=\"noopener\">&nbsp;https:\/\/www.facebook.com\/ObsidianSoft\/<\/a><\/p>\n\n\n\n<p>Instagram:<a href=\"https:\/\/www.blogger.com\/blog\/page\/edit\/4947000819484484884\/7140650632339107612#\" target=\"_blank\" rel=\"noopener\">&nbsp;https:\/\/www.instagram.com\/obsidiansoftapps\/<\/a><\/p>\n\n\n\n<p>Pinterest:<\/p>\n\n\n\n<p><a href=\"https:\/\/www.pinterest.co.uk\/obsidiansoft\/_created\" target=\"_blank\" rel=\"noopener\">https:\/\/www.pinterest.co.uk\/obsidiansoft\/_created<\/a><\/p>\n\n\n\n<p>For links to free educational apps, have a look at the\u00a0<a href=\"https:\/\/obsidiansofteducation.com\/index.php\/mobile-apps\/\">educational apps page<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello friends and welcome to Obsidian Soft Today, I will teach you how to make a Music Player app in which we can load songs from our device into our app, make a playlist, and play, pause, stop, go to the previous song, and the next song just like any professional music player app. Our [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5421","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/5421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/comments?post=5421"}],"version-history":[{"count":1,"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/5421\/revisions"}],"predecessor-version":[{"id":5424,"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/pages\/5421\/revisions\/5424"}],"wp:attachment":[{"href":"http:\/\/obsidiansofteducation.com\/index.php\/wp-json\/wp\/v2\/media?parent=5421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}