2017-03-01 73 views
0

的`开放的,我试图从设备选择PDF文件,并将其上传到服务器上的文件。 ACTION_GET_CONTENT用于从设备中选择pdf。无法创建使用ACTION_GET_CONTENT`

sel_book.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(); 
      intent.setType("application/pdf"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(Intent.createChooser(intent, "Select PDF"), 1); 
     } 
    }); 

在活动结果上,我得到Uri并将其保存为字符串。

public void onActivityResult(int requestCode, int resultCode, Intent result) { 
    if (resultCode == RESULT_OK) { 
     if (requestCode == 1) { 
      Uri uri = result.getData(); 
      String uriString = uri.toString(); 
      File myFile = new File(uriString); 
      path = myFile.getAbsolutePath(); 
     } 
    } 
} 

结果路径为,/document/primary:Download/Aptitude_2016_17.pdf。我需要用它来创建一个新文件。 File selectedFile = new File(selectedFilePath);。但它不会创建文件。 selectedFile.isFile()返回false。我不知道为什么。请帮我解决这个问题。提前致谢。

回答

1

ACTION_GET_CONTENT用于选择从所述装置的PDF。

这允许用户选择一条内容。它不一定是一个文件。

活动结果我得到Uri并将其保存为字符串。

这不是你如何使用Uri

它产生的路径为/document/primary:Download/Aptitude_2016_17.pdf。

这不是一个文件系统路径。这是具有content方案的Uri的一部分。您没有从ACTION_GET_CONTENT获得文件。你会得到一个指向一段内容的Uri。这Uri可以指向任何用户和其他应用程序选择

  • ,你可以访问文件,通过Urifile方案
  • 一个文件,而是一个你不能访问(例如,在其他应用的内部存储)
  • 在数据库
  • 一段内容需要被下载
  • 等等
  • 的BLOB列的内容

使用ContentResovleropenInputStream()可以获取任何内容的流。直接使用(无论您用于上传此内容的任何内容),还是使用该流来制作自己的文件并附带该内容的副本,以便您拥有可供您使用的文件。

+0

谢谢。你能帮我获取选定的文件系统路径吗? – Choxmi

+0

@Choxmi:**没有文件系统路径**。唯一的办法就是创建自己的文件,使用'ContentResolver'和'openInputStream()',加上一个'FileOutputStream'到你控制的某个文件。然后,使用标准Java I/O从输入流复制到输出流。然后,你有你自己的文件和内容,你可以用它来达到你想要的任何目的。完成后请随时删除文件。 – CommonsWare

+0

明白了。非常感谢您的回复。 – Choxmi