【问题标题】:Failed to open file (Permission denied)打开文件失败(权限被拒绝)
【发布时间】:2018-09-09 14:50:05
【问题描述】:

我正在尝试通过 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)

这很奇怪,因为我一步步跟着官方的示例代码,可以找到here。

我尝试按照in this stack overflow post 的建议使文件世界可读。

我也尝试了here 的建议,但没有任何改变。

我做错了什么?

【问题讨论】:

  • 您的清单中是否有READ_EXTERNAL_STORAGE,您是否允许在您的应用中使用它?似乎这是许可的原因
  • 不,我不需要,但我认为我不需要它,因为我在那里保存和读取其他文件没有任何问题。此外,现在它可以工作了。知道为什么该文件名可能有导致问题? (见我自己的答案)

标签: android android-mediaplayer mediarecorder


【解决方案1】:

我解决了这个问题,由于某种原因,我使用的文件名导致了该错误。

我曾经获取一个日期,将其转换为字符串并消除所有空格;像这样:

SunSep0914:31:19GMT+00:002018.3gp

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

【讨论】:

  • 我遇到了同样的问题,您的解决方案有效,但我仍然想在我的文件名中使用“:”,您最终找到了其他解决方案吗?
  • 我最终将“:”更改为“-”,因为这是我需要做的最简单的解决方案。我认为“:”可能是您不能在文件名中使用的字符之一
  • 刚刚在华为P20中发现了同样的情况。我仅在华为测试过的任何其他设备(Galaxy、Pixel、Xiomi)都没有问题。很高兴知道您不能在华为中使用冒号 : 作为文件名。
【解决方案2】:

您是否在清单文件中添加了权限

<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

来源:https://developer.android.com/guide/topics/media/mediarecorder

【讨论】:

  • 我有录制音频的权限,但没有写入外部存储的权限。在该示例中,他们不使用写入外部存储的权限,即使我尝试将文件保存在我的应用程序私有的目录中,我也会遇到相同的错误 - getFilesDir() - 我绝对不需要写入外部存储的权限存储
  • 如果我错了,请纠正我!您的手机存储中不存在您的应用程序目录的私有吗?此外,在 android 6.0 以上,您必须在运行时检查权限。
  • 我在运行时检查录制音频权限。该目录存在是因为我使用它来正确存储和检索其他内容
猜你喜欢
  • 1970-01-01
  • 2017-07-10
  • 2017-09-17
  • 2012-09-07
  • 2020-11-29
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多