2015-07-01 9 views
6

Ho un'applicazione che consente all'utente di selezionare la destinazione del supporto tramite SAF utilizzando OPEN_DOCUMENT_TREE. Quando vengono aggiunti nuovi file multimediali, vorrei verificare che ci sia una quantità minima di spazio invece di riempirlo. Può anche essere usato per selezionare la quantità di cache dei file se la dimensione della destinazione è nota.Determinazione dello spazio disponibile all'interno di Storage Access Framework per 5.0+ OS ver

AFAIK, DocumentFile, ecc. Non ti dà nulla. Tecnicamente, se passi attraverso OPEN_DOCUMENT_TREE, la destinazione effettiva non è nota, mentre potrebbe essere la sdcard, potrebbe anche essere una destinazione cloud.

Tuttavia, forse qualcuno ha fatto abbastanza sperimentazioni per determinare in modo affidabile l'unità flash utilizzata. Se l'utente sceglie la partizione primaria, può essere estratta da DocumentFile, almeno posso escludere lo spazio primario. I punti di montaggio della Sdcard variano a seconda dei dispositivi, pertanto ottenere una mappa accurata potrebbe essere problematico.

Posso ottenere lo spazio delle schede SD disponibili utilizzando getFilesDir standard o getMediaFilesDir e utilizzare il file per ottenere lo spazio disponibile.

Quindi, come trovare lo spazio se si dispone solo di un oggetto DocumentFile?

+0

Ho indagato su questo. Quale categoria e tipo MIME utilizzi quando crei le tue intenzioni con OPEN_DOCUMENT_TREE? Non sono stato in grado di trovare una combinazione che funzioni. –

+0

Beh ... nessuno, dato che è una directory e non un file. Quindi, solo Intento (Intent.ACTION_OPEN_DOCUMENT_TREE) quindi avviare l'attività con risultato. Sono in grado di acquisire la directory e usarla, ho solo bisogno dello spazio disponibile ora. – Bruce

+0

@ Bruce hai lavorato a questo? Ho lo stesso problema io stesso. Grazie. – brindy

risposta

3

Ok, ho trovato una soluzione. Questo è stato testato su Android 5.1 set-top-box. Per prima cosa, ottieni l'alberoUri da ACTION_OPEN_DOCUMENT_TREE. Quindi effettuare le seguenti operazioni:

Uri docTreeUri = DocumentsContract.buildDocumentUriUsingTree(
      treeUri, 
      DocumentsContract.getTreeDocumentId(treeUri) 
    ); 
    try { 
     ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(docTreeUri, "r"); 
     assert pfd != null; 
     StructStatVfs stats = Os.fstatvfs(pfd.getFileDescriptor()); 
     Log.i(LOG_TAG, "block_size=" + stats.f_bsize + ", num_of_blocks=" + stats.f_bavail); 
     Log.i(LOG_TAG, "free space in Megabytes:" + stats.f_bavail * stats.f_bsize/1024/1024); 
    } catch (FileNotFoundException | ErrnoException e) { 
     Log.e(LOG_TAG, Log.getStackTraceString(e)); 
    } 
Problemi correlati