【发布时间】:2015-06-11 18:53:17
【问题描述】:
我正在尝试在我的 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 然后通过Path 获取File... 但它不起作用,所以我认为最好获取File 本身,然后使用这个File 以编程方式我Copy 这个或Delete。
编辑(当前代码)
我的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 这个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 }} 失败活动 {info.androidhive.tabsswipe/info.androidhive.tabsswipe.MainActivity2}:java.lang.NullPointerException
借助@Y.S.、@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","....");
}
}
再次感谢您的帮助,希望您喜欢与大家一起制作的这段代码 :)
【问题讨论】:
标签: android android-intent android-file android-fileprovider android-implicit-intent