【问题标题】:myFile.exists() not working logically in AndroidmyFile.exists() 在 Android 中无法正常工作
【发布时间】:2012-12-19 05:40:12
【问题描述】:

我有一段代码用于检查 mp3 文件是否存储在 MediaStore.Audio.Media 内容提供商的 SD 卡中

问题在于,无论情况如何。 SD卡上是否存在路径名存储在变量“audioFilename”中的文件。它总是返回“此文件不存在”作为结果。尽管变量 audioFilename 中存储了字符串路径名“/mnt/sdCard/Music/Jungle.mp3”,但这个 MP3 文件实际上是在 SD 卡上。通过 Toast 消息和检查 SD 卡内容很容易证明。

我可能在使用 File 或 Environment 类时出错。任何人都可以在此处显示的代码中看到问题吗?

 // toast message to prove that the audioFilename is not null,
 // message displayed is the string, "File name: /mnt/sdCard/Music/Jungle.mp3"

 Toast.makeText(Editor.this, "File name: " + audioFilename,
 Toast.LENGTH_LONG).show();

 // the code below always returns "this file does not exist"

 File extStore = Environment.getExternalStorageDirectory();
 File myFile = new File(extStore.getAbsolutePath() + "audioFilename");

 if(myFile.exists()){

 Toast.makeText(Editor.this, "<<<< this file exists, it is: "+audioFilename+" >>>>",
 Toast.LENGTH_LONG).show();

 } else if(!myFile.exists()){

 Toast.makeText(Editor.this, "<<<< this file does not exist >>>> ",
 Toast.LENGTH_LONG).show();
 }

 Toast.makeText(Editor.this, "audio file name is: "+ audioFilename,
 Toast.LENGTH_LONG).show();

【问题讨论】:

  • 尝试让第一个 Toast 显示正在检查的实际位置,而不是您期望的位置。不要敬酒 "File name: " + audioFilename 而是敬酒 extStore.getAbsolutePath() + "audioFilename"
  • 感谢您的回复。我在我的 Toast 消息中尝试了这个,它确实帮助我弄清楚了为什么我的代码不起作用。如果没有这个,我将无法清楚地看到问题的原因。

标签: android file file-io android-contentprovider


【解决方案1】:

你确定有 import java.io.File 吗?

尝试:

String pathsd = Environment.getExternalStorageDirectory()+"/";
// so var pathsd will return "/mnt/sdcard/"
// then you must sure var audioFilename is Music/Jungle.mp3
File myFile = new File(pathsd + audioFilename);

或者你确定你的路径?如果你不确定你可以尝试直接给出字符串路径。

File myFile = new File("/mnt/sdCard/Music/Jungle.mp3");

【讨论】:

  • 这是我认为问题所在的方向。我不确定我是否正确使用了文件构造函数“extStore.getAbsolutePath() + audioFilename”部分我不太明白。我会试试这个,看看它是否有效。 "文件("/mnt/sdCard/Music/Jungle.mp3");"
  • 嗯,如果你想获取路径sdcard,你可以使用Environment.getExternalStorageState(),所以会返回/mnt/sdcard所以你可以试试,例子文件有/mnt/sdcard/tes.mp3 : 字符串路径d = Environment.getExternalStorageState()+"/";字符串文件名 = "tes.mp3"; File myFile = new File(pathsd+filename);或字符串路径d =“/mnt/sdcard/”;字符串文件名 = "tes.mp3"; File myFile = new File(pathsd+filename);
  • 您回复的第二部分是正确的。我给了你一个赞成票。 Pratik 上面的回答直接谈到了问题的原因。如你所说。 File myFile = new File("/mnt/sdCard/Music/Jungle.mp3");将字符串或字符串变量直接放在那里效果很好,没有添加“exStore.getAbsolutePath()”。
【解决方案2】:

尝试改变这一行

File myFile = new File(extStore.getAbsolutePath() + "audioFilename");

File myFile = new File(audioFilename);

我已经用相同的代码运行了测试,它运行良好。

这是我测试的代码:

String audioFilename =  "/sdcard/NewFolder/test1.jpg";

Toast.makeText(SimpleTest.this, "File name: " + audioFilename,
Toast.LENGTH_LONG).show();

// the code below always returns "this file does not exist"

File extStore = Environment.getExternalStorageDirectory();
File myFile = new File(audioFilename);

if(myFile.exists()){

    Toast.makeText(SimpleTest.this, "<<<< this file exists, it is: "+audioFilename+" >>>>",
    Toast.LENGTH_LONG).show();

} else if(!myFile.exists()){

    Toast.makeText(SimpleTest.this, "<<<< this file does not exist >>>> ",
    Toast.LENGTH_LONG).show();
}

Toast.makeText(SimpleTest.this, "audio file name is: "+ audioFilename,
Toast.LENGTH_LONG).show();

希望对你有帮助。

谢谢。

【讨论】:

  • 是的,这是正确的。在我的代码中,我使用的是 extStore.getAbsolutePath() ,正如您所指出的,这就是问题所在。当我这样做时,完整的字符串是“/mnt/sdcard/mnt/sdcard/Jungle.mp3”,重复两次 /mnt/sdcard/ 就是它不起作用的原因。现在效果很好。
【解决方案3】:

您需要在 AndroidManifeast 文件中添加权限

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

编辑:

File extStore = Environment.getExternalStorageDirectory();
File myFile = new File(extStore+ "/Music/Jungle.mp3"); <---- try this

【讨论】:

  • 好,回答和观察,但是在询问问题之前我已经将该行添加到清单中。我应该提到这一点。我将尝试引用该项目,重建 R.java 生成的文件,看看是否可行。有时 xml 文件会卡住并且不更新
【解决方案4】:

我只是冒险猜测一下,并假设您正在使用物理设备来测试您的应用程序。如果这是真的,您的外部存储可能没有安装(因为您在计算机上使用 USB 存储),因此根据系统该文件确实不存在。尝试在不插入 USB 线的情况下测试您的代码。

编辑: 删除“audioFilename”周围的引号。

File myFile = new File(extStore.getAbsolutePath() + "audioFilename");

File myFile = new File(extStore.getAbsolutePath() + audioFilename);

【讨论】:

  • 这是一个很好的猜测,我以前遇到过这个问题。但现在我试着把它拔掉。尽管文件在 SD 卡上,但它仍然显示“文件不存在”
  • 好收获。这也是我没有注意到的错误。如果我需要使用 exStore.getAbsolutePath(),它就不会因为引号而起作用。但是,对于我使用 exStore.getAbsolutePath() 本身的代码来说是一个错误,因此您指出的错误就像原始错误之下的第二维错误。或误差平方
猜你喜欢
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2012-09-13
  • 2012-03-24
相关资源
最近更新 更多