我正在尝试在我的 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
从任何地方选择 a 意味着DropBox
, Drive
, SDCard
, Mega
, 等等...而且我没有找到正确的方法,我试图通过这个来获得Path
then get a ...但它不起作用,所以我认为最好获取它本身,然后以编程方式使用this 或.File
Path
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 相同的答案,但我不知道我是否可以从我的另一部分中得到这个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()
来自@YS
我正在这样做:
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
感谢@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
(这太棒了@YScontent_describer.getLastPathSegment();
不知道那个函数),然后我创建了一个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","....");
}
}
再次感谢您的帮助,希望您喜欢与大家一起制作的这段代码 :)