- 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 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()我使用与@Lukas Knuth answer相同,但我不知道是否可以复制该文件到我的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()from @ Y.S.
我在做这个:
- String[] projection = { MediaStore.Files.FileColumns.DATA };
- Cursor cursor = getActivity().getContentResolver().query(content_describer,projection,null,null);
- int column_index = cursor.getColumnIndexOrThrow(projection[0]);
- cursor.moveToFirst();
- cursor.close();
- Log.d( "PATH-->",cursor.getString(column_index));
得到一个NullPointerException:
java.lang.RuntimeException: Failure delivering result 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
编辑工作感谢@Y.S.,@Lukas Knuth和@CommonsWare编辑.
这是我只接受文件/简单的意图.
- Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
- chooseFile.addCategory(Intent.CATEGORY_OPENABLE);
- chooseFile.setType("text/plain");
- startActivityForResult(
- Intent.createChooser(chooseFile,PICKFILE_RESULT_CODE
- );
在我的onActivityResult()我创建一个URI,我获取Intent的数据,我创建一个文件,我保存绝对路径做content_describer.getPath();然后我保留路径的名称在TextView with content_describer.getLastPathSegment(); (这真的很棒@Y.S.不知道那个功能),我创建了一个第二个File,我称之为目标,我发送AbsolutePath可以创建这个文件.
- @Override
- public void onActivityResult(int requestCode,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","....");
- }
- }
再次感谢您的帮助,希望您喜欢与大家一起制作的代码:)
解决方法
要从设备中选择一个文件,你应该使用一个隐含的Intent
- Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
- chooseFile.setType("*/*");
- chooseFile = Intent.createChooser(chooseFile,"Choose a file");
- startActivityForResult(chooseFile,PICKFILE_RESULT_CODE);
- Uri uri = data.getData();
- String src = uri.getPath();
其中data是在onActivityResult()中返回的Intent.
如果不行,请使用以下方法:
- public String getPath(Uri uri) {
- String path = null;
- String[] projection = { MediaStore.Files.FileColumns.DATA };
- Cursor cursor = getContentResolver().query(uri,null);
- if(cursor == null){
- path = uri.getPath()
- }
- else{
- cursor.moveToFirst();
- int column_index = cursor.getColumnIndexOrThrow(projection[0]);
- path = cursor.getString(column_index);
- cursor.close();
- }
- return ((path == null || path.isEmpty()) ? (uri.getPath()) : path);
- }
这两种方法中至少有一种应该使您获得正确的完整路径.
步骤3 – 复制文件:
我想,你想要的是将文件从一个位置复制到另一个位置.
为此,绝对必须具有源和目标位置的绝对文件路径.
首先,使用我的getPath()方法或uri.getPath()获取绝对文件路径:
- String src = getPath(uri); /* Method defined above. */
要么
- Uri uri = data.getData();
- String src = uri.getPath();
然后,创建两个File对象,如下所示:
- File source = new File(src);
- String filename = uri.getLastPathSegment();
- File destination = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/CustomFolder/" + filename);
其中CustomFolder是您要复制文件的外部驱动器上的目录.
- private void copy(File source,File destination) {
- FileChannel in = new FileInputStream(source).getChannel();
- FileChannel out = new FileOutputStream(destination).getChannel();
- try {
- in.transferTo(0,out);
- } catch(Exception){
- // post to log
- } finally {
- if (in != null)
- in.close();
- if (out != null)
- out.close();
- }
- }
尝试这个.这应该工作.
注意:对于Lukas的答案 – 他所做的是使用一个名为openInputStream()的方法来返回Uri的内容,无论Uri是表示文件还是URL.
另一个有希望的方法 – FileProvider:
还有一种方法可以从另一个应用程序获取文件.如果应用程序通过FileProvider
共享其文件,那么可以抓住一个保存有关该文件的特定信息的FileDescriptor
对象.
为此,请使用以下Intent:
- Intent mRequestFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
- mRequestFileIntent.setType("*/*");
- startActivityForResult(mRequestFileIntent,0);
在你的onActivityResult()中:
- @Override
- public void onActivityResult(int requestCode,Intent returnIntent) {
- // If the selection didn't work
- if (resultCode != RESULT_OK) {
- // Exit without doing anything else
- return;
- } else {
- // Get the file's content URI from the incoming Intent
- Uri returnUri = returnIntent.getData();
- /*
- * Try to open the file for "read" access using the
- * returned URI. If the file isn't found,write to the
- * error log and return.
- */
- try {
- /*
- * Get the content resolver instance for this context,and use it
- * to get a ParcelFileDescriptor for the file.
- */
- mInputPFD = getContentResolver().openFileDescriptor(returnUri,"r");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- Log.e("MainActivity","File not found.");
- return;
- }
- // Get a regular file descriptor for the file
- FileDescriptor fd = mInputPFD.getFileDescriptor();
- ...
- }
- }
其中mInputPFD是一个ParcelFileDescriptor.
参考文献: