我正在开发一个应用程序,它可以捕获传感器数据,然后我想通过 CSV 导出这些数据。 我是 Android 新手,还不够了解,无法决定执行此操作的最佳方法。我也一直被许可问题绊倒——我认为这与不理解我应该如何做的最佳实践有关。 我想在运行应用程序的设备之外共享数据以进行进一步分析,以便可以使用基于 Web 的应用程序(例如 Google、Excel 等)对其进行操作。
谢谢
我尝试过使用内部和外部存储,但由于各种类型的缺乏权限例外,我在将 .csv 文件附加到电子邮件时遇到了问题。
我想捕获数据(可以做到这一点)。编写 CSV(可以这样做)。并使用选择器通过意图(努力)共享 CSV,以便用户可以通过他们选择的电子邮件平台发送它。
在我的应用程序中,我使用以下代码
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()
}