Export Room database and attach to email Android Kotlin(导出房间数据库并附加到Android Kotlin电子邮件)
本文介绍了导出房间数据库并附加到Android Kotlin电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下代码,用于导出聊天室数据库,然后将其附加到电子邮件。当前,用户必须首先选择数据的保存位置,然后才能附加数据。是否有一种方法可以在不先询问用户将数据库保存到何处的情况下执行此操作?
以下是我的代码:
fun exportDatabase() {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
intent.type = "*/*" // this line is a must when using ACTION_CREATE_DOCUMENT
startActivityForResult(
intent,
DATABASE_EXPORT_CODE
)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
DATABASE_EXPORT_CODE -> {
val userChosenUri = data?.data
val inStream = getDatabasePath("app_database").inputStream()
val outStream = userChosenUri?.let { contentResolver.openOutputStream(it) }
inStream.use { input ->
outStream.use { output ->
output?.let { input.copyTo(it) }
Toast.makeText(this, "Data exported successfully", Toast.LENGTH_LONG).show()
val emailIntent = Intent(Intent.ACTION_SEND)
//Set type to email
emailIntent.type = "vnd.android.cursor.dir/email"
var toEmail: String = "whatever@gmail.com"
emailIntent.putExtra(Intent.EXTRA_EMAIL, toEmail)
emailIntent.putExtra(Intent.EXTRA_STREAM, userChosenUri)
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Data for Training Log")
startActivity(Intent.createChooser(emailIntent, "Send Email"))
}
}
}
else ->
Log.d("D001", "onActivityResult: unknown request code")
}
}
推荐答案
您需要使用FileProvider。但是FileProvider
不支持直接传输数据库文件(Check here)。
这可以通过以下方式处理:
解决方案1:
创建支持复制数据库文件的自定义FileProvider
类:
class DBFileProvider : FileProvider {
fun getDatabaseURI(c: Context, dbName: String?): Uri? {
val file: File = c.getDatabasePath(dbName)
return getFileUri(c, file)
}
private fun getFileUri(context: Context, file: File): Uri? {
return getUriForFile(context, "com.android.example.provider", file)
}
}
并请求清单中的FileProvider
:
<application>
....
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.android.example.provider"
android:exported="false"
android:enabled="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
并在resxml
下创建provider_paths
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path
name="databases"
path="../" />
</paths>
然后通过电子邮件发送此数据库文件:
public static void backupDatabase(AppCompatActivity activity) {
Uri uri = new DBFileProvider().getDatabaseURI(activity, "app_database.db");
sendEmail(activity, uri);
}
private fun sendEmail(activity: AppCompatActivity, attachment: Uri) {
val emailIntent = Intent(Intent.ACTION_SEND)
//Set type to email
emailIntent.type = "vnd.android.cursor.dir/email"
val toEmail = "whatever@gmail.com"
emailIntent.putExtra(Intent.EXTRA_EMAIL, toEmail)
emailIntent.putExtra(Intent.EXTRA_STREAM, attachment)
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Data for Training Log")
activity.startActivity(Intent.createChooser(emailIntent, "Send Email"))
}
解决方案2:
将数据库文件复制到临时文件到FileProvider
Like支持的目录filesDir
:
- 使用
getDatabasePath
获取数据库文件 - 将数据库文件复制到
FileProvider
支持的存储目录 - 使用
FileProvider
创建新复制文件的URI
fun backupDatabase(activity: AppCompatActivity) {
// Get the database file
val dbFile = activity.getDatabasePath("app_database.db")
try {
// Copy database file to a temp file in (filesDir)
val parent = File(activity.filesDir, "databases_temp")
val file = File(parent, "myDatabase")
dbFile.copyTo(file)
// Get Uri of the copied database file from filesDir to be used in email intent
val uri = getUri(activity.applicationContext, file)
// Send an email
sendEmail(activity, uri)
} catch (e: IOException) {
e.printStackTrace()
}
}
private fun getUri(context: Context, file: File): Uri {
var uri = Uri.fromFile(file)
// Using FileProvider for API >= 24
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(
context,
"com.android.example.provider", file
)
}
return uri
}
使用与解决方案1相同的清单,并使用创建的临时目录调整resxml
下的provider_paths
:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path
name="databases_temp"
path="/" />
</paths>
nb:在这两个解决方案中,请根据您的需要调整包名称。
这篇关于导出房间数据库并附加到Android Kotlin电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:导出房间数据库并附加到Android Kotlin电子邮件
基础教程推荐
猜你喜欢
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01