2

我正在尝试简单检查文件是否存在。我在这里看到了类似的问题,但它们没有帮助。当我运行我的应用程序时,应用程序崩溃并且我收到消息“不幸的是,fileCheck1 已停止”。我在模拟器和智能手机上都遇到了这个错误。

我的代码:

package com.example.fileCheck1;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;

import java.io.File;

public class MyActivity extends Activity {

    TextView msgText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        msgText = (TextView) findViewById(R.id.textView);
        String Path = Environment.getExternalStorageDirectory().getPath()+"/ping.xml";
        File file = getBaseContext().getFileStreamPath(Path);
        if(file.exists()){
            msgText.setText("Found");
        }
        if(!file.exists()){
            msgText.setText("Not Found");
        }
    }
}

在我的清单中,此类权限:

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

提前致谢。

4

3 回答 3

3

我认为问题就在这里:

getBaseContext()

它被分配到哪里NULL。你真的不需要这条线。你可以简单地实现你的目标

String path = Environment.getExternalStorageDirectory().getPath() + "/ping.xml";
File f = new File(path);
if (f.exists()) {
   // do your stuff
}
else {
  // do your stuff
}

更新:

如果您或其他人拥有三星 Galaxy S3,请按照@Raghunandan 的回答,因为在这种情况下会getExternalStorageDirectory()返回内部存储器。

于 2013-04-01T13:13:37.450 回答
3

我有 android 4.1.2 的三星 Galaxy s3。我的内部手机内存命名为 sdcard0 和我的外部卡 extSdCard。

Environment.getExternalStorageDirectory()

所以上面返回sdcard0的路径,它是手机内部存储器

所以得到你可以使用下面的实际路径

String externalpath = new String();
String internalpath = new String();

public  void getExternalMounts() {
Runtime runtime = Runtime.getRuntime();
try
{
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;

BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
    if (line.contains("secure")) continue;
    if (line.contains("asec")) continue;

    if (line.contains("fat")) {//external card
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            externalpath = externalpath.concat("*" + columns[1] + "\n");
        }
} 
        else if (line.contains("fuse")) {//internal storage
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            internalpath = internalpath.concat(columns[1] + "\n");
        }
    }
}
}
catch(Exception e)
{
    e.printStackTrace();
}
  System.out.println("Path  of sd card external............"+externalpath);
  System.out.println("Path  of internal memory............"+internalpath);
}

一旦你得到路径

    File file = new File(internalpath+"/ping.xml");// internalpath or external path
    if(file.exists()){
        msgText.setText("Found");
    }
    else{
        msgText.setText("Not Found");
    }

更新 :

不推荐上述解决方案。可能效果不好。Environment.getExternalStorageDirectory()将始终返回外部存储的路径。在大多数情况下,它是一个 SD 卡。

从文档

公共静态文件getExternalStorageDirectory()

在 API 级别 1 中添加 返回主外部存储目录。如果该目录已被用户安装在他们的计算机上、已从设备中删除或发生了其他问题,则该目录当前可能无法访问。您可以使用 getExternalStorageState() 确定其当前状态。

注意:不要被这里的“外部”这个词弄糊涂了。最好将此目录视为媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并且在所有应用程序之间共享(不强制执行权限)。传统上这是一张 SD 卡,但它也可以作为设备中的内置存储实现,与受保护的内部存储不同,并且可以作为文件系统安装在计算机上。

于 2013-04-01T13:19:46.073 回答
0

检查这个:

    File file = new File(Environment.getExternalStorageDirectory()+"/ping.xml");
    if(file.exists()){
        msgText.setText("Found");
    }
    else{
        msgText.setText("Not Found");
    }
于 2013-04-01T13:14:59.737 回答