2011-04-23 3 views
13

j'ai une application qui enregistre les fichiers téléchargés à partir d'un serveur. Ces fichiers ne sont pas privés à mon application et devraient également être accessibles à d'autres applications. Je veux savoir quel serait le bon chemin pour sauvegarder ces fichiers lorsque la carte SD est ABSENTE. Pour la carte SD, il est l'API bien connue -Enregistrement des fichiers publics dans le stockage interne

getExternalStorageDirectory() 

Pour les données privées de l'application dans la mémoire interne, il est -

Context.getFilesDir() 

Sur certains appareils, la mémoire interne est représentée par/CMEM /.

Il sera très utile si quelqu'un pouvait élaborer sur/CMEM /. Je sais qu'il est synonyme de carte mémoire intégrée et n'est pas présent dans tous les appareils. Mais est-ce vraiment représentatif de la mémoire interne? Ou est-ce le troisième souvenir?

Dois-je sauvegarder les fichiers en utilisant openFileOutput() avec MODE_WORLD_READABLE?

Répondre

9

Sur certains périphériques, la mémoire interne est représentée par/emmc /.

/emmc/ peuvent exister sur certains appareils, et il peut être interne, mais il ne peut pas être accessible aux applications, et il est certainement pas partie du SDK Android à moins que cela arrive à être ce que getExternalStorageDirectory() retours.

Mais est-ce vraiment représentatif de la mémoire interne?

n °

Ou est-ce la troisième mémoire?

Demandez le fabricant de votre appareil.

Dois-je sauvegarder les fichiers en utilisant openFileOutput() avec MODE_WORLD_READABLE?

Il est impossible de répondre dans l'abstrait. Vous dites que vos fichiers "devraient également être accessibles à d'autres applications", mais vous n'avez pas indiqué pourquoi vous vous attendez à ce qu'une autre application se soucie un peu de vos fichiers. Les autres applications ne rechercheront pas les fichiers dans vos répertoires. Au mieux, ils permettront aux utilisateurs de parcourir le stockage externe. La seule raison d'avoir un fichier MODE_WORLD_READABLE est si votre application va déclencher une autre application pour faire quelque chose avec le fichier (par exemple, ACTION_VIEWIntent).

+0

Merci CommonsWare! Oui, mon application déclenchant d'autres applications avec ACTION_VIEW est exactement la raison pour laquelle j'appelle ces fichiers public. De plus, comme certains explorateurs de fichiers et applications scannent la carte SD ainsi que la mémoire interne, je veux qu'ils puissent trouver ces fichiers. Donc, ma question demeure, où enregistrer le fichier au cas où la carte SD est introuvable? – Akshay

+0

@Akhay: "De plus, comme certains explorateurs de fichiers et applications scannent la carte SD ainsi que la mémoire interne, je veux qu'ils puissent trouver ces fichiers." - Ce n'est pas possible, ou si c'est le cas, c'est un trou de sécurité majeur. "Alors, ma question demeure, où enregistrer le fichier au cas où la carte SD n'est pas trouvée?" - 'getFilesDir()'. – CommonsWare

+0

Merci CommonsWare! J'essaie de comprendre cela clairement. Mon application peut être comparée à un client de messagerie qui télécharge des pièces jointes et permet aux visionneuses de documents et aux lecteurs multimédias d'ouvrir ces fichiers. Où un client de messagerie enregistrerait-il les fichiers si la carte SD est absente? N'y a-t-il pas de répertoire public dans la mémoire interne? Quelque chose comme/internal_memory/downloads? Pourquoi envisageriez-vous de scanner la mémoire interne comme un trou de sécurité? Juste pour confirmer, la mémoire interne implique la mémoire de l'appareil/téléphone, n'est-ce pas? Désolé pour la vague de questions. – Akshay

14

Je sais que c'est vieux et a une réponse acceptée, mais je pense que la question est toujours d'actualité et qu'il existe un moyen de parvenir à ce que le demandeur veut. Pour paraphraser, je pense que le demandeur souhaite enregistrer un fichier et le rendre accessible (par exemple pour le visionnage) par d'autres applications, sans avoir à penser au stockage externe (par exemple, une permission supplémentaire et la possibilité que le stockage externe soit pas présent).

Il se avère que vous pouvez faire vos propres fichiers lisibles par d'autres applications.

File file = new File(ctx.getCacheDir(), "picture");    
... 
file.setReadable(true, false); 
    // makes file readable to other apps 

// Get another app to view my picture 
Uri uri = Uri.fromFile(file);   
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "image/*"); 
ctx.startActivity(intent); 

Le setReadable fait le travail de code ci-dessus pour moi - sans cette ligne l'application spectateur ne pouvait pas lire le fichier. Notez que setReadable fonctionne sur tout le répertoire, donc la meilleure solution est probablement de créer un sous-répertoire 'public' et d'y placer vos fichiers.

+3

Votre sauveur! La réponse acceptée se concentre trop sur pourquoi vous ne devriez pas faire cela et pas le comment. –

Questions connexes