Android(Kotlin):用于共享mp3文件的FileProvider

发布于 2025-01-31 01:35:59 字数 2780 浏览 4 评论 0原文

我正在编码一个在卡视图中显示一些MP3文件的应用程序,并且正在尝试设置一个“共享”按钮将文件发送到其他应用程序。我正在使用fileprovider。我设法分享了文本,但是我无法使用文件。我正在使用构造函数访问我的外部存储中的所有MP3文件,它们不是存储在Android Studio中的“ RAW”文件夹中的MP3。

inner class MySongAdapter : BaseAdapter {
    private val authorities = "com.example.loadmedia_sdcard_demo.fileprovider"
    private lateinit var mainAudio: File
    var myListSong = ArrayList<SongInfo>()
    constructor(myListSong: ArrayList<SongInfo>) : super() {
        this.myListSong = myListSong
    }

    override fun getView(position: Int, p1: View?, p2: ViewGroup?): View {
        var myview = layoutInflater.inflate(R.layout.mylayout, null)
        var song : SongInfo = myListSong[position]
        myview.textView1.text = song.Title
        myview.textView2.text = song.Author

        myview.share_button.setOnClickListener {
            val path = FileProvider.getUriForFile(this@MainActivity, authorities, mainAudio)

            val shareIntent = Intent()
            shareIntent.action = Intent.ACTION_SEND
            shareIntent.putExtra(Intent.EXTRA_STREAM, path)
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            shareIntent.type = "audio/*"
            startActivity(Intent.createChooser(shareIntent, "Share..."))
        }

问题是在Val路径内部,它要求文件。

val path = FileProvider.getUriForFile(this@MainActivity, authorities, mainAudio) // here is the problem

对如何做的任何想法吗?非常感谢。

编辑:

堆栈跟踪:

D/AndroidRuntime:关闭VM E/Androidruntime:致命例外:主要 过程:com.example.loadmedia_sdcard_demo,pid:21603 kotlin.nitializationpropertyaccessexception:lateinit属性Mainaudio尚未初始化 在com.example.loadmedia_sdcard_demo.mainactivity $ mysongadapter.getView $ lambda-0(mainActivity.kt:61) 在com.example.loadmedia_sdcard_demo.mainactivity $ mysongadapter。$ r8 $ lambda $ hlrnjvjsvoebk3bd6bd6ex7opsto8m(未知来源:0) 在com.example.example.loadmedia_sdcard_demo.mainactivity $ mysongadapter $$ externalsyntheticlambda0.onclick(未知来源:4) at android.view.view.performClick(view.java:7125) 在com.google.android.material.button.materialbutton.performclick(Matersbutton.java:1194) at android.view.view.performclickinternal(view.java:7102) at android.view.view.access $ 3500(view.java:801) at android.view.view $ persilClick.run(view.java:27336) 在Android.os.handler.handlecallback(Handler.java:883) 在Android.os.handler.dispatchMessage(Handler.java:100) at android.os.looper.loop(looper.java:214) at android.app.activitythread.main(activityThread.java:7356) 在java.lang.reflect.method.invoke(本机方法)上 在com.android.internal.os.os.runtimeinit $ methodAndargScaller.run(runtimeinit.java:492) 在com.android.internal.os.os.zygoteinit.main(zygoteinit.java:930) I/过程:发送信号。 PID:21603 SIG:9

详细问题:我正在尝试与电报共享一个MP3文件。当我单击“共享”按钮时,应用程序崩溃。

I am coding an app that shows some mp3 files in a card view and I am trying to set a "Share" button to send the files to other apps, one by one. I am using FileProvider. I managed to share a text, but I can't do it with my files. I am accessing all the mp3 files in my external storage with a constructor, they are not mp3 stored in a "raw" folder in Android Studio.

inner class MySongAdapter : BaseAdapter {
    private val authorities = "com.example.loadmedia_sdcard_demo.fileprovider"
    private lateinit var mainAudio: File
    var myListSong = ArrayList<SongInfo>()
    constructor(myListSong: ArrayList<SongInfo>) : super() {
        this.myListSong = myListSong
    }

    override fun getView(position: Int, p1: View?, p2: ViewGroup?): View {
        var myview = layoutInflater.inflate(R.layout.mylayout, null)
        var song : SongInfo = myListSong[position]
        myview.textView1.text = song.Title
        myview.textView2.text = song.Author

        myview.share_button.setOnClickListener {
            val path = FileProvider.getUriForFile(this@MainActivity, authorities, mainAudio)

            val shareIntent = Intent()
            shareIntent.action = Intent.ACTION_SEND
            shareIntent.putExtra(Intent.EXTRA_STREAM, path)
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            shareIntent.type = "audio/*"
            startActivity(Intent.createChooser(shareIntent, "Share..."))
        }

The problem is inside val path, it is requesting a file.

val path = FileProvider.getUriForFile(this@MainActivity, authorities, mainAudio) // here is the problem

Any idea of how to do it? Thank you very much.

Edit:

Stack Trace:

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.loadmedia_sdcard_demo, PID: 21603
kotlin.UninitializedPropertyAccessException: lateinit property mainAudio has not been initialized
at com.example.loadmedia_sdcard_demo.MainActivity$MySongAdapter.getView$lambda-0(MainActivity.kt:61)
at com.example.loadmedia_sdcard_demo.MainActivity$MySongAdapter.$r8$lambda$hlRnJvjsvoebk3BD6eX7OpstO8M(Unknown Source:0)
at com.example.loadmedia_sdcard_demo.MainActivity$MySongAdapter$$ExternalSyntheticLambda0.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:7125)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process: Sending signal. PID: 21603 SIG: 9

Problem in detail: I am trying to share an mp3 file with, for instance, Telegram. When I click the "Share" button the app crashes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

强辩 2025-02-07 01:35:59
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.loadmedia_sdcard_demo, PID: 21603 kotlin.UninitializedPropertyAccessException: lateinit property mainAudio has not been initialized at com.example.loadmedia_sdcard_demo.MainActivity$MySongAdapter.getView$lambda-0(MainActivity.kt:61)

您将mainaudio声明为:

private lateinit var mainAudio: File

它之前,您从未为其分配值

val path = FileProvider.getUriForFile(this@MainActivity, authorities, mainAudio)

但是,在尝试使用 否则,您将获得此例外。

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.loadmedia_sdcard_demo, PID: 21603 kotlin.UninitializedPropertyAccessException: lateinit property mainAudio has not been initialized at com.example.loadmedia_sdcard_demo.MainActivity$MySongAdapter.getView$lambda-0(MainActivity.kt:61)

You declared mainAudio as:

private lateinit var mainAudio: File

However, you never assigned a value to it, before you tried using it here:

val path = FileProvider.getUriForFile(this@MainActivity, authorities, mainAudio)

You need to assign a value to a lateinit var before you try using it, otherwise you will get this exception.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文