2017-04-27 29 views
0

我使用一個呈現器從系統中選取文件並將其顯示在應用程序中。我用xamarin表單應用程序中的文件選取器

Intent intent = new Intent(Intent.ActionOpenDocument); 
      intent.SetType("file/*"); 
      intent.AddCategory(Intent.CategoryOpenable); 
      String[] mimeTypes = { "text/csv", "text/comma-separated-values" ,"application/pdf","image/*"}; 
      intent.SetType("*/*"); 
      intent.PutExtra(Intent.ExtraMimeTypes, mimeTypes); 
      ((FormsAppCompatActivity)Forms.Context).StartActivityForResult(intent, 7007); 

而且我在MainActivity中獲得了OnActivityResult中的數據。現在,我有我的Android.Net.Uri我想找到絕對文件路徑。這裏我用

public String getRealPathFromURI(Android.Net.Uri contentUri) 
     { 
      String res = null; 
      String[] proj = {Android.Provider.MediaStore.Images.Media.InterfaceConsts.Data}; 
      ICursor cursor = ContentResolver.Query(contentUri, proj, null, null, null); 
      if (cursor.MoveToFirst()) 
      {     
       int column_index = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Images.Media.InterfaceConsts.Data); 
       res = cursor.GetString(column_index); 
      } 
      cursor.Close(); 
      return res; 
     } 

我在棉花糖設備測試,但我收到空值作爲返回每一次。任何指導?

回答

1

You can take a look to this plugin...

有一個IOUtil.cs類

public class IOUtil 
{ 

    public static string getPath (Context context, Android.Net.Uri uri) 
    { 
     bool isKitKat = Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat; 

     // DocumentProvider 
     if (isKitKat && DocumentsContract.IsDocumentUri (context, uri)) { 
      // ExternalStorageProvider 
      if (isExternalStorageDocument (uri)) { 
       var docId = DocumentsContract.GetDocumentId (uri); 
       string [] split = docId.Split (':'); 
       var type = split [0]; 

       if ("primary".Equals (type, StringComparison.OrdinalIgnoreCase)) { 
        return Android.OS.Environment.ExternalStorageDirectory + "/" + split [1]; 
       } 

       // TODO handle non-primary volumes 
      } 
      // DownloadsProvider 
      else if (isDownloadsDocument (uri)) { 

       string id = DocumentsContract.GetDocumentId (uri); 
       Android.Net.Uri contentUri = ContentUris.WithAppendedId (
         Android.Net.Uri.Parse ("content://downloads/public_downloads"), long.Parse (id)); 

       return getDataColumn (context, contentUri, null, null); 
      } 
      // MediaProvider 
      else if (isMediaDocument (uri)) { 
       var docId = DocumentsContract.GetDocumentId (uri); 
       string [] split = docId.Split (':'); 
       var type = split [0]; 

       Android.Net.Uri contentUri = null; 
       if ("image".Equals (type)) { 
        contentUri = MediaStore.Images.Media.ExternalContentUri; 
       } else if ("video".Equals (type)) { 
        contentUri = MediaStore.Video.Media.ExternalContentUri; 
       } else if ("audio".Equals (type)) { 
        contentUri = MediaStore.Audio.Media.ExternalContentUri; 
       } 

       var selection = "_id=?"; 
       var selectionArgs = new string [] { 
        split[1] 
       }; 

       return getDataColumn (context, contentUri, selection, selectionArgs); 
      } 
     } 
     // MediaStore (and general) 
     else if ("content".Equals (uri.Scheme, StringComparison.OrdinalIgnoreCase)) { 
      return getDataColumn (context, uri, null, null); 
     } 
     // File 
     else if ("file".Equals (uri.Scheme, StringComparison.OrdinalIgnoreCase)) { 
      return uri.Path; 
     } 

     return null; 
    } 

    public static string getDataColumn (Context context, Android.Net.Uri uri, string selection, 
    string [] selectionArgs) 
    { 

     ICursor cursor = null; 
     var column = "_data"; 
     string [] projection = { 
      column 
     }; 

     try { 
      cursor = context.ContentResolver.Query (uri, projection, selection, selectionArgs, 
        null); 
      if (cursor != null && cursor.MoveToFirst()) { 
       int column_index = cursor.GetColumnIndexOrThrow (column); 
       return cursor.GetString (column_index); 
      } 
     } finally { 
      if (cursor != null) 
       cursor.Close(); 
     } 
     return null; 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is ExternalStorageProvider. 
    */ 
    public static bool isExternalStorageDocument (Android.Net.Uri uri) 
    { 
     return "com.android.externalstorage.documents".Equals (uri.Authority); 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is DownloadsProvider. 
    */ 
    public static bool isDownloadsDocument (Android.Net.Uri uri) 
    { 
     return "com.android.providers.downloads.documents".Equals (uri.Authority); 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is MediaProvider. 
    */ 
    public static bool isMediaDocument (Android.Net.Uri uri) 
    { 
     return "com.android.providers.media.documents".Equals (uri.Authority); 
    } 

    public static byte [] readFile (string file) 
    { 
     try { 
      return readFile (new File (file)); 
     } catch (Exception ex) { 
      System.Diagnostics.Debug.Write (ex); 
      return new byte [0]; 
     } 
    } 

    public static byte [] readFile (File file) 
    { 
     // Open file 
     var f = new RandomAccessFile (file, "r"); 

     try { 
      // Get and check length 
      long longlength = f.Length(); 
      var length = (int)longlength; 

      if (length != longlength) 
       throw new IOException ("Filesize exceeds allowed size"); 
      // Read file and return data 
      byte [] data = new byte [length]; 
      f.ReadFully (data); 
      return data; 
     } catch (Exception ex) { 
      System.Diagnostics.Debug.Write (ex); 
      return new byte [0]; 
     } finally { 
      f.Close(); 
     } 
    } 

    public static string GetMimeType (string url) 
    { 
     string type = null; 
     var extension = MimeTypeMap.GetFileExtensionFromUrl (url); 

     if (extension != null) { 
      type = MimeTypeMap.Singleton.GetMimeTypeFromExtension (extension); 
     } 

     return type; 
    } 
} 

它在這樣

protected override void OnActivityResult (int requestCode, [GeneratedEnum] Result resultCode, Intent data) 
    { 
     base.OnActivityResult (requestCode, resultCode, data); 

     if (resultCode == Result.Canceled) { 
      // Notify user file picking was cancelled. 
      OnFilePickCancelled(); 
      Finish(); 
     } else { 
      System.Diagnostics.Debug.Write (data.Data); 
      try { 
       var _uri = data.Data; 

       var filePath = IOUtil.getPath (context, _uri); 

       if (string.IsNullOrEmpty (filePath)) 
        filePath = _uri.Path; 

       var file = IOUtil.readFile (filePath); 

       var fileName = GetFileName (context, _uri); 

       OnFilePicked (new FilePickerEventArgs (file, fileName, filePath)); 
      } catch (Exception readEx) { 
       // Notify user file picking failed. 
       OnFilePickCancelled(); 
       System.Diagnostics.Debug.Write (readEx); 
      } finally { 
       Finish(); 
      } 
     } 
    } 
+0

這並真正幫助謝謝 –

相關問題