Java 如何写入和读取所有设备的外部存储目录?

Java 如何写入和读取所有设备的外部存储目录?,java,android,ioexception,android-external-storage,enoent,Java,Android,Ioexception,Android External Storage,Enoent,我在将文件写入外部存储目录时遇到问题。我已经添加了权限。代码在某些设备上运行良好,而在其他设备上崩溃。我得到的错误是java.io.IOException:openfailed:enoint(没有这样的文件或目录)。我希望每个设备和每个Android版本都能运行此代码,并根据需要将文件保存到外部存储 代码如下: public void createFile(View v) { requestPermission(); String fileLocation

我在将文件写入外部存储目录时遇到问题。我已经添加了权限。代码在某些设备上运行良好,而在其他设备上崩溃。我得到的错误是java.io.IOException:openfailed:enoint(没有这样的文件或目录)。我希望每个设备和每个Android版本都能运行此代码,并根据需要将文件保存到外部存储

代码如下:

    public void createFile(View v) {
        requestPermission();
        String fileLocation = Environment.getExternalStorageDirectory().getPath() + "/SavedFiles";
        String fileContent = getFileContent();
        //Check for samsung devices because they require a different method of storage access
        if(android.os.Build.DEVICE.contains("Samsung") || android.os.Build.MANUFACTURER.contains("Samsung")){
            fileLocation = fileLocation + "/external_sd/";
        }
        try {
            File file = new File(fileLocation, "newfile.txt");
            if (!file.exists()) {
                file.createNewFile();
                FileOutputStream fOut = new FileOutputStream(file);
                OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
                myOutWriter.append(fileContent);
                myOutWriter.close();
                fOut.close();
                Toast.makeText(this, "File created!", Toast.LENGTH_LONG).show();
            }
        } catch (Exception e) {
            Toast.makeText(this, "Could not create the file.", Toast.LENGTH_LONG).show();
        }
    }

public void requestPermission(){
    if (Build.VERSION.SDK_INT >= 23) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG,"Permission is granted");
        } else {
            Log.v(TAG,"Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }
    else {
        Log.v(TAG,"Permission is granted");
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
        createFile();
    }
}

试着用这个替换你的代码

File fileDirectory = new File(Environment.getExternalStorageDirectory() + "/SavedFiles", "");
    if (!fileDirectory.exists())
            {
                fileDirectory.mkdirs();
            }
    File file = new File(fileDirectory, "newfile.txt");

您是否可以调试并说出在哪一行获取文件NotFoundException编辑代码以将异常记录到LogCat(例如,
log.e(“AES应用程序”,“创建文件时的异常”,e);
)。然后,检查LogCat以确定问题的来源。您不需要Samsung检查,但需要创建目录。另外,不要使用字符串连接来创建文件路径,而是使用适当的
file
构造函数(例如,
newfile(Environment.getExternalStorageDirectory(),“SavedFiles”)
。此外,您不需要
createNewFile()
,但您确实需要。您是否在运行时为较新的Androids请求了权限?@AES这意味着您的文件未被创建。这就解决了问题!想不到会这么简单。非常感谢。