テスト プログラムを作成していて、テスト結果の一部をファイルにシリアル化したい。この厄介な許可拒否例外が引き続き発生します。作業を簡単にするために、小さなサンプル コードを作成しましたが、それでも同じアクセス許可拒否の警告が表示されます。これが私のコードです。getExternalStorageDirectory を使用して /mnt/sdcard/ ディレクトリを取得します。
private void writetry(){
try {
File sdCard = Environment.getExternalStorageDirectory();
Log.d("can write", String.valueOf(sdCard.canWrite()));
Log.d("ExternalStorageState", Environment.getExternalStorageState());
File file = new File(sdCard, "VisitedScreen.temp");
//file.createNewFile();
FileOutputStream f = new FileOutputStream(file);
byte[] buf = "Hello".getBytes();
f.write(buf);
f.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
logcat が出力するものは次のとおりです。
07-12 12:28:47.288: D/can write(253): false
07-12 12:28:47.288: D/ExternalStorageState(253): mounted
07-12 12:28:47.297: W/System.err(253): java.io.FileNotFoundException: /sdcard/VisitedScreen.temp
07-12 12:28:47.437: W/System.err(253): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:244)
07-12 12:28:47.437: W/System.err(253): at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
07-12 12:28:47.437: W/System.err(253): at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
Junit テストのマニフェスト ファイルを次のように宣言しました: (実際には、アクセス許可を設定する場所が間違っています)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.mandaria.tippytipper.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="net.mandaria.tippytipper" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" />
</application>
</manifest>
どんな提案でも大歓迎です!
追加: 同じコードを通常の Android プログラムにコピーすると、動作し、sdCard.canWrite() は true を返します。しかし、Android Junit テスト プロジェクトでは機能しません。なぜだかわかる方いますか??
問題が解決しました: ご回答いただきありがとうございます。これは、元の Android プログラムに追加していないためです。また、Junit テスト プロジェクトに権限を追加する必要がないことにも注意しました。テスト プロジェクトで書き込みアクションが発生したことは非常に興味深いですが、元のプロジェクトでは許可が必要です。.apk ファイルに対してブラック ボックス テストを行っている場合はどうなるのだろうか。バイトコードから許可を変更することはできませんよね?