2012-07-02 1 views
0

У меня есть активность, когда пользователи нажимают «share» в файле, он откроет мое приложение и начнет загружать файл. Теперь это отлично работает с изображениями, потому что URI вернулся для MediaStore. Но я хочу, чтобы иметь возможность вернуть URI из любого источника, например, из ES File ExplorerКак вернуть работоспособный путь к файлу?

Вот текущий код:

public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
    } 

Как я могу сделать это так, вместо MediaStore он будет использоваться для любой тип файла?

ответ

0

Вы не можете этого сделать. Вы можете использовать его для хранилища мультимедиа, чтобы путь к этим изображениям хранился во встроенной базе данных SQLite, но файлы на вашей SD-карте не имеют записей в базе данных.

Вы можете проверить, если схема URI, является содержанием или файла, а также использовать различные методы, чтобы получить доступ к файлу следующим образом:

public String getPath(Uri uri) { 
     if(uri.getScheme().equals("content")){ 
       String[] projection = { MediaStore.Images.Media.DATA }; 
       Cursor cursor = managedQuery(uri, projection, null, null, null); 
       int column_index = cursor.getColumnIndexOrThrow(
         MediaStore.Images.Media.DATA); 
       cursor.moveToFirst(); 
       return cursor.getString(column_index); 
     } else if(uri.getScheme().equals("file")){ 
       File myFile = new File(uri); 
       return myFile.getAbsolutePath(); 
     } 
} 
+0

Спасибо, работал как шарм, но с некоторыми незначительными изменениями. Этот код не позволял мне скомпилировать, пока я не забрал «if (uri.getScheme(). Equals (« file »)» и добавит дополнительную скобку после (uri.getScheme(). Equals («content») и Я сделал File myFile = новый файл (uri.getPath()); – Zakukashi

+0

О, извините за те опечатки, я обновил свой ответ. Спасибо, что указали это. –

1

Я рекомендую пропустить шаг пути (если это возможно) и идти прямо на получение InputStream, который может упростить вещи немного:

public InputStream getInputStream(Uri uri) { 
    InputStream stream = null; 
    String scheme = uri.getScheme(); 
    try { 
     if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme) || ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) { 
      stream = getContentResolver().openInputStream(uri); 
     } else if ("https".equals(scheme) || "http".equals(scheme)) { 
      // ContentResolver can't handle web uris. Handle or skip them as you see fit. 
     }   
    } catch (FileNotFoundException e) { 
     // Handle the exception however you see fit. 
    } 
    return stream; 
} 

Я бы благоприятствовать с помощью ContentResolver и позволяя ему разобраться в специфике ... Например, что произойдет, если вы получаете контент URI, который не является связанные с MediaStore? Позволив ContentResolver справиться с этим, вам не нужно заботиться.

+0

Интересно, я попробую это в ближайшее время. – Zakukashi