Я пытаюсь реализовать File Picker в своем проекте Android. Что мне удалось сделать до сих пор:
Intent chooseFile;
Intent intent;
chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("*/*");
intent = Intent.createChooser(chooseFile, "Choose a file");
startActivityForResult(intent, PICKFILE_RESULT_CODE);
И затем в моем onActivityResult()
switch(requestCode){
case PICKFILE_RESULT_CODE:
if(resultCode==-1){
Uri uri = data.getData();
String filePath = uri.getPath();
Toast.makeText(getActivity(), filePath,
Toast.LENGTH_LONG).show();
}
break;
}
Это открывает сборщик файлов, но это не то, что я хочу. Например, я хочу выбрать файл (.txt), а затем получить этот File
, а затем использовать его. С помощью этого кода я думал, что получаю полный путь, но этого не произойдет; например, я получаю: /document/5318/
. Но с этим путем я не могу получить файл. Я создал метод под названием PathToFile()
, который возвращает File
:
private File PathToFile(String path) {
File tempFileToUpload;
tempFileToUpload = new File(path);
return tempFileToUpload;
}
То, что я пытаюсь сделать, это позволить пользователю выбрать File
из любых средств DropBox
, Drive
, SDCard
, Mega
и т.д.... И я не нахожу способ чтобы сделать это правильно, я попытался получить Path
, затем получить File
этим Path
... но он не работает, поэтому я думаю, что лучше получить сам File
, а затем с помощью это File
программно я Copy
this или Delete
.
EDIT (текущий код)
Мой Intent
Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.addCategory(Intent.CATEGORY_OPENABLE);
chooseFile.setType("text/plain");
startActivityForResult(
Intent.createChooser(chooseFile, "Choose a file"),
PICKFILE_RESULT_CODE
);
У меня вопрос, потому что я не знаю, что поддерживается как text/plain
, но я собираюсь рассказать об этом, но в данный момент это не имеет значения.
На моем onActivityResult()
я использовал то же самое, что @Lukas Knuth answer, но я не знаю, могу ли я с ним Copy
this File
в другую часть от моего SDCard
Я жду ответа.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICKFILE_RESULT_CODE && resultCode == Activity.RESULT_OK){
Uri content_describer = data.getData();
//get the path
Log.d("Path???", content_describer.getPath());
BufferedReader reader = null;
try {
// open the user-picked file for reading:
InputStream in = getActivity().getContentResolver().openInputStream(content_describer);
// now read the content:
reader = new BufferedReader(new InputStreamReader(in));
String line;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null){
builder.append(line);
}
// Do something with the content in
text.setText(builder.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
getPath()
из @Y.S.
Я делаю это:
String[] projection = { MediaStore.Files.FileColumns.DATA };
Cursor cursor = getActivity().getContentResolver().query(content_describer, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(projection[0]);
cursor.moveToFirst();
cursor.close();
Log.d( "PATH-->",cursor.getString(column_index));
Получает NullPointerException
:
java.lang.RuntimeException: Ошибка предоставления результата ResultInfo {who = null, request = 131073, result = -1, data = Intent {dat = file:///path typ = text/plain flg = 0x3}} to activity {info.androidhive.tabsswipe/info.androidhive.tabsswipe.MainActivity2}: java.lang.NullPointerException
EDIT с кодом, работающим благодаря @YS, @Lukas Knuth и @CommonsWare.
Это Intent
, где я принимаю только файлы text/plain
.
Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.addCategory(Intent.CATEGORY_OPENABLE);
chooseFile.setType("text/plain");
startActivityForResult(
Intent.createChooser(chooseFile, "Choose a file"),
PICKFILE_RESULT_CODE
);
На моем onActivityResult()
я создаю URI
, где я получаю данные Intent
, я создаю File
, где я сохраняю абсолютный путь content_describer.getPath();
, и то я сохраняю имя пути, чтобы использовать его в TextView
с content_describer.getLastPathSegment();
(это было удивительно, что @YS не знал об этой функции), и я создаю второй File
, который я назвал destination
и Я отправляю AbsolutePath
, чтобы создать этот File
.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICKFILE_RESULT_CODE && resultCode == Activity.RESULT_OK){
Uri content_describer = data.getData();
String src = content_describer.getPath();
source = new File(src);
Log.d("src is ", source.toString());
String filename = content_describer.getLastPathSegment();
text.setText(filename);
Log.d("FileName is ",filename);
destination = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Test/TestTest/" + filename);
Log.d("Destination is ", destination.toString());
SetToFolder.setEnabled(true);
}
}
Также я создал функцию, которую вы должны отправить source file
и destination file
, которые мы создали ранее, чтобы скопировать ее в новую папку.
private void copy(File source, File destination) throws IOException {
FileChannel in = new FileInputStream(source).getChannel();
FileChannel out = new FileOutputStream(destination).getChannel();
try {
in.transferTo(0, in.size(), out);
} catch(Exception e){
Log.d("Exception", e.toString());
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}
Также я создал функцию, которая говорит мне, если эта папка существует или нет (мне нужно отправить destination file
, если она не существует, я создаю эту папку, а если нет, я ничего не делаю.
private void DirectoryExist (File destination) {
if(!destination.isDirectory()) {
if(destination.mkdirs()){
Log.d("Carpeta creada","....");
}else{
Log.d("Carpeta no creada","....");
}
}
Еще раз спасибо за вашу помощь, надеюсь, вам понравится этот код, сделанный с каждым из вас, ребята:)