1

アプリデータベースをSDカードにコピーするためのバックアップ方法を実装しています。

これはエミュレーターでは正常に機能しますが、電話で実行しようとするとクラッシュします。関連するスタックトレースは次のとおりです。

W/KeyCharacterMap(15814): Can't open keycharmap file
W/KeyCharacterMap(15814): Error loading keycharmap file '/data/usr/keychars/tegra-kbc.kcm.bin'.     hw.keyboards.0.devname='tegra-kbc'
W/System.err(15814): java.io.FileNotFoundException: /mnt/sdcard/GroceryList.bak (Permission denied)
W/System.err(15814):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
W/System.err(15814):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
W/System.err(15814):    at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
W/System.err(15814):    at java.io.FileOutputStream.<init>(FileOutputStream.java:66)

私の最初の考えはパーミッションでした(スタックトレースでパーミッションが拒否されたため)が、マニフェストを再確認しました。マニフェストには次のものが含まれてます。

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

それがメソッドにある場合:

public void backup() {
    try {
        File sdcard = Environment.getExternalStorageDirectory();
        File outputFile = new File(sdcard,
                "GroceryList.bak");
        File data = Environment.getDataDirectory();
        File inputFile = new File(data,
                "data/cdc.workshopapps.grocerylist/databases/GroceryList");
        InputStream input = new FileInputStream(inputFile);
        OutputStream output = new FileOutputStream(outputFile);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
        output.flush();
        output.close();
        input.close();
    } catch (IOException e) {
        e.printStackTrace();
        throw new Error("Copying Failed");
    }
}

Eclipseからプログラムを実行する以外に、電話でその許可を有効にするために必要なことはありますか?

編集

要求に応じてマニフェスト全体:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cdc.workshopapps.grocerylist"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".GroceryListMain"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

そして、それが重要な場合、私が使用している電話はMotorola Droid X2です(前回の問題で問題だったので、言及したいと思いました)。

4

3 に答える 3

2

私のコメント「グーグルはSDカードをマウントすべきではないと言った。」OPによると正解でした。

于 2012-05-20T05:13:41.977 に答える
1

あなたの問題はファイルが存在しないことだと思います...最初にそれを作成してみてください:

 File outputFile = new File(sdcard, "GroceryList.bak");
 if (!outputFile.exists())
     outputFile.createNewFile();
于 2012-05-20T04:56:51.513 に答える
0

このファイルはすでに存在しますか?ファイルオブジェクト(new File(..))を作成するだけでは、ファイル自体が作成されない場合があります。FileNotFoundExceptionが発生している場合は、ファイルがまだ存在していません。file.createNewFile()を呼び出すことで作成できます。

 File f= new File(sdcard, "GroceryList.bak");
   if(!f.exists())
   f.createNewFile();
于 2012-05-20T05:14:46.717 に答える