2017-08-24 173 views
1

我想获取文件的路径以便读取它。Uri得到错误的文件路径

下面的代码当我点击按钮,我开始OnBrowse()中与当前视图:

public void onBrowse(View view) { 
     Intent chooseFile; 
     Intent intent; 
     chooseFile = new Intent(Intent.ACTION_GET_CONTENT); 
     chooseFile.addCategory(Intent.CATEGORY_OPENABLE); 
     chooseFile.setType("*/*"); 
     intent = Intent.createChooser(chooseFile, "Choose a file"); 
     startActivityForResult(intent, ACTIVITY_CHOOSE_FILE); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != RESULT_OK) return; 
     String path  = ""; 
     if(requestCode == ACTIVITY_CHOOSE_FILE) 
     { 
      Uri uri = data.getData(); 
      Log.d("Path", ""+uri); 
      File myFile = new File(uri.getPath()); 
      myFile.getAbsolutePath(); 
      loadFile(myFile.getAbsolutePath()); 
     } 
    } 

    public String getRealPathFromURI(Uri contentUri) { 
     String [] proj  = {MediaStore.Images.Media.DATA}; 
     Cursor cursor  = getContentResolver().query(contentUri, proj, null, null,null); 
     if (cursor == null) return null; 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

野老一切正常,但myFile.getAbsolutePath()给我以下路径:

/document/raw:/storage/emulated/0/Download/File.txt 

当我觉得它它应该只返回storage/emulated/0/Download/File.txt

所以当我尝试读取文件时,它抛出了一个异常。

感谢

+0

试试这个https://stackoverflow.com/a/41520090/1548824 – akhilesh0707

+0

哦没有带发现后,将检查谢谢 – Bobby

+1

你不需要'Uri'的路径,而是你需要'Uri's'InputStream',参见ContentResolver'关于如何获取它的文档 – pskink

回答

0

你应该有转换的URI字符串路径试试下面的代码为

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]; 
      } 

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

      final String id = DocumentsContract.getDocumentId(uri); 
      final Uri contentUri = ContentUris.withAppendedId(
        Uri.parse("content://downloads/public_downloads"), 
        Long.valueOf(id)); 

      return getDataColumn(context, contentUri, null, null); 
     } 
     // 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 getDataColumn(context, uri, null, null); 
    } 
    // File 
    else if ("file".equalsIgnoreCase(uri.getScheme())) { 
     return uri.getPath(); 
    } 

    return null; 
} 

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()); 
} 

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 column_index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(column_index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 
+0

是没有模式的uri('uri.getScheme()== null'))一个文件吗? '/ path/to/file.ext'与'file:/ path/to/file.ext'相同吗? – k3b

0

如果你只是想要阅读的URI的内容是非常容易使用的InputStream代替的文件。没有必要翻译成文件。这也适用于HTTP及FTP URI-S

InputStream in = getContentResolver().openInputStream(uri); 
loadFromInputStream(in); 

详见sdk ContentResolver#openInputStream(uri)