アプリデータベースを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です(前回の問題で問題だったので、言及したいと思いました)。