2016-08-02 7 views
0

Im создание приложения, которое позволяет вам выбирать файлы с вашего устройства и прикреплять их к объекту MailMessage в качестве вложения. Используя следующий код, я смог взять содержимое uri изображения с устройства, а затем использовать его, чтобы указать путь к файлу в виде строки. Как мне поменять этот код на работу с файлами типа .doc/.docx/pdf?Поиск пути к файлу из внутреннего хранилища

{ 
     string filePath = null; 
     Uri _uri = data.Data; 
     if (_uri != null && "content".Equals(_uri.Scheme)) 
     { 
      ICursor cursor = this.ContentResolver.Query(_uri, new String[] { Android.Provider.MediaStore.Images.ImageColumns.Data }, null, null, null); 
      cursor.MoveToFirst(); 
      filePath = cursor.GetString(0); 
      cursor.Close(); 
     } 
     else 
     { 
      filePath = _uri.Path; 
     } 
     return filePath; 
    } 
+0

Не пытайтесь декодировать URI в путь файловой системы. Вы также можете использовать uri для указания вложения. Или нет? – greenapps

+0

'intent .putExtra (Intent.EXTRA_STREAM, uri);' – greenapps

ответ

0

вы можете попробовать GetPath

public class Uris { 

    private static String getFileName(Context context, Uri uri) { 
     String result = null; 
     if (uri.getScheme().equals("content")) { 
      Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); 
      try { 
       if (cursor != null && cursor.moveToFirst()) { 
        result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 
       } 
      } finally { 
       cursor.close(); 
      } 
     } 
     if (result == null) { 
      result = uri.getPath(); 
      int cut = result.lastIndexOf('/'); 
      if (cut != -1) { 
       result = result.substring(cut + 1); 
      } 
     } 
     return result; 
    } 




    @TargetApi(Build.VERSION_CODES.KITKAT) 
    public static String getPath(final Context context, final Uri uri) 
    { 
    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

    // DocumentProvider 
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 

     // ExternalStorageProvider 
     if (isExternalStorageDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      if ("primary".equalsIgnoreCase(type)) { 
       return Environment.getExternalStorageDirectory() + "/" + split[1]; 
      } 
     } 
     // DownloadsProvider 
     else if (isDownloadsDocument(uri)) { 
/* 
      final String id = DocumentsContract.getDocumentId(uri); 
      final Uri contentUri = ContentUris.withAppendedId(
        Uri.parse("content://<span id=\"IL_AD1\" class=\"IL_AD\">downloads</span>/public_downloads"), Long.valueOf(id)); 
      return getDataColumn(context, contentUri, null, null); 
*/ 
      String fileName = getFileName(context, uri); 
      File downFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "/"+fileName); 
      return downFile.getAbsolutePath(); 
     } 
     // MediaProvider 
     else if (isMediaDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 

      Uri contentUri = null; 
      if ("image".equals(type)) { 
       contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      } else if ("video".equals(type)) { 
       contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
      } else if ("audio".equals(type)) { 
       contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      } 

      final String selection = "_id=?"; 
      final String[] selectionArgs = new String[] { 
        split[1] 
      }; 

      return getDataColumn(context, contentUri, selection, selectionArgs); 
     } 
    } 
    // MediaStore (and general) 
    else if ("content".equalsIgnoreCase(uri.getScheme())) { 

     // Return the remote address 
     if (isGooglePhotosUri(uri)) 
      return uri.getLastPathSegment(); 

     return getDataColumn(context, uri, null, null); 
    } 
    // File 
    else if ("file".equalsIgnoreCase(uri.getScheme())) { 
     return uri.getPath(); 
    } 

    return null; 
} 

    /** 
    * Get the value of the data column for this Uri. This is useful for 
    * MediaStore Uris, and other file-based ContentProviders. 
    * 
    * @param context The context. 
    * @param uri The Uri to query. 
    * @param selection (Optional) Filter used in the query. 
    * @param selectionArgs (Optional) Selection arguments used in the query. 
    * @return The value of the _data column, which is typically a file path. 
    */ 
    public static String getDataColumn(Context context, Uri uri, String selection, 
             String[] selectionArgs) { 

     Cursor cursor = null; 
     final String column = "_data"; 
     final String[] projection = { 
       column 
     }; 

     try { 
      cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, 
        null); 
      if (cursor != null && cursor.moveToFirst()) { 
       final int index = cursor.getColumnIndexOrThrow(column); 
       return cursor.getString(index); 
      } 
     } finally { 
      if (cursor != null) 
       cursor.close(); 
     } 
     return null; 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is ExternalStorageProvider. 
    */ 
    public 
    static boolean isExternalStorageDocument(Uri uri) { 
     return "com.android.externalstorage.documents".equals(uri.getAuthority()); 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is DownloadsProvider. 
    */ 
    public static boolean isDownloadsDocument(Uri uri) { 
     return "com.android.providers.downloads.documents".equals(uri.getAuthority()); 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is MediaProvider. 
    */ 
    public static boolean isMediaDocument(Uri uri) { 
     return "com.android.providers.media.documents".equals(uri.getAuthority()); 
    } 

    /** 
    * @param uri The Uri to check. 
    * @return Whether the Uri authority is Google <span id="IL_AD8" class="IL_AD">Photos</span>. 
    */ 
    public static boolean isGooglePhotosUri(Uri uri) { 
     return "com.google.android.apps.photos.content".equals(uri.getAuthority()); 
    } 

} 
Смежные вопросы