虽然我对 Android 比较陌生,但我有基于 Java 和 C 的编程经验,我目前正在使用 Eclipse 和常用工具集进行开发。我已经阅读了有关该主题的大部分帖子,并且我相信我已经包含/应用了所有建议和测试。我以前使用 FileOutputStream 写入内部的、特定于应用程序的文件,为 L8 构建,没有任何问题。我现在正在尝试使用 Build L7 for Android 2.1 写入 SD 卡上的文件。以下代码来自我用来测试基本代码的带有 3 个按钮(写入、读取和发送)的单个活动。尽管导致 FileOutputStream (FOS) 构造函数的所有包含的测试(存在、可写和在 createNewFile 或 mkdirs 上的 IOException)都通过 AOK,但 FOS 构造失败,抛出 FileNotFoundException,见下文。我已经调试并确认了问题,请参阅底部的 LogCat。这是通过 ADB 在 Eclipse 标准模拟器上运行的,其中包含 256kB 的构建中的 SD 卡。
从我的 onw createExternalStorageFile() 方法。
File file = null;
file = new File(Environment.getExternalStorageDirectory(), mfileName);
if(file != null) {
//file.mkdirs();
try {
file.createNewFile();
} catch (IOException e1) {
Log.e(TAG, "createNewFile() failed!", e1);
return false;
}
}
if(!file.exists()) {
Log.d(TAG, "file does not exist!");
}
if(!file.canWrite()) {
Log.d(TAG, "cannot write to file!");
}
Log.d(TAG, "full file-path is: " + file.toString());
FileOutputStream fOS = null;
try {
//fOS = new FileOutputStream(file);
fOS = new FileOutputStream(file.toString());
// *** THIS THROW THE FILENOTFOUNDEXCEPTION ***
} catch (FileNotFoundException e1) {
Log.e(TAG, "fOS-FileNotFoundException", e1);
return false;
}
// fOS IS STILL NULL - HOW CAN THIS BE!
if(fOS != null) {
try {
fOS.write(TESTDATA.getBytes());
fOS.close();
} catch (IOException e1) {
Log.e(TAG, "IOException from fOS-write()!", e1);
return false;
}
Log.d(TAG, "fos-fd is: " + fOS.toString());
}
return true;
>
我的清单文件包含使用权限声明,如下所示:
>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.eddiem.adeveloper.externalfilesend"
android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name=".ExternalFileSendActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
>
所以这在声明之外,应该可以吗?
任何人都可以帮助解决为什么 FileOutputStream 失败的谜题,即使我的所有测试似乎都确认它应该工作?
> LogCat: 11-02 15:40:54.754: DEBUG/MediaScannerService(154): 开始扫描外部卷 11-02 15:40:54.764: VERBOSE/MediaProvider(154): /sdcard 卷 ID: 300427547 11-02 15: 40:54.894:INFO/System.out(202):调试器已解决 (1479) 11-02 15:40:55.024:VERBOSE/MediaProvider(154):附加卷:外部 11-02 15:40:55.904:VERBOSE/ MediaScanner(154): pruneDeadThumbnailFiles...android.database.sqlite.SQLiteCursor@44c434f0 11-02 15:40:55.915:VERBOSE/MediaScanner(154):/pruneDeadThumbnailFiles...android.database.sqlite.SQLiteCursor@44c434f0 11- 02 15:40:55.925:DEBUG/MediaScanner(154):预扫描时间:715ms 11-02 15:40:55.955:DEBUG/MediaScanner(154):扫描时间:4ms 11-02 15:40:55.955:DEBUG/MediaScanner (154):后扫描时间:55ms 11-02 15:40:55.955:DEBUG/MediaScanner(154):总时间:774ms 11-02 15:40:55。964:调试/MediaScannerService(154):完成扫描卷外部 11-02 15:44:50.934:调试/KeyguardViewMediator(52):pokeWakelock(5000) 11-02 15:44:51.334:调试/KeyguardViewMediator(52):pokeWakelock (5000) 11-02 15:44:51.384: INFO/ActivityManager(52): 显示的活动 org.eddiem.adeveloper.filesendl7/.FileSendL7Activity: 239793 ms(总共 255760 ms)11-02 15:44:51.394: INFO/ ARMAssembler(52): generated scanline__00000077:03545404_00000A04_00000000 [ 29 ipp] (51 ins) at [0x46ac60:0x46ad2c] in 757079 ns 11-02 15:44:51.414: INFO/ARMAssembler(52): generated scanline__00000177:03515104_00001A01_00000000 [ 73 ipp] (98 ins) at [0x46ad30:0x46aeb8] in 657626 ns 11-02 15:45:05.884: DEBUG/FileSendL7Activity(202): 完整文件路径是: /sdcard/testFile.txt 11-02 15:45:22.484:错误/FileSendL7Activity(202):fOS-FileNotFoundException 11-02 15:45:22.484:错误/FileSendL7Activity(202):java.io.FileNotFoundException:/sdcard/testFile.txt 11-02 15:45:22.484:错误/FileSendL7Activity(202):在 org.apache.harmony.luni.platform.OSFileSystem。打开(OSFileSystem.java:244)11-02 15:45:22.484:错误/FileSendL7Activity(202):在 java.io.FileOutputStream.(FileOutputStream.java:97)11-02 15:45:22.484:错误/FileSendL7Activity (202): 在 java.io.FileOutputStream.(FileOutputStream.java:168) 11-02 15:45:22.484: 错误/FileSendL7Activity(202): 在 java.io.FileOutputStream.(FileOutputStream.java:147) 11- 02 15:45:22.484: 错误/FileSendL7Activity(202): 在 org.eddiem.adeveloper.filesendl7.FileSendL7Activity.creatExternalStorageFileOS(FileSendL7Activity.java:149) 11-02 15:45:22.484: 错误/FileSendL7Activity(202): 在org.eddiem.adeveloper.filesendl7.FileSendL7Activity。访问$0(FileSendL7Activity.java:124)11-02 15:45:22.484:错误/FileSendL7Activity(202):在 org.eddiem.adeveloper.filesendl7.FileSendL7Activity$1.onClick(FileSendL7Activity.java:176)11-02 15: 45:22.484:错误/FileSendL7Activity(202):在 android.view.View.performClick(View.java:2364)
>
谢谢