Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中在外部存储器和内部存储器上存储文件_Android_File Io_Android External Storage - Fatal编程技术网

在android中在外部存储器和内部存储器上存储文件

在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这样只有内部存储的设备上运行时,

我正在用android做一个OCR应用程序。为此,我需要将经过培训的数据和图像存储在我的应用程序文件夹中。直到现在我都是用

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();