我想创建一个存储一些只能由我的app访问的数据的文件。外部用户不应该能够访问该文件或对其进行任何更改。我会在文件中存储一个密钥应用程序随时访问。
答案 0 :(得分:3)
使用Environment.getDataDirectory(), http://developer.android.com/reference/android/os/Environment.html#getDataDirectory()
这给出了一个File对象,它是私有的特定于应用程序的数据目录的路径。其中创建的文件归您应用的用户ID所有,阻止任何其他应用访问它们。
File myPrivateFile = new File(Environment.getDataDirectory(), context.getPackageName() + File.separator + "secret.txt");
请注意,如果设备已植根,则所有投注均已关闭。根进程可以读取设备上的任何文件。您可以做的最好的事情只是为设备用户存储信息。这样,如果它被泄露,只有一个用户帐户被泄露。换句话说,不要存储凭证,密钥,访问令牌等,这样可以让恶意代理访问服务器,从而可以为其他用户窃取数据。
答案 1 :(得分:1)
为什么不将它存储在SharedPreference ??
中通过调用..
使您的SharedPreference
对您的活动保密
getSharedPreferences(yourfile, MODE_PRIVATE);
这将确保只有Activity
SharedPreference
才能访问{{1}}。
答案 2 :(得分:1)
要创建应用程序私有文件(其他应用程序无法读取),您应该使用带有标记Context.openFileOutput()的MODE_PRIVATE。
如果您担心,可以将返回的InputStream包装在CiperOutputStream中并加密内容。
如果您以标准加密格式(X.509或PKCS#12)存储密钥,则可以使用ICS中引入的新KeyChain API。
答案 3 :(得分:1)
要从私人应用程序文件夹中打开文件,可以使用此文件路径:
File myFilePath = new File(getContext().getFilesDir() + File.separator + "myFile")
您可以检查文件是否存在if(myFilePath.exists())
...
将文本文件保存到私人应用程序目录
FileOutputStream fos = null;
try {
fos = getContext().openFileOutput("myFile",Context.MODE_PRIVATE);
} catch (FileNotFoundException e) { }
try {
fos.write(myTextString.getBytes());
} catch (IOException e) { }
try {
fos.close();
} catch (IOException e) { }
将图像保存到私人应用目录:
try {
myBitmapImage.compress(CompressFormat.JPG, 90,
openFileOutput("myimage.jpg", MODE_PRIVATE));
} catch (Exception e) { }
答案 4 :(得分:0)
您最好的选择是存储加密文件并在运行时解密,因此即使有权访问它,即使有根电话也无法读取您的数据。当然,这是一个鸡蛋条件(你会在哪里存储加密文件的密钥),唯一比将密钥放在变量中更好的方法是使用一些模糊的方法生成密钥运行时(参见{{3} })