0

テスト プログラムを作成していて、テスト結果の一部をファイルにシリアル化したい。この厄介な許可拒否例外が引き続き発生します。作業を簡単にするために、小さなサンプル コードを作成しましたが、それでも同じアクセス許可拒否の警告が表示されます。これが私のコードです。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 ファイルに対してブラック ボックス テストを行っている場合はどうなるのだろうか。バイトコードから許可を変更することはできませんよね?

4

3 に答える 3

3

使用許可

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

メイン プロジェクトのマニフェストに追加する必要があります。テストはメイン アプリケーションと同じプロセスで実行されることに注意してください。

于 2012-07-12T20:49:37.310 に答える
1

この行を変更します。

File sdCard = Environment.getExternalStorageDirectory();

これに:

File sdCard = new File(Environment.getExternalStorageDirectory().getPath());
于 2012-07-12T20:02:31.183 に答える
0

私は同じ問題に遭遇しました。これを修正するには、メイン マニフェストにパーミッション タグを追加するだけでなく、ユニットテストを含むモジュールのマニフェストにもタグを追加する必要がありました。

許可タグ:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2015-03-28T18:42:20.143 に答える