2015-11-06 2 views
0

J'ai ce code:Comment obtenir tout type de fichier avec intent.createChooser Android

protected void pickFile(View view){ 

    ///Codigo que abre la galeria de imagenes y carga la imagen en displayedImage 

    Intent intent = new Intent(); 
    intent.setType("file/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Choose File to Upload"), 1); 

} 

//It's executed when leaving file system 
@Override 
protected void onActivityResult(int reqCode, int resCode, Intent data){ 
    super.onActivityResult(reqCode, resCode, data); 

    if (reqCode == 1 && resCode == RESULT_OK && data != null) { 
     Uri selectedFile = data.getData(); 
     RequestMaker.uploadFile(this, selectedFile, "this is a file"); 
    } 
} 

Ce que je veux faire est d'être en mesure de sélectionner un fichier à partir de mon téléphone et l'envoyer.

Le code fonctionne, il ouvre le sélecteur et me permet de rechercher n'importe quel fichier. Cependant, il y a quelques problèmes que j'ai:

  • Lorsque j'essaie d'accéder via l'option "Stockage interne", je ne peux sélectionner aucun élément. Ils sont tous handicapés. J'ai corrigé cela en installant un gestionnaire de fichiers et il me permet de choisir les fichiers que je veux, mais peut-être y a-t-il une solution rapide pour cela.
  • Lorsque je sélectionne le fichier et exécute Uri.getPath(), parfois le chemin est valide, d'autres, et en général quand je sélectionne un fichier image, il y a une erreur avec le chemin que je reçois en retour. Ce n'est pas le vrai. J'ai vu quelques correctifs en ligne mais ils sont tous pour sélectionner des images de la galerie, je veux le général.

Comment puis-je résoudre ce problème?

Répondre

1

Le code fonctionne

Non, il ne fonctionne pas.

Tout d'abord, file/* n'est pas un type MIME valide, ni même un type MIME générique. There is no MIME type that begins with file/. Si vous voulez un type MIME, essayez */*.

Deuxièmement, ACTION_GET_CONTENT ne permet pas à l'utilisateur de "sélectionner un fichier". Il permet à l'utilisateur de choisir un élément contenu, à partir de n'importe quelle application sur le périphérique qui implémente une activité ACTION_GET_CONTENT qui choisit d'honorer votre type MIME. Ce qui est retourné par cette activité est un Uri pointant vers le contenu . Cela ne doit pas nécessairement être un fichier local, encore moins celui auquel vous avez un accès direct au système de fichiers.

Lorsque je sélectionne le fichier et lancez Uri.getPath(), parfois le chemin est valide

Non, le chemin est toujours valide (au moins, pendant un certain temps). Ce n'est pas ce que tu penses. A Uri is not a file.

Par exemple, vous visualisez probablement cette page Web dans un navigateur Web. Si vous regardez dans la barre d'adresse de ce navigateur Web, vous verrez l'adresse suivante:

https://stackoverflow.com/questions/33575449/how-to-get-any-type-of-file-with-intent-createchooser-android 

Par votre façon de penser, cela fait référence à un fichier, sur votre disque dur, situé à /questions/33575449/how-to-get-any-type-of-file-with-intent-createchooser-android.

Ce n'est pas le cas. Une partie de l'URL indique un emplacement où le chemin est pertinent; dans ce cas, il se réfère à un serveur Web. Un Uri est la même chose. En particulier, si le Uri a un schéma autre que file:, le Uri est simplement une adresse, qui ne correspond pas nécessairement à tout ce que vous pouvez obtenir directement.Tout comme les développeurs de navigateurs Web utilisent HTTP pour obtenir un flux sur le contenu de cette page Web, vous devez utiliser ContentResolver et openInputStream() pour obtenir le contenu des valeurs content:Uri.

Comment puis-je résoudre ce problème?

Soit:

  • Utilisez le Uricomme Uri, avec openInputStream(), getType() et méthodes similaires sur ContentResolver ou

  • Ne pas utiliser ACTION_GET_CONTENT, mais plutôt construire votre propre interface utilisateur pour parcourir les fichiers que votre application est en mesure d'atteindre. Ce sera un sous-ensemble de tous les fichiers sur l'appareil, car tout n'est pas dans un emplacement auquel votre application a accès (par exemple, les fichiers sur support amovible seront manqués). Mais, il synchronise votre code avec votre modèle mental (c'est-à-dire, que vous voulez des fichiers, pas de contenu).