在android中在外部存储器和内部存储器上存储文件
我正在用android做一个OCR应用程序。为此,我需要将经过培训的数据和图像存储在我的应用程序文件夹中。直到现在我都是用在android中在外部存储器和内部存储器上存储文件,android,file-io,android-external-storage,Android,File Io,Android External Storage,我正在用android做一个OCR应用程序。为此,我需要将经过培训的数据和图像存储在我的应用程序文件夹中。直到现在我都是用 public static String DATA\u PATH=Environment.getExternalStorageDirectory().toString()+“/NewsReader/” 这在具有外部SD卡的设备上绝对可以正常工作 但当我尝试在没有插入SD卡的设备上运行同一个应用程序,或者在内部存储设备上运行,或者在像Nexus这样只有内部存储的设备上运行时,
public static String DATA\u PATH=Environment.getExternalStorageDirectory().toString()+“/NewsReader/”
这在具有外部SD卡的设备上绝对可以正常工作
但当我尝试在没有插入SD卡的设备上运行同一个应用程序,或者在内部存储设备上运行,或者在像Nexus这样只有内部存储的设备上运行时,应用程序失败了。我还有什么选择呢。我可以检查外部存储的状态,看看它是否可用,但如果不可用,我的应用程序应该怎么做,而不是崩溃。我甚至试过做getFilesDir().toString()+“/NewsReader/”
,但结果相同
编辑
从我得到的一些答案来看,我的上述问题并不能说明我真正的问题是什么,让我进一步澄清
我正在这样做:public static String DATA\u PATH=Environment.getExternalStorageDirectory().toString()+“/NewsReader/”
当我在有外部SD卡的设备上运行它时,它完美地在手机中创建了文件夹NewsReader。但无法在只有内部存储的设备上运行。
加起来,目前我在一个线程中的splsh活动中创建所有文件业务,但之前我在正常活动中创建用于在所有设备上运行的相同代码。阅读本文,希望对您有所帮助 您可以使用SharedReference: 要保存数据,请执行以下操作:
SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
editor.putString("text", mSaved.getText().toString());
editor.putInt("selection-start", mSaved.getSelectionStart());
editor.putInt("selection-end", mSaved.getSelectionEnd());
editor.commit();
要检索数据,请执行以下操作:
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
String restoredText = prefs.getString("text", null);
int selectionStart = prefs.getInt("selection-start", -1);
int selectionEnd = prefs.getInt("selection-end", -1);
若并没有外部存储器,那个么您就不能在外部存储器中存储,这是合乎逻辑的。您可以检查设备是否有外部存储器 如果没有,则必须将数据存储在内部存储器中
`String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
//do your code for external storage
}else {
//for internal storage
}`
您必须首先通过以下代码检查外部存储是否存在:
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;}
File internal_storagefile = new File("/data/YourPackageName/files/abc.jpg");
您可以改用内部存储。
内部存储器可由以下代码使用:
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;}
File internal_storagefile = new File("/data/YourPackageName/files/abc.jpg");
您甚至可以通过以下方式获取内部存储路径:
File internalPath = File("/data/" + getApplicationContext().getPackageName() + "/");
资料来源:
多谢各位
Environment.getExternalStorageState() returns path to internal SD mount point like "/mnt/sdcard"
不,Environment.getExternalStorageDirectory()指设备制造商认为是“外部存储”的任何内容。在某些设备上,这是可移动介质,如SD卡。在某些设备上,这是设备闪存的一部分。在这里,“外部存储”是指“当安装在主机上时,通过USB大容量存储模式可以访问的东西”,至少对于Android 1.x和2.x来说是这样。
但问题是关于外部SD。如何获得“/mnt/sdcard/external_sd”这样的路径(不同设备的路径可能不同)
如果设备制造商已选择将外部存储器作为板载闪存,并且还具有SD卡,则您需要与该制造商联系,以确定是否可以使用SD卡(不保证),以及使用SD卡的规则,例如使用SD卡的路径
环境。getExternalStorageDirectory()
将返回外部存储的路径。在大多数情况下,它是SD卡路径。但在某些手机中,手机内存中有一个外部存储器。并且不要使用harcoded路径。使用File.Separator
。你所做的是正确的如果我所做的是正确的,那么为什么应用程序只在没有外部SD卡的手机上崩溃呢?你能给出一个你想保存的文件名或目录名吗?因为某些手机不支持某些特殊字符作为文件名,所以这可能就是问题所在prob@y.dixit张贴stacktrace。这将为您提供一个正确的解决方案,但是如果外部存储不可用,如何使用内部存储?因为我只需要绝对路径…在getExternalStorage的情况下,我得到了它,但是如何以相同的方式获得内部存储的绝对路径绝对路径是“/data/YourPackageName/YourFileWithExtension”这是在内部存储器中存储数据的示例代码。String FILENAME=“hello_file”;String=“你好,世界!”;FileOutputStream fos=openFileOutput(文件名,Context.MODE\u PRIVATE);fos.write(string.getBytes());fos.close();