Facing issues while saving file using ContentResolver in android - Kotlin

Viewed 134

I am back to android after a gap of 4 years. So many new things have been introduced. Facing one issue while saving an excel file to the user's default download folder. Please see below the details:

Step 1 - in AndroidManifest.xml (getting permission)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Step 2 - initializing the write function

if (isStoragePermissionGranted()) {
    val applicationContext = this.baseContext
    val data = createWorkbook(this.memberList).toString()
    writeToFile(applicationContext,fileName,data)
}

Details of isStoragePermissionGranted() method.

private fun isStoragePermissionGranted(): Boolean {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                //Permission is granted
                true
            } else {
                //Permission is revoked
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),1
                )
                false
            }
        } else {
            //permission is automatically granted on sdk<23 upon installation
            //Permission is granted
            true
        }
    }

Details of writeToFile() method.

fun writeToFile(applicationContext: Context, filename: String, data: String) {

    try {
        val resolver = applicationContext.contentResolver
        val values = ContentValues()
        values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
        values.put(MediaStore.MediaColumns.MIME_TYPE, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
        values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
        val uri = resolver.insert(MediaStore.Files.getContentUri("external"), values)

        //val cr: ContentResolver = getContentResolver()
        val os: OutputStream? = uri?.let { resolver.openOutputStream(it, "wt") }

        if (os != null) {
            os.write(data.toByteArray())
            os.flush()
            os.close()
        }

    } catch (e: FileNotFoundException) {
        e.printStackTrace()
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

Details of createWorkbook method.

private fun createWorkbook(memberList: ArrayList<CommitteeMember>): Workbook {
        // Creating a workbook object from the XSSFWorkbook() class
        val ourWorkbook = XSSFWorkbook()

        //Creating a sheet called "statSheet" inside the workbook and then add data to it
        val sheet: Sheet = ourWorkbook.createSheet("statSheet")
        addData(sheet, memberList)

        return ourWorkbook
    }

I am getting the following error. Please suggest where I am going wrong. Thanks!

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.agartalatoday.bjymconnect, PID: 4991
    java.lang.IllegalArgumentException: no path was provided when inserting new file
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
        at android.content.ContentResolver.insert(ContentResolver.java:1729)
        at com.agartalatoday.bjymconnect.BaseActivityClass.writeToFile(BaseActivityClass.kt:106)
        at com.agartalatoday.bjymconnect.BaseActivityClass.saveData(BaseActivityClass.kt:93)
        at com.agartalatoday.bjymconnect.fragments.CommitteeListViewFragment$onCreateView$1.onClick(CommitteeListViewFragment.kt:64)
        at android.view.View.performClick(View.java:6642)
        at android.view.View.performClickInternal(View.java:6619)
        at android.view.View.access$3100(View.java:790)
        at android.view.View$PerformClick.run(View.java:26189)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7147)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:511)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)
I/Process: Sending signal. PID: 4991 SIG: 9
0 Answers
Related