2011-01-20 70 views
9

我试图在内部专用存储区(应用程序用户首选项)上的简单文本文件中保存我的应用程序中的一些数据。我已经阅读了很多关于这里的问题(StackOverflow),并尝试了一些建议没有成功的解决方案。最简单的解决方案似乎是这里建议的解决方案:

http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

但我无法在我的测试设备上工作。我也尝试用适当的方法使用java.io.File中可用的方法创建文件。我也尝试在SD卡上创建具有相同结果的文件,失败。我已经尝试了许多其他解决方案中列出的解决方案,遵循准确建议的代码和说明并找到相同的结果。我开始觉得我缺少一些代码重要的一点,或设置标志的地方,我已在清单文件的权限:

在Android中写入内部专用存储

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


需要明确的是,我正在尝试写入设备的内部私人存储空间。它是一个包含名称,电话号码和几个int标志的小文件。什么都的方法我用,我要么找到该文件没有创建(或更改,如果我将手动文件的SD卡),或者我得到一个NullPointerException当我尝试引用该文件或文件位置:

private    File fILE = new File("Mydata", main.FILENAME); 


private    File fILE = getDir("Mydata", 0); 


我运行在HTC Hero的代码,与Sprint的最新的服务版本更新。任何帮助将非常感谢,提前致谢!

史蒂夫

更新(11年2月2日):使用EVO(API 8)我仍然得到一个NullPointerException。生成异常的代码如下,对于为什么我的应用程序无法访问内部存储的任何想法?我在使用两个API级别(API 7和8)的三种不同物理设备上遇到此问题。

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt"); 

更新2:11年2月4日 - 我发现我看不到在任何情况下对物理设备(数据目录)的文件结构。任何人对此有任何想法?该设备已正确配置,并可以从eclipse或adb运行应用程序。

更新3:(2/9/11) - 我想我可能已经发现问题在这里,但我不知道如何处理它。我发现物理设备上/ data /目录的权限是:drwxrwx--x。我不确定为什么会这样,也许是Sprint的一些东西?我发现HTC Hero,三星Epic(Galaxy S)和HTC EVO在Sprint上都是这样设置的。这个问题似乎是DDMS和我的应用程序没有r/w访问目录。我需要在这里弄清楚两件事情,为什么它是这样以及如何在野外过度解决这个问题。再次,这里的任何帮助将是真棒!

更新4:我认为去年2月对我来说是一个完整的金发时刻(见更新3)。我拥有的测试设备没有ROOT,因此无法访问(DUH!)。经过SGS和EVO 4G所经历的所有更新后,结果仍然相同。我仍然在解决这个问题,并会尽快回到这里(希望下次不到一年)。

+0

当您尝试使用这些不同的方法时,您是否收到错误消息,还是只是默默地失败? – 2011-01-27 18:11:25

+0

我现在专注于`openFileOutput()`方式,并且我得到一个NullPointerException。看起来手机上的私人数据目录由于某种原因被锁定,我甚至无法查看目录;它像没有创造那里。手机上'data'目录的权限为:“drwxrwx - x”。我开始怀疑电话上是否存在无效设置或其他问题。为了兼容性,数据文件写入内部存储是应用程序的一项要求。 – Kingsolmn 2011-01-27 19:58:47

+0

除非您有root用户访问权限,否则您将无法使用DDMS访问物理设备上的/ data目录,但仍应能够从应用程序写入文件。模拟器上会发生什么?你能写一个文件吗? – techiServices 2011-02-18 08:44:14

回答

4

物理设备的/data/目录仅提供给根用户。由于在物理设备上获得此访问权限的唯一现实方式是对设备进行root化,因此DDMS文件资源管理器无法进入目录树的此分支。

至于为什么该应用程序不会写在那里,可能问题在于我已经用调试密钥(不是一个大的* NIX专家)签名应用程序,但从我的个人研究中看来是这种情况)。

4

尝试改变下面一行:

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt"); 

到:

File newfile = new File(this.getFilesDir() + "/","sample.txt"); 
4

我正在处理同样的问题。最后,我发现您实际上不必为了在内部存储中创建新文件而提供所有文件路径。只需提及文件名称,它将在设备的应用程序包文件夹下创建。我确实提到过here

它的工作原理完美。我会说避免提到完整的文件路径,如:/ data/...为了创建一个文件(你需要正确的权限来创建一个这样的文件)。让Android框架为您的应用创建专用文件。

2

内部存储区域对应用程序来说是私有的,所以用户必须拥有root用户访问权限(rooted设备)才能创建和加载文件。如果你已经植根设备,这是如何将文件写入到内部存储:

// Create a file in the Internal Storage 

String fileName = "MyFile"; 
String content = "hello world"; 

FileOutputStream outputStream = null; 
try { 
outputStream = openFileOutput(fileName, Context.MODE_APPEND); 
outputStream.write(content.getBytes()); 
outputStream.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

这应该立即创建一个名为MyFile的与内容的hello world文件。内部存储目录通常位于我们应用程序包名称指定的特定位置。在我的情况下,它是/ data/data/[软件包名称],创建的文件存储在该目录中名为files的目录中。

0

由于@ bianca说,你最好不要使用文件路径。但是,只能使用文件名来创建文件。事情是这样的:

public static void saveTextToFile(Context context, String filename, String content) { 
    try { 
    FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); 
    fos.write(content.getBytes()); 
    fos.close(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

而得到文件,你可以使用:

File file = new File(context.getFilesDir(), filename); 

了解更多:Saving Files