MainActivity.kt
package com.cfsuman.kotlintutorials
import android.app.Activity
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.widget.*
class MainActivity : Activity() {
lateinit var listView: ListView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// get the widgets reference from XML layout
val buttonAlarm = findViewById<Button>(R.id.buttonAlarm)
val buttonNotification = findViewById<Button>(R.id.buttonNotification)
val buttonRingtone = findViewById<Button>(R.id.buttonRingtone)
listView = findViewById<ListView>(R.id.listView)
// Get the alarm sound list
buttonAlarm.setOnClickListener{
populateListView(sounds(MediaStore.Audio.Media.IS_ALARM))
}
// Get the notification sound list
buttonNotification.setOnClickListener{
populateListView(
sounds(MediaStore.Audio.Media.IS_NOTIFICATION))
}
// Get the ringtone sound list
buttonRingtone.setOnClickListener{
populateListView(
sounds(MediaStore.Audio.Media.IS_RINGTONE))
}
}
// Display the specific sound list on list view
private fun populateListView(list:MutableList<Sound>){
// Get specific sound titles list
val titles = mutableListOf<String>()
for (music in list){titles.add(music.title)}
// Display sound list on list view
val adapter = ArrayAdapter(
this,
android.R.layout.simple_list_item_1,titles
)
listView.adapter = adapter
}
}
// Extension method to get all specific type audio/sound files list
fun Context.sounds(type:String):MutableList<Sound>{
// Initialize an empty mutable list of sounds
val list:MutableList<Sound> = mutableListOf()
// Get the internal storage media store audio uri
//val uri: Uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
val uri: Uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI
// Non-zero if the audio file type match
val selection = "$type != 0"
// Sort the audio
val sortOrder = MediaStore.Audio.Media.TITLE + " ASC"
//val sortOrder = MediaStore.Audio.Media.TITLE + " DESC"
// Query the storage for specific type audio files
val cursor: Cursor? = this.contentResolver.query(
uri, // Uri
null, // Projection
selection, // Selection
null, // Selection arguments
sortOrder // Sort order
)
// If query result is not empty
cursor?.apply {
if (this.moveToFirst()){
val id:Int = this.getColumnIndex(
MediaStore.Audio.Media._ID)
val title:Int = this.getColumnIndex(
MediaStore.Audio.Media.TITLE)
// Now loop through the audio files
do {
val audioId:Long = this.getLong(id)
val audioTitle:String = this.getString(title)
// Add the current audio/sound to the list
list.add(Sound(audioId,audioTitle))
}while (this.moveToNext())
}
}
// Finally, return the audio files list
return list
}
// Initialize a new data class to hold audio data
data class Sound(val id:Long, val title:String)
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#DCDCDC"
android:padding="24dp">
<Button
android:id="@+id/buttonAlarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alarms"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/buttonNotification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="Notifications"
app:layout_constraintBottom_toBottomOf="@+id/buttonAlarm"
app:layout_constraintStart_toEndOf="@+id/buttonAlarm" />
<Button
android:id="@+id/buttonRingtone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="Ringtones"
app:layout_constraintBottom_toBottomOf="@+id/buttonNotification"
app:layout_constraintStart_toEndOf="@+id/buttonNotification" />
<ListView
android:id="@+id/listView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/buttonAlarm" />
</androidx.constraintlayout.widget.ConstraintLayout>