Email de la mémoire de stockage interne
Sur mon application j'écris un fichier de la mémoire interne sous couverte sur développeur android. Puis plus tard, je souhaite envoyer le fichier par courriel que j'ai écrit dans la mémoire de stockage interne. Voici mon code et l'erreur que je reçois, toute aide sera appréciée.
FileOutputStream fos = openFileOutput(xmlFilename, MODE_PRIVATE);
fos.write(xml.getBytes());
fos.close();
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("text/plain");
...
Uri uri = Uri.fromFile(new File(xmlFilename));
intent.putExtra(android.content.Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Send eMail.."));
Et l'erreur est
file://attachement chemin d'accès doit pointer vers file://mnt/sdcard. Ignorant fichier de la pièce jointe://...
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez trouvé un bug (ou au moins une limitation inutile) dans l'android Gmail client. J'ai été en mesure de le contourner, mais il me semble que trop de mise en œuvre spécifiques, et aurait besoin d'un peu plus de travail pour être portable:
Première CommonsWare est très correct sur la nécessité de rendre le fichier lisible par tout le monde:
Prochain, nous avons besoin de travailler autour de Gmail insistance sur le répertoire /mnt/sdcard (ou la mise en œuvre spécifique équivalent?) chemin d'accès:
Au moins sur mon modifiée en pain d'épice de l'appareil, c'est de me laisser Gmail une pièce jointe de stockage privé pour moi, et voir le contenu en utilisant le bouton aperçu quand je le reçois. Mais je ne me sens pas très "bon" à propos d'avoir à faire à faire fonctionner, et qui sait ce qui pourrait arriver avec une autre version de Gmail ou un autre client de messagerie ou un téléphone qui monte le stockage externe ailleurs.
J'ai été aux prises avec ce problème dernièrement, et je voudrais faire part de la solution que j'ai trouvé, à l'aide de FileProvider, à partir de la bibliothèque de prise en charge. c'est une extension de Fournisseur de Contenu qui permettent de résoudre ce problème sans travail, et ce n'est pas trop-beaucoup de travail.
Comme expliqué dans le lien pour activer le fournisseur de contenu:
dans le manifeste, écrire:
les méta-données doivent indiquer un fichier xml dans res/xml dossier (j'ai nommé file_paths.xml):
le chemin est vide lorsque vous utilisez les fichiers internes du dossier, mais si, pour plus de la location (nous en sommes à parler de la mémoire de stockage interne de chemin de), vous devez utiliser d'autres chemins. le nom que vous écrivez sera utilisé pour l'url que le fournisseur de contenu à donner au fichier.
et maintenant, vous pouvez en générer un nouveau, lisible par tout le monde url en utilisant simplement:
sur n'importe quel fichier à partir d'un chemin d'accès dans le res/xml/file_paths.xml les métadonnées.
et maintenant seulement utiliser:
vous n'avez pas besoin de donner une autorisation, vous le faites automatiquement lorsque vous connectez l'url du fichier.
et vous n'avez pas besoin de faire de votre fichier MODE_WORLD_READABLE, ce mode est maintenant obsolète, faire MODE_PRIVATE, le fournisseur de contenu crée de nouvelles url pour le même fichier qui est accessible par d'autres applications.
Je tiens à noter que je l'ai testé sur un émulateur avec Gmail.
Chris Stratton proposé la bonne solution. Cependant, il échoue sur un grand nombre d'appareils. Vous ne devriez pas coder en dur le répertoire /mnt/sdcard chemin. Vous feriez mieux de calcul:
Tenant compte des recommandations de ici: http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE, depuis API 17 nous sommes encouragés à utiliser ContentProviders etc.
Grâce à ce gars et son poste http://stephendnicholas.com/archives/974 nous avons une solution:
De créer un fichier dans le cache Interne:
Installation Intention:
Et enregistrer fournisseur de Contenu dans le fichier AndroidManifest:
android:grantUriPermissions="true"
pour le fournisseur.a fonctionné pour moi.
L'erreur est assez particulier: vous devez utiliser le fichier de de stockage externe afin de rendre une pièce jointe.
MODE_PRIVATE
àMODE_WORLD_READABLE
. Puisque vous n'avez pas à écrire le programme de courriel, il ne peut pas lire vos fichiers privés.MODE_PRIVATE
àMODE_WORLD_READABLE
").Si vous allez utiliser un espace de stockage interne, essayez d'utiliser exactement le chemin de stockage:
ou en changer le nom du fichier dans le débogueur et il suffit d'appeler "nouveau Fichier(bla).exists()" sur chaque fichier pour voir rapidement ce exact est le nom de votre fichier
il pourrait aussi être un périphérique réel problème de mise en œuvre spécifiques à votre appareil. avez-vous essayé d'utiliser d'autres appareils/émulateur?