#java #android #file-io #file-location
#java #Android #file-io #расположение файла
Вопрос:
Я пытаюсь создать процесс резервного копирования / восстановления (экспорта / импорта) для приложения базы данных SQLite.
Хотя я, кажется, создал и заполнил файл (хорошо, теперь я знаю, что у меня есть). Я не могу видеть файл ни в 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 isnt" 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 в качестве фильтра) показывает (обратите внимание, что первый запуск при установке приложения завершается неудачно, но запрашивает и устанавливает разрешения. Я не верю, что это проблема / причина) :-
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 M8s с SD-картой. Однако я считаю, что /storage/emulated/0/Download , каталог, в который записывается файл, находится во внутренней памяти.
С DDMS я, похоже, не могу этого увидеть (на фактической SD-карте есть каталог загрузки, а не каталог загрузки).
В проводнике Windows я вижу как внутреннее хранилище, так и SD-карту в качестве устройств под устройством HTC_0PKV1.
В проводнике Windows каталог загрузки имеет (через свойства) 0 каталогов и файлов. Ни только для чтения, ни скрытый не отмечены.
Я пробовал как с, так и без setReadable
и setWritable()
.
Я только что попробовал использовать файловый менеджер на телефоне и теперь могу видеть файл. Итак, более конкретно, вопрос в том; Есть ли какой-либо способ, исключающий рутирование телефона и перемещение файла через файловый менеджер на телефоне, для доступа к файлу через проводник Windows?
Я должен также указать, что приложение будет работать на планшетах, поэтому метод должен быть общим, а не специфичным для устройства.
Ответ №1:
Файл становится видимым в проводнике Windows после отсоединения и повторного подключения USB-кабеля. Я не уверен, должен ли так работать MTP, или это может быть связано с ADB согласно этому фрагменту:-
Однако, если вы когда-либо пытались разблокировать свое устройство, например, для установки нового ПЗУ или рутирования его, возможно, вы когда-либо устанавливали драйвер Android Debug Bridge (ADB) на свой компьютер. Этот драйвер отлично подходит для того, чтобы иметь возможность использовать компьютер для отправки команд на ваше устройство, но он может испортить ваши простые манипуляции с файлами.
найдено в разделе Как заставить ваше устройство Android отображаться в проводнике файлов (если это не так)