文件选择器意图导致应用程序在选择一个文件时崩溃
File Chooser intent causes app to crash when selecting one file
正如问题的名称所暗示的那样,我在意图文件选择器中遇到了一个奇怪的错误。
我的意图允许我 select 多个文件。当我 select 多个文件时,应用程序不会崩溃。都很好。我可以播放 selected 的所有文件。但是,当我 select 一个文件时,它会崩溃并出现一个奇怪的异常(可能是空数据?)。
看,我实现了一个歌曲列表(它是一个 Uri 类型的可变列表)。它应该接收意图返回的 Uri 并添加到它。
提前致谢。
Intent 调用和 ActivityResult 的代码如下。
意图调用
fun onMusicFileChooserClicked(v: View) {
val intent = Intent()
.setType("audio/*")
.setAction(Intent.ACTION_GET_CONTENT)
.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
startActivityForResult(Intent.createChooser(intent, "Select a file"), 111)
}
活动结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 111 && resultCode == RESULT_OK) {
for (i in 0 until data?.clipData!!.itemCount) {
val uri = data?.clipData?.getItemAt(i)?.uri
songlist.add(uri)
}
selectfilesucess = true
updateMetaData()
}
}
日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: kalves.multimediacenter, PID: 19399
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=Intent { dat=content://com.android.externalstorage.documents/document/86BD-1E10:DCIM/Camera/03. Do What I Gotta Do.mp3 flg=0x1 launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } }} to activity {kalves.multimediacenter/kalves.multimediacenter.MainActivity}: kotlin.KotlinNullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:4560)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4603)
at android.app.ActivityThread.-wrap22(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6836)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Caused by: kotlin.KotlinNullPointerException
at kalves.multimediacenter.MainActivity.onActivityResult(MainActivity.kt:179)
at android.app.Activity.dispatchActivityResult(Activity.java:7274)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4556)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4603)
at android.app.ActivityThread.-wrap22(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6836)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
解决了。
问题是我没有检查空指针。基本上,我必须检查 clipdate == null,如果为真,则它是一个文件。如果不是,它是多个文件。
傻我。希望这对某人有所帮助。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 111 && resultCode == RESULT_OK && data!=null) {
val clipdata = data.clipData
if(clipdata!=null){
for (i in 0 until data?.clipData!!.itemCount) {
val uri = data?.clipData?.getItemAt(i)?.uri
songlist.add(uri)
}
}else{
val uri = data?.data
songlist.add(uri)
}
}
正如问题的名称所暗示的那样,我在意图文件选择器中遇到了一个奇怪的错误。 我的意图允许我 select 多个文件。当我 select 多个文件时,应用程序不会崩溃。都很好。我可以播放 selected 的所有文件。但是,当我 select 一个文件时,它会崩溃并出现一个奇怪的异常(可能是空数据?)。 看,我实现了一个歌曲列表(它是一个 Uri 类型的可变列表)。它应该接收意图返回的 Uri 并添加到它。 提前致谢。
Intent 调用和 ActivityResult 的代码如下。
意图调用
fun onMusicFileChooserClicked(v: View) {
val intent = Intent()
.setType("audio/*")
.setAction(Intent.ACTION_GET_CONTENT)
.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
startActivityForResult(Intent.createChooser(intent, "Select a file"), 111)
}
活动结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 111 && resultCode == RESULT_OK) {
for (i in 0 until data?.clipData!!.itemCount) {
val uri = data?.clipData?.getItemAt(i)?.uri
songlist.add(uri)
}
selectfilesucess = true
updateMetaData()
}
}
日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: kalves.multimediacenter, PID: 19399
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=Intent { dat=content://com.android.externalstorage.documents/document/86BD-1E10:DCIM/Camera/03. Do What I Gotta Do.mp3 flg=0x1 launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } }} to activity {kalves.multimediacenter/kalves.multimediacenter.MainActivity}: kotlin.KotlinNullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:4560)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4603)
at android.app.ActivityThread.-wrap22(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6836)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Caused by: kotlin.KotlinNullPointerException
at kalves.multimediacenter.MainActivity.onActivityResult(MainActivity.kt:179)
at android.app.Activity.dispatchActivityResult(Activity.java:7274)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4556)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4603)
at android.app.ActivityThread.-wrap22(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6836)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
解决了。
问题是我没有检查空指针。基本上,我必须检查 clipdate == null,如果为真,则它是一个文件。如果不是,它是多个文件。 傻我。希望这对某人有所帮助。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 111 && resultCode == RESULT_OK && data!=null) {
val clipdata = data.clipData
if(clipdata!=null){
for (i in 0 until data?.clipData!!.itemCount) {
val uri = data?.clipData?.getItemAt(i)?.uri
songlist.add(uri)
}
}else{
val uri = data?.data
songlist.add(uri)
}
}