Android ContentResolver openInputStream是否由于权限而抛出FileNotFoundException?

时间:2018-06-19 12:07:43

标签: java android react-native react-native-fs

我正在使用react-native构建应用程序,但遇到了一个奇怪的错误。我正在使用一个名为react-native-fs的react本机库来读取文件系统上的音频文件,但是该插件似乎无法对任何音频文件进行操作,尽管它适用于文本文件。我在Android Studio中调试了我的android应用,并将错误跟踪到以下功能:

private InputStream getInputStream(String filepath) throws IORejectionException 
{
    Uri uri = getFileUri(filepath);
    InputStream stream;
    try 
    {
        stream = reactContext.getContentResolver().openInputStream(uri);
    } 
    catch (FileNotFoundException ex) 
    {
        throw new IORejectionException("ENOENT", "ENOENT: no such file or directory, open '" + filepath + "'");
    }

    if (stream == null) 
    {
        throw new IORejectionException("ENOENT", "ENOENT: could not open an input stream for '" + filepath + "'");
    }

    return stream;
}

具体来说,当filePath参数指向音频文件(例如.wav文件)时,openInputStream方法将抛出FileNotFoundException,而当指向相同位置的文本文件时,则不会抛出FileNotFoundException。我已经确保我具有WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,并且我已请求Android 23+的权限。而且我也确定文件确实存在。这是我的监视窗口的屏幕截图,其中显示了确切的错误以及音频文件和文本文件的存在检查结果:

Debug Window

具体来说,该异常将引发以下行:

  

stream = reactContext.getContentResolver()。openInputStream(uri);

这是FileNotFoundException的完整堆栈跟踪:

libcore.io.IoBridge.open(IoBridge.java:452), 
java.io.FileInputStream.<init>(FileInputStream.java:76),
java.io.FileInputStream.<init>(FileInputStream.java:103),
android.content.ContentResolver.openInputStream(ContentResolver.java:660),
com.rnfs.RNFSManager.getInputStream(RNFSManager.java:101),
com.rnfs.RNFSManager.readFile(RNFSManager.java:214), 
java.lang.reflect.Method.invoke(Native Method),
com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372),
com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:160),
com.facebook.react.bridge.queue.NativeRunnable.run(Native Method),
android.os.Handler.handleCallback(Handler.java:739),
android.os.Handler.dispatchMessage(Handler.java:95),
com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:29), 
android.os.Looper.loop(Looper.java:148), com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:    192), 
java.lang.Thread.run(Thread.java:818)

任何帮助将不胜感激。谢谢

0 个答案:

没有答案