简体   繁体   English

Android (Kotlin): FileProvider 共享 mp3 文件

[英]Android (Kotlin): FileProvider to share mp3 file

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.我正在编写一个在卡片视图中显示一些 mp3 文件的应用程序,并且我正在尝试设置一个“共享”按钮以将文件一个一个地发送到其他应用程序。 I am using FileProvider.我正在使用 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.我正在使用构造函数访问外部存储中的所有 mp3 文件,它们不是存储在 Android Studio 的“原始”文件夹中的 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..."))
        }

The problem is inside val path, it is requesting a file.问题出在 val 路径中,它正在请求一个文件。

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 D/AndroidRuntime:关闭 VM E/AndroidRuntime:致命异常:主进程:com.example.loadmedia_sdcard_demo,PID:21603 kotlin.UninitializedPropertyAccessException:lateinit 属性 mainAudio 尚未在 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来源:4) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194) 在 android.view.View.performClick(View.java:7125) 在 android.view.View.performClickInternal(View .java:7102) 在 android.view.View.access$3500(View.java:801) 在 android.view.View$PerformClick.run(View.java:27336) 在 android.os.Handler.handleCallback(Handler.java :883) 在 android.os.Handler.dispatchMessage(Handler.java:100) 在 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. .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:发送信号。 PID: 21603 SIG: 9 PID:21603 SIG:9

Problem in detail: I am trying to share an mp3 file with, for instance, Telegram.详细问题:我正在尝试与例如 Telegram 共享一个 mp3 文件。 When I click the "Share" button the app crashes.当我单击“共享”按钮时,应用程序崩溃。

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:您将mainAudio声明为:

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.在尝试使用它之前,您需要为lateinit var分配一个值,否则您将收到此异常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM