AssetManager.openFd(filename)返回null

时间:2018-09-04 11:08:13

标签: android kotlin

那是我的代码。我在getAssets()上得到FileNotFoundException?.openFd(sf.path)?但是该文件存在!

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) 

我已经在清单中添加了外部存储的读写权限。 如果文件存在,为什么会出现此异常?

1 个答案:

答案 0 :(得分:1)

资产是开发计算机上的文件。它们不是设备上的文件。

如果sf确实是指向设备文件系统上文件的File,请使用setDataSource(sf.getAbsolutePath())