关于
本篇主要实现基于Android12手机实现保存日志文件到应用专属文件夹内及分享日志文件功能(使用系统自带)
效果图
实现
首先是google官网的介绍。首先我们需要再res/下新建一个xml文件夹file_provider_paths.xml
,然后新建一个路径xml文件为后续申明的provider使用:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="." />
</paths>
然后我们需要再AndroidManifest.xml文件里面添加provider:
<application>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
</application>
编写日志文件帮助object
object ShareLogUtil {
//获取日志文本
fun getLogFile(name:String,context: Context):File{
//这里获取的是app内部文件路径
val file = File("${context.filesDir}/log")
if (!file.exists()){
file.mkdir()
}
if (!hasFile(file.path)){
///data/user/0/com.xxx.xxx/files/log/bleLog.txt
val logFile = File("${file.path}/bleLog.txt")
if (!logFile.exists()){
try {
logFile.createNewFile()
}catch (e: Exception){
e.printLog()
}
}
return logFile
}else{
return File("${context.filesDir}/log/bleLog.txt")
}
}
//判断路径下是否还有file
private fun hasFile(filePath:String):Boolean{
val file = File(filePath)
return file.list().isNotEmpty()
}
//todo 保存消息日志
fun setMessage(message: String,context: Context){
val fos = FileOutputStream("${context.filesDir}/log/bleLog.txt")
fos.write(message.toByteArray())
fos.close()
}
}
主界面使用
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//新建日志文件
ShareLogUtil.getLogFile(this)
ShareLogUtil.setMessage("sss",this)
}
补充
当我把日志文件分享完后,没有关闭掉QQ页面,后面继续分享这个文件,会有一个bug:分享的还是第一次分享的文件,每次分享完都要把QQ分享的页面杀掉才行。
补充二
忘记贴系统自带分享功能代码了。。
binding.btnShare.setOnSingleClickListener {
val intent = Intent(Intent.ACTION_SEND)
intent.type = "text/plain"
val logFile = File("${context.filesDir}/log/bleLog.txt")
val contentUri: Uri = getUriForFile(this, "$packageName.provider", logFile)
intent.putExtra(Intent.EXTRA_STREAM,contentUri)
val shareIntent = Intent.createChooser(intent,"Share")
//解决报no permission denied错误
val resInfoList = this.packageManager.queryIntentActivities(
shareIntent,
PackageManager.MATCH_DEFAULT_ONLY
)
for (resolveInfo in resInfoList) {
val packageName = resolveInfo.activityInfo.packageName
grantUriPermission(
packageName,
contentUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
startActivity(shareIntent)
}
本篇到此结束了,有问题欢迎批评指正,觉得不错的也请点个赞,谢谢