我正在尝试在我的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),然后获取那个 文件
并使用它。通过这段代码,我以为会得到完整的路径,但事实并非如此;例如,我得到了:/document/5318/
。但是,使用这个路径我无法获取文件。 我创建了一个名为 PathToFile()
的方法,返回了一个 文件
:
private File PathToFile(String path) {
File tempFileToUpload;
tempFileToUpload = new File(path);
return tempFileToUpload;
}
我试图让用户从任何地方选择一个“文件”(包括DropBox、Drive、SDCard、Mega等),但是我找不到正确的方法。我尝试获取“路径”,然后通过这个“路径”获取一个“文件”...但是它不起作用,所以我认为更好的方法是直接获取“文件”,然后通过编程方式对此“文件”进行“复制”或“删除”。
编辑(当前代码)
我的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的回答相同的方法,但我不知道是否可以使用它将此文件
复制到我的SD卡
的另一个位置,我正在等待他的答案。
@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));
得到了一个空指针异常:
java.lang.RuntimeException:将结果ResultInfo {who = null,request = 131073,result = -1,data = Intent {dat = file:/// path typ = text / plain flg = 0x3}}传递给活动 {info.androidhive.tabsswipe / info.androidhive.tabsswipe .MainActivity2}:java.lang.NullPointerException
编辑带有代码的工作感谢@Y.S。、@Lukas Knuth和@CommonsWare。
这是我只接受文件text/plain
类型的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
);
在我的 onActivityResult()
中,我创建了一个 URI
,从中获取了 Intent
的数据,然后通过 content_describer.getPath();
创建了一个 File
来保存绝对路径,并将路径的名称保留下来以便在 TextView
中使用 content_describer.getLastPathSegment();
(这个函数真是太棒了,@Y.S.让我第一次知道它的存在),然后我创建了第二个名为 destination
的 File
,并将 AbsolutePath
发送给它来创建这个文件。@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);
}
}
我还创建了一个函数,你需要向其发送之前创建的源文件
和目标文件
,以将其复制到新文件夹中。
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();
}
}
我也创建了一个函数,用于判断这个文件夹是否存在(我必须发送 目标文件
,如果不存在,我就创建这个文件夹;如果存在,则不进行任何操作)。
private void DirectoryExist (File destination) {
if(!destination.isDirectory()) {
if(destination.mkdirs()){
Log.d("Carpeta creada","....");
}else{
Log.d("Carpeta no creada","....");
}
}
再次感谢您的帮助,希望您喜欢这个与大家一起制作的代码:)