2017-06-20 33 views
0

我正在开发一个应用程序,使用户可以选择一个文件并在获取路径后对其进行处理,我已经编写了一个代码,让我得到这样的路径Android - 选择文件并获取绝对路径

private void OpenFile() 
     { 
      Intent i = new Intent(Intent.ActionGetContent); 
      i.SetType("application/zip"); 
      StartActivityForResult(i,0); 
     } 

在对结果的活动,我解压路径如下:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
     { 
      base.OnActivityResult(requestCode, resultCode, data); 
      if (requestCode == 0) 
      { 


    if (resultCode == Result.Ok) 
        { 
string uri = data.DataString; 
        System.Uri myUri = new System.Uri(uri, System.UriKind.Absolute); 
        Android.Net.Uri uris = Android.Net.Uri.FromParts(data.Scheme, myUri.LocalPath, myUri.Fragment); 
        // string a= myUri.LocalPath; 

        System.IO.Stream input= ContentResolver.OpenInputStream(uris); 

        string uri = data.DataString; 
        ZipLogic.Unzip(uri); 
       } 
      } 
     } 

而结果是这样的模式:

content://com.android.externalstorage.documents/document/xxxx-83BB%3xxx%2Fxxx.zip 

但当我尝试从收益DirectoryNotFound异常 我不能解决如何打开这个路径作为流访问此路径。

+0

所以说,文件目录未找到。因此,在阅读之前检查该目录是否存在。 – RameshJaga

+0

是的,它存在!问题是一些涉及到开放的,因为我们只有当我们选择文件接收路径。 – Technacron

+1

检查此https://stackoverflow.com/a/20559175/2556660 – RameshJaga

回答

0

幸运的是,我通过密切注视意向数据找到了答案。

protected override void OnActivityResult(int requestCode, Result resultCode, Intent intent) 
    { 
     base.OnActivityResult(requestCode, resultCode, intent); 
     if (requestCode == 0) 
     { 
      if (resultCode == Result.Ok) 
      { 
       string uri = data.DataString; 
       //intent variable has a Field named Data which is the complete URI for the file. 
       Android.Net.Uri uris = Android.Net.Uri.FromParts(intent.Data.Scheme, intent.Data.SchemeSpecificPart, intent.Data.Fragment); 
       System.IO.Stream input = ContentResolver.OpenInputStream(intent.Data); 
       //related tasks 
      } 
     } 
    } 

说明: 选定的文件结果有一个名为数据字段中意图对象,即基本上开放的调用程序,其倾向于是一个URI对象 我用它来获得一个来自ContentResolver的输入流。