Come posso permettere agli utenti di accedere alla directory di archiviazione interna della mia app?

La mia app memorizza i file nella sua directory di archiviazione interna (/Android/data/com.mycompany.myapp/files, restituita da getFilesDir ()) e vorrei consentire agli utenti di accedere a tali file direttamente da un'applicazione di gestione dei file sul loro file dispositivo mobile o l'appplicazione desktop di Android File Transfer.

La guida per gli sviluppatori delle opzioni di storage dice:

  • Controllare la dimensione OverlayItem
  • ExceptionInInitializerError nell'applicazione Android?
  • Android: come centrare la vista all'interno della colonna di TableLayout?
  • Android - TabActivity con animation di transizione
  • android AOSP, aggiungendo un nuovo codice eseguibile
  • gestire i collegamenti in un webview
  • Per impostazione predefinita, i file salvati nella memory interna sono riservati all'applicazione e altre applicazioni non possono accedervi (né l'utente).

    "Per impostazione predefinita" implica che posso modificare le autorizzazioni predefinite per consentire agli utenti di accedere a questi file, ma non riesco a trovare alcuna documentazione su come farlo. Attualmente la directory com.mycompany.myapp è nascosta quando sfoglio la directory di / Android / data con un'applicazione per la gestione dei file.

    Attualmente sto salvando i dati di file come questo:

    String fileName = "myfile.jpg"; String filePath = getFilesDir() + File.separator + fileName; FileOutputStream fileStream = new FileOutputStream(filePath); fileData.writeTo(fileStream); // fileData is a ByteArrayOutputStream fileStream.close(); 

    Ho provato a impostare le autorizzazioni dei singoli file in modo leggibile a livello mondiale, ma questo non ha reso visibile la directory:

     FileOutputStream fileStream = this.app.openFileOutput(fileName, Context.MODE_WORLD_READABLE); 

    Ho anche controllato la documentazione per il file di AndroidManifest e non ho visto niente. Qualcuno sa come posso farlo?

  • Come posso iniziare una nuova attività android utilizzando una string?
  • C'è un modo per limitare l'importo del metodo nel file dex principale durante l'utilizzo della funzionalità MultiDex in Android Studio
  • Errore di gonfiaggio della class CollapsingToolbarLayout
  • Come configurare il progetto NDK in Android Studio 1.3
  • Versione della libreria di supporto
  • Come utilizzare il metodo OnActivityResult diverso dalla class Attività
  • 2 Solutions collect form web for “Come posso permettere agli utenti di accedere alla directory di archiviazione interna della mia app?”

    Ho esaminato più da vicino il risultato di getFilesDir() vs getExternalFilesDir() e trovato che getFilesDir() restituisce /data/data/[packagename]/files mentre getExternalFilesDir() restituisce /Android/data/[packagename]/files . Ho pensato che i file app che stavo navigando in /Android/data erano le directory di archiviazione interna, ma ora vedo che queste sono in realtà le directory di storage esterne.

    Se le directory di archiviazione interna non sono mai disponibili agli utenti regolari, vorrei che la documentazione ha detto che invece di dire che non sono disponibili "per impostazione predefinita". Per me alless, dicendo "per impostazione predefinita" implica che il comportmento predefinito può essere modificato.

    Comunque, ho provato e confermato che se elimino la mia app, i file salvati sul getExternalFilesDir() vengono eliminati automaticamente. Per soddisfare la mia esigenza di un path di archiviazione chiaramente connesso con l'applicazione (utilizza un nome di directory specifico per app e viene eliminato con l'applicazione), ma è accessibile agli utenti per la gestione di file manuali occasionali.

    Ecco un confronto che potrebbe aiutare qualcun altro a leggere questo:

    • getFilesDir () – crea una directory specifica app; nascosto dagli utenti; eliminato con l'app
    • getExternalFilesDir () – crea una directory specifica app; accessibile agli utenti; eliminato con l'app
    • getExternalStoragePublicDirectory () – utilizza una directory condivisa (ad esempio, Musica); accessibile agli utenti; rimane quando l'applicazione viene eliminata

    Penso che tu sia confuso dalla documentazione degli sviluppatori, non posso biasimarti, non è la migliore documentazione che abbia mai letto. Comunque, Android offre due modi per salvare i file nel file system:

    1. Utilizzo dell'archiviazione interna
    2. Utilizzo dell'archiviazione esterna

    L' archiviazione interna è sempre disponibile e è accessibile SOLO alla tua app, nessuna altra applicazione nel sistema può accedere ai file dell'applicazione salvata in questa partizione.

    Ora, penso che ciò che ti serve è l' archiviazione esterna perché è "leggibile in tutto il mondo" e può essere acceduto da chiunque e da qualsiasi applicazione. Il lato negativo è che potrebbe non essere disponibile poiché l'utente può montarlo su un dispositivo USB – che può essere rimosso dall'utente in qualsiasi momento.

    Non è necessario utilizzare né MODE_WORLD_WRITEABLEMODE_WORLD_READABLE come per gli stati della documentazione, perché è molto pericoloso. Inoltre, queste costanti sono state deprecate dal livello API 17

    Raccomandazione

    Se è necessario rendere pubblico i file, salvarli all'archivio esterno . Devi dichiarare un'authorization nel file manifesto per evitare che l'applicazione si blocchi each volta che acceda all'archiviazione esterna

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

    poiché l' archiviazione esterna potrebbe non essere disponibile, sarà necessario determinare lo stato prima di eseguire un'operazione, altrimenti l'applicazione verrà arrestata …

     public enum StorageState{ NOT_AVAILABLE, WRITEABLE, READ_ONLY } public StorageState getExternalStorageState() { StorageState result = StorageState.NOT_AVAILABLE; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return StorageState.WRITEABLE; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return StorageState.READ_ONLY; } return result; } 

    Ci sono ulteriori informazioni sulla documentazione e sulle cose che dovresti essere a conoscenza. Ad esempio, puoi dare alla tua properties; l'app di questi file in modo che quando l'applicazione sia disinstallata, il sistema può eliminare automaticamente questi file. Per ulteriori informazioni, fare riferimento alla documentazione sul sito Android Developers

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.