Как скопировать базу данных с /data/data/my.package.name/databases/
в папку /mnt/shared
с помощью Java?Android скопировать базу данных в mnt/shared
Я попытался с помощью FileOutputStream
, но получить open failed: EACCES (Permission denied)
Как скопировать базу данных с /data/data/my.package.name/databases/
в папку /mnt/shared
с помощью Java?Android скопировать базу данных в mnt/shared
Я попытался с помощью FileOutputStream
, но получить open failed: EACCES (Permission denied)
Используйте это:
public void writeToSDCard() throws IOException {
System.out.println("Write To Sd");
File f=new File("/data/data/com.yourpackage/databases/dbname");
FileInputStream fis=null;
FileOutputStream fos=null;
try{
fis=new FileInputStream(f);
fos=new FileOutputStream("/mnt/sdcard/dumped.db");
while(true){
int i=fis.read();
if(i!=-1){
fos.write(i);
}
else{
break;
}
}
fos.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
fos.close();
fis.close();
}
catch(IOException ioe){
// System.out.println(ioe);
}
}
System.out.println("Wrote to Sd");
}
Добавить требуемое разрешение в манифесте.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Невозможно сохранить его в папку '/ mnt/shared' вместо'/mnt/sdcard'? – defc0re
Да, убедитесь, что папка присутствует. Путь - это путь, который не имеет никакой разницы. Таким образом, ваш последний путь будет 'mnt/sdcard/shared' – Skynet
Но между'/mnt/shared' и 'mnt/sdcard/shared' существует другое. Один находится во внутреннем хранилище, а другой во внешнем. – defc0re
Я смог найти решение проблемы. Нужен корень телефона.
public static void copyDb() {
try {
String command = "cp -r /data/data/my.package.name/databases/ /mnt/shared/";
Process suProcess = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
os.writeBytes("chmod 777 " + sharedFolder + " \n");
os.flush();
os.writeBytes(command + "\n");
os.flush();
os.writeBytes("exit\n");
os.flush();
suProcess.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
В основном вам не хватает, чтобы объявить разрешение на запись в externam хранения: '<использование-разрешение андроид: имя = "android.permission.WRITE_EXTERNAL_STORAGE"/>' – Skynet
Никогда не видел/MNT/Shared каталога. Что это за устройство? – greenapps
Это виртуальное устройство, использующее VirtualBox – defc0re