EDIT ( 02 janvier 2012 ):
J'ai créé un petit projet de bibliothèque Android open source qui rationalise ce processus, tout en fournissant également un explorateur de fichiers intégré (au cas où l'utilisateur n'en aurait pas). C'est extrêmement simple à utiliser, ne nécessitant que quelques lignes de code.
Vous pouvez le trouver sur GitHub: aFileChooser .
ORIGINAL
Si vous voulez que l'utilisateur puisse choisir n'importe quel fichier dans le système, vous devrez inclure votre propre gestionnaire de fichiers ou conseiller à l'utilisateur d'en télécharger un. Je pense que le mieux que vous puissiez faire est de rechercher un contenu "ouvrable" Intent.createChooser()
comme celui-ci:
private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
Vous pouvez ensuite écouter le fichier sélectionné est Uri
dans onActivityResult()
comme ceci:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
Log.d(TAG, "File Uri: " + uri.toString());
// Get the path
String path = FileUtils.getPath(this, uri);
Log.d(TAG, "File Path: " + path);
// Get the file instance
// File file = new File(path);
// Initiate the upload
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
La getPath()
méthode dans mon FileUtils.java
est:
public static String getPath(Context context, Uri uri) throws URISyntaxException {
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = { "_data" };
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow("_data");
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
// Eat it
}
}
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}