android - AssetManager.openFd(filename) 返回 null
问题描述
那是我的代码。我在 getAssets()?.openFd(sf.path) 上得到 FileNotFoundException?但是这个文件存在!
fun addSong(sf: File){
val fd0 = context?.getAssets()?.openFd(sf.path)?.getFileDescriptor()
val mmr = MediaMetadataRetriever()
mmr.setDataSource(fd0)
val s = Song()
s.file = sf
s.album = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM)
allsongs = allsongs.plusElement(s)
}
class Song{
var file: File? = null
var album: String
}
这是堆栈跟踪
E/AndroidRuntime: FATAL EXCEPTION: main
Process: filodev.com.musicplayer, PID: 21382
java.lang.RuntimeException: Unable to start activity ComponentInfo{filodev.com.musicplayer/filodev.com.musicplayer.MainActivity}: java.io.FileNotFoundException: filename
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2830)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2905)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1606)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:169)
at android.app.ActivityThread.main(ActivityThread.java:6595)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.io.FileNotFoundException: filename
at android.content.res.AssetManager.openAssetFd(Native Method)
at android.content.res.AssetManager.openFd(AssetManager.java:390)
at filodev.com.musicplayer.FileFinder.addSong(FileFinder.kt:54)
at filodev.com.musicplayer.FileFinder.startFind(FileFinder.kt:48)
at filodev.com.musicplayer.FileFinder.startFind(FileFinder.kt:43)
at filodev.com.musicplayer.FileFinder.startFind(FileFinder.kt:43)
at filodev.com.musicplayer.FileFinder.startFind(FileFinder.kt:43)
at filodev.com.musicplayer.FileFinder.find(FileFinder.kt:34)
at filodev.com.musicplayer.MainActivity.checkPermission(MainActivity.kt:35)
at filodev.com.musicplayer.MainActivity.onCreate(MainActivity.kt:23)
at android.app.Activity.performCreate(Activity.java:7016)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2783)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2905)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1606)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:169)
at android.app.ActivityThread.main(ActivityThread.java:6595)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
我已经在清单中添加了外部存储读写权限。如果文件存在,为什么我会收到此异常?
解决方案
资产是开发机器上的文件。它们不是设备上的文件。
如果sf
确实是File
指向设备文件系统上的文件,请使用setDataSource(sf.getAbsolutePath())
.
推荐阅读
- sql - 如何读取一个表并在另一个表中插入不同的值
- powerbuilder - 如何以编程方式在 Powerbuilder 中单击 Enter 键
- java - 无法使用 AES 服务器端加密将对象上传到 S3
- java - 通过 Hibernate JPA 连接到 MySQL
- debugging - 自 v.15.7.1 升级以来的 Visual Studio“无需调试即可启动”问题
- intellij-idea - 如何在 Intellij 中构建一个包?
- c++ - 带有正则表达式的c ++中的错误
- php - Laravel与多个表的关系
- javascript - VueJS 2 - 无法在 App.vue 文件中使用导入文件中的变量
- php - 多行文本框到多记录插入MYSQL PHP