Android实现保存日志到内部存储及分享日志文件功能

Android实现保存日志到内部存储及分享日志文件功能

关于

  本篇主要实现基于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)
        }

  本篇到此结束了,有问题欢迎批评指正,觉得不错的也请点个赞,谢谢

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪の星空朝酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值