在使用Android中使用ContentResolver保存文件时面对问题-Kotlin

发布于 2025-01-23 18:56:21 字数 4523 浏览 2 评论 0原文

经过4年的差距,我回到了Android。引入了许多新事物。面对一个问题,同时将Excel文件保存到用户的默认下载文件夹中。请参阅下面的详细信息:

步骤1-在AndroidManifest.xml(获得许可)

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

步骤2-初始化

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

isStoragePermissiongranted()方法的写入功能详细信息。

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
        }
    }

writetofile()方法的详细信息。

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()
    }
}

createworkbook方法的详细信息。

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
    }

我遇到以下错误。请建议我出错的地方。谢谢!

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文