Я использую метод резервного копирования для копирования базы данных приложения в SDCard.
Это отлично работает в эмуляторе, но когда я пытаюсь запустить его на своем телефоне, он падает. Ниже приведена соответствующая таблица:
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)
Моя первая мысль была права (из - за разрешения отказано в StackTrace), но я дважды проверил мой манифест и она содержит:
<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 (это имело значение для моего последнего номера, поэтому я подумал, что упомянул об этом).
Мой комментарий "Google сказал, что SD-карта не должна монтироваться". был правильным ответом в соответствии с ОП.
Я думаю, ваша проблема в том, что файл не существует... Попробуйте создать его сначала:
File outputFile = new File(sdcard, "GroceryList.bak");
if (!outputFile.exists())
outputFile.createNewFile();
W/System.err(17105): java.io.IOException: Permission denied
Я продолжаю возвращаться к разрешениям, но у меня есть требуемое разрешение в моем манифесте ...
Вы уверены, что этот файл уже существует? иногда просто создавая файл-объект (новый файл (..)) не создает сам файл. Если FileNotFoundException происходит, значит, файл еще не существует. Вы можете создать его, вызвав file.createNewFile().
File f= new File(sdcard, "GroceryList.bak");
if(!f.exists())
f.createNewFile();