我应该使用内部还是外部存储在我的 Android 应用程序中创建 csv,然后我想通过电子邮件共享?

问题描述 投票:0回答:1

我正在开发一个应用程序,它可以捕获传感器数据,然后我想通过 CSV 导出这些数据。 我是 Android 新手,还不够了解,无法决定执行此操作的最佳方法。我也一直被许可问题绊倒——我认为这与不理解我应该如何做的最佳实践有关。 我想在运行应用程序的设备之外共享数据以进行进一步分析,以便可以使用基于 Web 的应用程序(例如 Google、Excel 等)对其进行操作。

谢谢

我尝试过使用内部和外部存储,但由于各种类型的缺乏权限例外,我在将 .csv 文件附加到电子邮件时遇到了问题。

我想捕获数据(可以做到这一点)。编写 CSV(可以这样做)。并使用选择器通过意图(努力)共享 CSV,以便用户可以通过他们选择的电子邮件平台发送它。

android export-to-csv
1个回答
0
投票

在我的应用程序中,我使用以下代码

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_settings)
    // other code
    //
    setExportCsvSearchActivityResultLauncher()


fun setExportCsvSearchActivityResultLauncher() {
    // You can do the assignment inside onAttach or onCreate, i.e, before the activity is displayed
    exportCsvSearchActivityResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult(),
        object : ActivityResultCallback<ActivityResult?> {
            override fun onActivityResult(result: ActivityResult?) {
                if (result!!.resultCode == RESULT_OK) {
                    // There are no request codes
                    val resultData = result.data
                    // doSomeOperations();
                    csvTreeUri = null
                    //
                    if (resultData != null) {
                        csvTreeUri = Objects.requireNonNull(resultData).data
                        val outputFolder = DocumentFile.fromTreeUri(context, csvTreeUri!!)
                        //
                        if ((isStoragePermissionGranted) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU))
                        // if the version code >= TIRAMISU (version 33 = Android 13)
                        // you don't need to ask for StoragePermission
                        {
                            Images.exporttoCsv(context, realm)
                            // other code
                            assert(outputFolder != null)
                            //
                            try {
                                copyFileFromInternalToSharedStorage(
                                    context,
                                    outputFolder!!,
                                    "images.csv"
                                )
                // other code
                            } catch (e: IOException) {
                                e.printStackTrace()
                            }
                            //
                        }
                        // view the fragment settings initializing MenuSettingsFragment (FragmentTransaction
                        // switch between Fragments).
                        // other code
                    }
                }
            }
        })
}

@Throws(IOException::class)
@JvmStatic
fun copyFileFromInternalToSharedStorage(context:Context, outputFolder: DocumentFile, destFileName: String?) {
    val sourceStream: InputStream = context.openFileInput(destFileName)
    val documentFileNewFile = outputFolder.createFile("text/csv", destFileName!!)!!
    val destStream = context.contentResolver.openOutputStream(
        documentFileNewFile.uri
    )
    val buffer = ByteArray(1024)
    var read: Int
    while (sourceStream.read(buffer).also { read = it } != -1) {
        destStream!!.write(buffer, 0, read)
    }
    destStream?.close()
    sourceStream.close()
}
© www.soinside.com 2019 - 2024. All rights reserved.