2017-06-20 65 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的輸入流。