无法打开文件(权限被拒绝)

7

我正在尝试通过Android的MediaRecorder类记录音频,将其保存到文件中,然后使用MediaPlayer播放它。

下面是我选择要保存音频文件的位置:

currentDate = Calendar.getInstance().getTime();
condensedDate = currentDate.toString().replaceAll("\\s", "")
fileName = getExternalCacheDir().getAbsolutePath();
fileName += File.separator + condensedDate + ".3gp";

这里我将其设置为MediaRecorder的输出文件。

Recorder.setOutputFile(fileName);

接下来,在另一个Activity中,我使用MediaPlayer播放该音频文件:

MediaPlayer player = new MediaPlayer();
try {
     player.setDataSource(fileName);
     player.prepare();
     player.start();
} catch (IOException e) {
        e.printStackTrace();
}

这是问题开始的地方,没有任何声音,以下是我的日志记录:
09-09 14:31:38.887 1522-26066/? E/FileSource: Failed to open file '/storage/emulated/0/Android/data/com.mycompany.dbmeter.pro/cache/SunSep0914:31:19GMT+00:002018.3gp'. (Permission denied)
09-09 14:31:38.887 1522-26066/? E/GenericSource: Failed to create data source!
09-09 14:31:38.887 25996-26064/com.mycompany.dbmeter.pro E/MediaPlayerNative: error (1, -2147483648)

这很奇怪,因为我按照官方示例代码的步骤进行操作,示例代码可以在这里找到。
我尝试按照这篇Stack Overflow文章中的建议,将文件设置为全局可读模式。
我还尝试了这里提出的建议,但是没有任何改变。
我做错了什么?

你的 AndroidManifest 中是否有包含 READ_EXTERNAL_STORAGE,并且在应用程序中已经允许了此权限?这似乎是导致权限问题的原因。 - Beginner
不,我没有,但我觉得我不需要它,因为我可以在那里保存和读取其他文件,而没有任何问题... 此外,现在它可以工作了... 你有什么想法,为什么那个文件名会导致问题?(请看我的回答) - Michele
2个回答

5

我解决了这个问题,由于我使用的文件名出现了错误导致了这个问题。

以前我会获得一个日期,将其转换为字符串并消除所有空格; 就像这样:

SunSep0914:31:19GMT+00:002018.3gp

现在,在调试我的应用程序时,我将其更改为test.3gp,它像魅力一样工作...


我遇到了同样的问题,你的解决方案可行,但我仍然想在我的文件名中使用 “:”,你最终找到了另一个解决方案吗? - Marcola Carr
2
我最终将“:”更改为“-”,因为这是我需要做的最简单的解决方案。我认为“:”可能是那些您无法在文件名中使用的字符之一。 - Michele
1
刚刚发现在华为P20上也有同样的问题。在我测试的其他设备(Galaxy、Pixel、小米)中没有任何问题,只有在华为上出现了问题。知道在华为中不能使用冒号:作为文件名会更好。 - Maverick Meerkat

0

我有录制音频的权限,但没有写入外部存储的权限。在那个示例中,他们没有使用写入外部存储的权限,即使我尝试将文件保存在我的应用程序专用目录getFilesDir()中,我仍然会遇到相同的错误 - 在这里我绝对不需要写入外部存储的权限。 - Michele
如果我错了,请纠正我!你的应用程序目录不是存在于你的手机存储中吗?此外,在Android 6.0以上版本中,你必须在运行时检查权限。 - Sambit Mallick
我在运行时检查记录音频权限。该目录存在,因为我使用它来正确存储和检索其他内容。 - Michele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接