I am trying to make a music player and need to save the last played song and the position of it.
I have an .xml file for that in my assets folder and now I try to parse it, but I don't fully understand how it works. Here is my Code:
XML File:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="position" Text="0" />
<string name="song" Text="0" />
</resources>
Kotlin Code:
private val ns: String? = null
data class Entry(val length: String?, val songNumber: String?)
@Throws(XmlPullParserException::class, IOException::class)
fun parse(inputStream: InputStream): List<*> {
inputStream.use { inputStream ->
val parser: XmlPullParser = Xml.newPullParser()
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
parser.setInput(inputStream, null)
parser.nextTag()
return readFeed(parser)
}
}
@Throws(XmlPullParserException::class, IOException::class)
fun readFeed(parser: XmlPullParser): List<Entry> {
val entries = mutableListOf<Entry>()
var songNumber: String? = null
var length: String? = null
parser.require(XmlPullParser.START_TAG, ns, "resources")
repeat(2) {
when (parser.name) {
"position" -> length = readLength(parser)
"song" -> songNumber = readSong(parser)
}
}
entries.add(Entry(length, songNumber))
return entries
}
// Processes title tags in the feed.
@Throws(IOException::class, XmlPullParserException::class)
fun readLength(parser: XmlPullParser): String {
parser.require(XmlPullParser.START_TAG, ns, "position")
val length:String = readText(parser)
parser.require(XmlPullParser.END_TAG, ns, "position")
return length
}
@Throws(IOException::class, XmlPullParserException::class)
fun readSong(parser: XmlPullParser): String {
parser.require(XmlPullParser.START_TAG, ns, "song")
val songNumber = readText(parser)
parser.require(XmlPullParser.END_TAG, ns, "song")
return songNumber
}
// For the tags title and summary, extracts their text values.
@Throws(IOException::class, XmlPullParserException::class)
fun readText(parser: XmlPullParser): String {
var result = ""
if (parser.next() == XmlPullParser.TEXT) {
result = parser.text
parser.nextTag()
}
return result
}
I can't figure out why it doesn't get the value. Where's my problem?