Я пытаюсь создать процесс резервного копирования/восстановления (экспорта/импорта) для приложения SQLite Database.Как я могу получить доступ к файлу, который я создал извне? AKA где файл?
Хотя я, кажется, создал и заполнил файл (ОК, теперь я знаю, что у меня есть). Я не вижу файл в DDMS или в проводнике Windows. Мне бы очень хотелось иметь возможность сделать последнее (см. Ниже для более конкретного вопроса).
Я успешно написал файл и прочитать файл, используя следующий код:
package mjt.sqlitetutorial;
import android.database.Cursor; //+++++ Added
import android.os.Build;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log; //+++++ Added
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
public int API_VERSION = Build.VERSION.SDK_INT;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (API_VERSION >= 23) {
ExternalStoragePermissions.verifyStoragePermissions(this);
}
final String EXTSTGTAG = "EXTERNSTG";
File file = getExternalFilesDir("File");
Log.i(EXTSTGTAG,file.toString());
//String extstgdirabs = Environment.getExternalStorageDirectory().getAbsolutePath();
String extstgdirpth = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
Log.i(EXTSTGTAG,"<=\nEXTERN STG PUB DIR=>" + extstgdirpth);
String filepath = extstgdirpth + File.separator + "myfile.txt";
Log.i(EXTSTGTAG,"Full File Path and name is\n\t" + filepath);
File f = new File(filepath);
if(!f.exists()) {
Log.i(EXTSTGTAG,"File did not exist (path=" + filepath + ")");
try {
f.createNewFile();
}
catch (IOException e) {
Log.e(EXTSTGTAG,"Failure Creating New File MSG=" + e.getMessage());
}
}
if(f.exists()) {
Log.i(EXTSTGTAG,"File Already Exists (" + filepath + ")");
try {
Log.i(EXTSTGTAG,"Creating FileOutputStream instance.");
FileOutputStream fos = new FileOutputStream(f);
Log.i(EXTSTGTAG,"Creating OutputStreamWriter instance from FileOutputStream.");
OutputStreamWriter osw = new OutputStreamWriter(fos);
Log.i(EXTSTGTAG,"Adding Data to OutputStreamWriter.");
osw.append("My Test Data.");
Log.i(EXTSTGTAG,"Closing OutputStreamWriter.");
osw.close();
Log.i(EXTSTGTAG,"Flushing FileOutputStream.");
fos.flush();
Log.i(EXTSTGTAG,"Closing FileOutputStream");
fos.close();
Log.i(EXTSTGTAG,"All Done OK.");
} catch (IOException e) {
Log.e(EXTSTGTAG, "Failure Trying to write to file." + e.getMessage());
e.printStackTrace();
}
} else {
Log.i(EXTSTGTAG,"File doesn't appear to exist when it should????");
}
f.setReadable(true);
f.setWritable(true);
if(f.exists()) {
try {
byte[] bytes;
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line = null;
while((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
br.close();
Log.i(EXTSTGTAG,"Read the following data:\n" + sb.toString());
}
catch (IOException e) {
Log.e(EXTSTGTAG,"Failure trying to read file." + e.getMessage());
e.printStackTrace();
}
}
}
}
Выход в журнал (с использованием EXTERN в качестве фильтра) показывает (обратите внимание на первый запуск при установке вводного App терпит неудачу ., но запросы и наборы разрешений Я не считаю, что это вопрос/причины): -
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: /storage/emulated/0/Android/data/mjt.sqlitetutorial/files/File
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: <=
EXTERN STG PUB DIR=>/storage/emulated/0/Download
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Full File Path and name is
/storage/emulated/0/Download/myfile.txt
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: File Already Exists (/storage/emulated/0/Download/myfile.txt)
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating FileOutputStream instance.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Creating OutputStreamWriter instance from FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Adding Data to OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing OutputStreamWriter.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Flushing FileOutputStream.
10-18 12:54:40.159 32393-32393/? I/EXTERNSTG: Closing FileOutputStream
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: All Done OK.
10-18 12:54:40.169 32393-32393/? I/EXTERNSTG: Read the following data:
My Test Data.
последняя строка указывает, что он прочитал файл (я предполагаю). В течение предоставленных сообщений нет других сообщений журнала (многие до и после, хотя).
устройство, на котором я тестирую это, является ненарушенной HTC One M8 с SD-картой. Тем не менее, я считаю, что /storage/emulated/0/Загрузить, каталог, в котором записывается файл, находится во внутренней памяти.
С DDMS Я, кажется, не могу это видеть (фактическая карта SD имеет каталог s, а не каталог загрузки).
В проводнике Windows я могу видеть, как внутреннего хранения и SD карты в качестве устройств под устройством HTC_0PKV1.
В проводнике Windows Скачать в каталоге есть (через свойства) 0 Каталоги и файлы. Ни чтение, ни скрытое не отмечены галочкой.
Я пробовал оба с setReadable
и setWritable()
.
Я только что попробовал использовать диспетчер файлов по телефону и теперь могу видеть файл. Итак, более конкретно, возникает вопрос: Есть ли какой-либо способ исключить укоренение телефона и перемещение файла через диспетчер файлов по телефону, чтобы получить доступ к файлу через проводник Windows?
Я также должен указать, что приложение будет работать на планшетах, поэтому метод должен быть общим, а не специфичным для устройства.