Android mendapatkan ukuran bebas memori internal / eksternal


98

Saya ingin mendapatkan ukuran memori bebas pada penyimpanan internal / eksternal perangkat saya secara terprogram. Saya menggunakan bagian kode ini:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);

File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format =  Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);

dan hasil yang saya dapatkan adalah:

11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB

Masalahnya adalah saya ingin mendapatkan memori gratis SdCard yang 1,96GBsekarang. Bagaimana cara memperbaiki kode ini sehingga saya bisa mendapatkan ukuran gratis?


Pada API level 18 mereka telah mengganti nama metode untuk diakhiri dengan Long. Mungkin Anda perlu menambahkan pemeriksaan level API sebelumnya
Jayshil Dave

Semua Solusi Saya mencoba tidak bekerja siapa pun, ketika saya melakukan format sebagai penyimpanan internal ... bisakah Anda menyenangkan saya, bagaimana cara melakukannya?
Yogesh Rathi

Jawaban:


182

Di bawah ini adalah kode untuk tujuan Anda:

public static boolean externalMemoryAvailable() {
        return android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED);
    }

    public static String getAvailableInternalMemorySize() {
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSizeLong();
        long availableBlocks = stat.getAvailableBlocksLong();
        return formatSize(availableBlocks * blockSize);
    }

    public static String getTotalInternalMemorySize() {
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSizeLong();
        long totalBlocks = stat.getBlockCountLong();
        return formatSize(totalBlocks * blockSize);
    }

    public static String getAvailableExternalMemorySize() {
        if (externalMemoryAvailable()) {
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());
            long blockSize = stat.getBlockSizeLong();
            long availableBlocks = stat.getAvailableBlocksLong();
            return formatSize(availableBlocks * blockSize);
        } else {
            return ERROR;
        }
    }

    public static String getTotalExternalMemorySize() {
        if (externalMemoryAvailable()) {
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());
            long blockSize = stat.getBlockSizeLong();
            long totalBlocks = stat.getBlockCountLong();
            return formatSize(totalBlocks * blockSize);
        } else {
            return ERROR;
        }
    }

    public static String formatSize(long size) {
        String suffix = null;

        if (size >= 1024) {
            suffix = "KB";
            size /= 1024;
            if (size >= 1024) {
                suffix = "MB";
                size /= 1024;
            }
        }

        StringBuilder resultBuffer = new StringBuilder(Long.toString(size));

        int commaOffset = resultBuffer.length() - 3;
        while (commaOffset > 0) {
            resultBuffer.insert(commaOffset, ',');
            commaOffset -= 3;
        }

        if (suffix != null) resultBuffer.append(suffix);
        return resultBuffer.toString();
    }

Dapatkan Ukuran RAM

ActivityManager actManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo memInfo = new ActivityManager.MemoryInfo();
actManager.getMemoryInfo(memInfo);
long totalMemory = memInfo.totalMem;

2
getBlockSize()dan getBlockCounttidak digunakan lagi.
Nima G

2
@DineshPrajapati Terima kasih atas jawabannya, saya punya pertanyaan, Jika saya menggunakan Environment.getRootDirectory () alih-alih Environment.getDataDirectory untuk menghitung Penyimpanan Internal, saya mendapatkan beberapa keluaran .. ini mengacu pada Memori Internal memori lain ..
AK Joshi

3
@DineshPrajapati .. Diuji pada MOTO G2 Mendapatkan data yang salah untuk Penyimpanan Eksternal
AK Joshi

1
Gunakan Long in end untuk level API yang lebih baru (> 18)
Gun2sh

1
Terima kasih banyak telah berbagi pengetahuan
Kishan Soni

40

Inilah cara saya melakukannya:

StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable;
if (android.os.Build.VERSION.SDK_INT >= 
    android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
    bytesAvailable = stat.getBlockSizeLong() * stat.getAvailableBlocksLong();
}
else {
    bytesAvailable = (long)stat.getBlockSize() * (long)stat.getAvailableBlocks();
}
long megAvailable = bytesAvailable / (1024 * 1024);
Log.e("","Available MB : "+megAvailable);

2
tetapi ini dibatalkan :(
abbasalim

@ ArMo372, Apakah kalian menemukan kode pengganti untuk ini?
SimpleCoder

3
Cukup ganti getBlockSizedan getAvailableBlocksdengan getBlockSizeLongdan getAvailableBlocksLong.
smg

1
ini tidak mendapatkan ruang yang tersedia dengan benar. Ini mendapatkan 1141 bukannya 1678 @smg

1
Solusi tidak berfungsi ketika saya melakukan format sebagai penyimpanan internal ... bisakah Anda menyenangkan saya, bagaimana melakukan ini
Yogesh Rathi

27

Sejak API 9, Anda dapat melakukan:

long freeBytesInternal = new File(ctx.getFilesDir().getAbsoluteFile().toString()).getFreeSpace();
long freeBytesExternal = new File(getExternalFilesDir(null).toString()).getFreeSpace();

2
File.getUsableSpace () mungkin lebih baik karena Anda mungkin tidak menjalankan sebagai root.
Tandai

The File.getUsableSpace()terlihat seperti metode yang lebih mudah untuk digunakan daripada menggunakan StatFs. Mengapa saya menggunakan StatFs@MarkCarter?
StuStirling

1
@ DiscoS2 Anda akan menggunakan StatF jika minSdkVersion Anda kurang dari 9.
Tandai

1
Bagaimana Anda juga memantau perubahan penyimpanan?
Pengembang android

24

Untuk mendapatkan semua folder penyimpanan yang tersedia (termasuk kartu SD), Anda mendapatkan file penyimpanan terlebih dahulu:

File internalStorageFile=getFilesDir();
File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);

Kemudian Anda bisa mendapatkan ukuran yang tersedia untuk masing-masingnya.

Ada 3 cara untuk melakukannya:

API 8 dan yang lebih lama:

StatFs stat=new StatFs(file.getPath());
long availableSizeInBytes=stat.getBlockSize()*stat.getAvailableBlocks();

API 9 ke atas:

long availableSizeInBytes=file.getFreeSpace();

API 18 ke atas (tidak diperlukan jika yang sebelumnya baik-baik saja):

long availableSizeInBytes=new StatFs(file.getPath()).getAvailableBytes(); 

Untuk mendapatkan string berformat bagus dari apa yang Anda dapatkan sekarang, Anda dapat menggunakan:

String formattedResult=android.text.format.Formatter.formatShortFileSize(this,availableSizeInBytes);

atau Anda dapat menggunakan ini jika Anda ingin melihat jumlah byte yang tepat tetapi bagus:

NumberFormat.getInstance().format(availableSizeInBytes);

Perhatikan bahwa menurut saya penyimpanan internal bisa sama dengan penyimpanan eksternal pertama, karena yang pertama adalah yang diemulasikan.


EDIT: Menggunakan StorageVolume di Android Q dan di atasnya, saya pikir mungkin untuk mendapatkan ruang kosong masing-masing, menggunakan sesuatu seperti:

    val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
    val storageVolumes = storageManager.storageVolumes
    AsyncTask.execute {
        for (storageVolume in storageVolumes) {
            val uuid: UUID = storageVolume.uuid?.let { UUID.fromString(it) } ?: StorageManager.UUID_DEFAULT
            val allocatableBytes = storageManager.getAllocatableBytes(uuid)
            Log.d("AppLog", "allocatableBytes:${android.text.format.Formatter.formatShortFileSize(this,allocatableBytes)}")
        }
    }

Saya tidak yakin apakah ini benar, dan saya tidak dapat menemukan cara untuk mendapatkan ukuran total masing-masing, jadi saya menulis tentang itu di sini , dan menanyakannya di sini .


1
Bagaimana cara mendapatkan ruang kosong pada kartu SD yang dapat dilepas (atau flash drive USB OTG) pada perangkat dengan API 23? StatF baru (file.getPath ()). getAvailableBytes () atau file.getUsableSpace () memberikan 972546048 byte terlepas dari ukuran penyimpanan sebenarnya di Nexus 5 (Marshmallow 6.0.1).
berlaku pada

@isabsent Nexus 5 tidak memiliki slot kartu SD. Bagaimana Anda memeriksanya?
Pengembang android

Saya telah memeriksanya dengan flash drive USB OTG.
berlaku pada

@ absent saya tidak pernah menggunakannya. Maaf. Apakah ini berfungsi dengan baik pada API 22 dan yang lebih lama?
Pengembang android

1
@Smeet Apakah mungkin Anda mencobanya di Android 6 atau lebih tinggi? Jika demikian, mungkin masalahnya seperti ini: code.google.com/p/android/issues/detail?id=200326
pengembang android

9

@ Android-Droid - Anda salah Environment.getExternalStorageDirectory()menunjuk ke penyimpanan eksternal yang tidak harus berupa kartu SD, itu juga dapat dipasang di memori internal. Lihat:

Temukan lokasi kartu SD eksternal


7

Coba cuplikan sederhana ini

    public static String readableFileSize() {
    long availableSpace = -1L;
    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)
        availableSpace = (long) stat.getBlockSizeLong() * (long) stat.getAvailableBlocksLong();
    else
        availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();

    if(availableSpace <= 0) return "0";
    final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" };
    int digitGroups = (int) (Math.log10(availableSpace)/Math.log10(1024));
    return new DecimalFormat("#,##0.#").format(availableSpace/Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}

Terima kasih, tetapi saya memiliki java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648kesalahan, tampaknya digitGroupshasilnya adalah -2147483648.
Acuna

Solusi tidak berfungsi ketika saya melakukan format sebagai penyimpanan internal ... bisakah Anda menyenangkan saya, bagaimana melakukan ini
Yogesh Rathi

6

Sangat mudah untuk mengetahui penyimpanan yang tersedia jika Anda mendapatkan jalur penyimpanan internal maupun eksternal. Juga jalur penyimpanan eksternal ponsel sangat mudah ditemukan menggunakan

Environment.getExternalStorageDirectory (). GetPath ();

Jadi saya hanya berkonsentrasi pada cara mengetahui jalur penyimpanan eksternal yang dapat dilepas seperti kartu sd yang dapat dilepas, USB OTG (tidak diuji USB OTG karena saya tidak memiliki OTG USB).

Metode di bawah ini akan memberikan daftar semua kemungkinan jalur penyimpanan eksternal yang dapat dilepas.

 /**
     * This method returns the list of removable storage and sdcard paths.
     * I have no USB OTG so can not test it. Is anybody can test it, please let me know
     * if working or not. Assume 0th index will be removable sdcard path if size is
     * greater than 0.
     * @return the list of removable storage paths.
     */
    public static HashSet<String> getExternalPaths()
    {
    final HashSet<String> out = new HashSet<String>();
    String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
    String s = "";
    try
    {
        final Process process = new ProcessBuilder().command("mount").redirectErrorStream(true).start();
        process.waitFor();
        final InputStream is = process.getInputStream();
        final byte[] buffer = new byte[1024];
        while (is.read(buffer) != -1)
        {
            s = s + new String(buffer);
        }
        is.close();
    }
    catch (final Exception e)
    {
        e.printStackTrace();
    }

    // parse output
    final String[] lines = s.split("\n");
    for (String line : lines)
    {
        if (!line.toLowerCase(Locale.US).contains("asec"))
        {
            if (line.matches(reg))
            {
                String[] parts = line.split(" ");
                for (String part : parts)
                {
                    if (part.startsWith("/"))
                    {
                        if (!part.toLowerCase(Locale.US).contains("vold"))
                        {
                            out.add(part.replace("/media_rw","").replace("mnt", "storage"));
                        }
                    }
                }
            }
        }
    }
    //Phone's external storage path (Not removal SDCard path)
    String phoneExternalPath = Environment.getExternalStorageDirectory().getPath();

    //Remove it if already exist to filter all the paths of external removable storage devices
    //like removable sdcard, USB OTG etc..
    //When I tested it in ICE Tab(4.4.2), Swipe Tab(4.0.1) with removable sdcard, this method includes
    //phone's external storage path, but when i test it in Moto X Play (6.0) with removable sdcard,
    //this method does not include phone's external storage path. So I am going to remvoe the phone's
    //external storage path to make behavior consistent in all the phone. Ans we already know and it easy
    // to find out the phone's external storage path.
    out.remove(phoneExternalPath);

    return out;
}

Seperti yang saya ingat, menggunakan nama konstan untuk penanganan jalur mungkin tidak berfungsi pada beberapa perangkat, karena beberapa mungkin memiliki jalurnya sendiri. Saya harap ini tidak terjadi. 1 untuk usaha.
Pengembang android

1
@androiddeveloper Terima kasih sayang atas votingnya. Saya memerlukan dukungan semua untuk menguji kode ini di perangkat Anda karena saya tidak memiliki semua perangkat tetapi diuji di 4 perangkat yang berbeda dan berfungsi dengan baik. Tolong beri komentar di sini tidak berfungsi di ponsel siapa pun.
Smeet

Solusi tidak berfungsi ketika saya melakukan format sebagai penyimpanan internal ... bisakah Anda menyenangkan saya, bagaimana melakukan ini
Yogesh Rathi

4

Penambahan cepat ke topik memori Eksternal

Jangan bingung dengan nama metode externalMemoryAvailable()dalam jawaban Dinesh Prajapati.

Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())memberi Anda status memori saat ini, jika media ada dan dipasang pada titik pemasangannya dengan akses baca / tulis. Anda akan mendapatkan truebahkan pada perangkat tanpa kartu SD, seperti Nexus 5. Tapi tetap saja itu adalah metode yang 'harus dimiliki' sebelum operasi apa pun dengan penyimpanan.

Untuk memeriksa apakah ada SD-card di perangkat Anda, Anda dapat menggunakan metode ContextCompat.getExternalFilesDirs()

Itu tidak menampilkan perangkat sementara, seperti USB flash drive.

Ketahuilah juga bahwa ContextCompat.getExternalFilesDirs()pada Android 4.3 dan yang lebih rendah akan selalu mengembalikan hanya 1 entri (kartu SD jika tersedia, jika tidak Internal). Anda dapat membaca lebih lanjut di sini .

  public static boolean isSdCardOnDevice(Context context) {
    File[] storages = ContextCompat.getExternalFilesDirs(context, null);
    if (storages.length > 1 && storages[0] != null && storages[1] != null)
        return true;
    else
        return false;
}

dalam kasus saya itu sudah cukup, tetapi jangan lupa bahwa beberapa perangkat Android mungkin memiliki 2 kartu SD, jadi jika Anda membutuhkan semuanya - sesuaikan kode di atas.


2
@RequiresApi(api = Build.VERSION_CODES.O)
private void showStorageVolumes() {
    StorageStatsManager storageStatsManager = (StorageStatsManager) getSystemService(Context.STORAGE_STATS_SERVICE);
    StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
    if (storageManager == null || storageStatsManager == null) {
        return;
    }
    List<StorageVolume> storageVolumes = storageManager.getStorageVolumes();
    for (StorageVolume storageVolume : storageVolumes) {
        final String uuidStr = storageVolume.getUuid();
        final UUID uuid = uuidStr == null ? StorageManager.UUID_DEFAULT : UUID.fromString(uuidStr);
        try {
            Log.d("AppLog", "storage:" + uuid + " : " + storageVolume.getDescription(this) + " : " + storageVolume.getState());
            Log.d("AppLog", "getFreeBytes:" + Formatter.formatShortFileSize(this, storageStatsManager.getFreeBytes(uuid)));
            Log.d("AppLog", "getTotalBytes:" + Formatter.formatShortFileSize(this, storageStatsManager.getTotalBytes(uuid)));
        } catch (Exception e) {
            // IGNORED
        }
    }
}

Kelas StorageStatsManager memperkenalkan Android O dan yang lebih baru yang dapat memberi Anda byte gratis dan total dalam penyimpanan eksternal / internal. Untuk detailnya dengan kode sumber, Anda dapat membaca artikel saya berikut ini. Anda dapat menggunakan refleksi untuk yang lebih rendah dari Android O

https://medium.com/cashify-engineering/how-to-get-storage-stats-in-android-o-api-26-4b92eca6805b


2

Ini adalah cara saya melakukannya ..

Total memori internal

double totalSize = new File(getApplicationContext().getFilesDir().getAbsoluteFile().toString()).getTotalSpace();
double totMb = totalSize / (1024 * 1024);

Ukuran bebas internal

 double availableSize = new File(getApplicationContext().getFilesDir().getAbsoluteFile().toString()).getFreeSpace();
    double freeMb = availableSize/ (1024 * 1024);

Memori total dan bebas eksternal

 long freeBytesExternal =  new File(getExternalFilesDir(null).toString()).getFreeSpace();
       int free = (int) (freeBytesExternal/ (1024 * 1024));
        long totalSize =  new File(getExternalFilesDir(null).toString()).getTotalSpace();
        int total= (int) (totalSize/ (1024 * 1024));
       String availableMb = free+"Mb out of "+total+"MB";

0

Tentang menory eksternal, ada cara lain:
File external = Environment.getExternalStorageDirectory(); free:external.getFreeSpace(); total:external.getTotalSpace();


0

Setelah memeriksa solusi yang berbeda, tulis kode sendiri, ini adalah kode lengkap untuk ditemukan

  • Total Memori Eksternal
  • Memori Eksternal Bebas
  • Memori Eksternal yang Digunakan
  • Memori Internal TotaL
  • Memori Internal Terpakai
  • Memori Internal Bebas

'' ''

object DeviceMemoryUtil {
private const val error: String = "Something went wrog"
private const val noExternalMemoryDetected = "No external Storage detected"
private var totalExternalMemory: Long = 0
private var freeExternalMemory: Long = 0
private var totalInternalStorage: Long = 0
private var freeInternalStorage: Long = 0

/**
 * Checks weather external memory is available or not
 */
private fun externalMemoryAvailable(): Boolean {
    return Environment.getExternalStorageState() ==
            Environment.MEDIA_MOUNTED
}

/**
 *Gives total external memory
 * @return String Size of external memory
 * @return Boolean True if memory size is returned
 */
fun getTotalExternalMemorySize(): Pair<String?, Boolean> {
    val dirs: Array<File> = ContextCompat.getExternalFilesDirs(CanonApplication.getCanonAppInstance(), null)
    return if (externalMemoryAvailable()) {
        if (dirs.size > 1) {
            val stat = StatFs(dirs[1].path)
            val blockSize = stat.blockSizeLong
            val totalBlocks = stat.blockCountLong
            var totalExternalSize = totalBlocks * blockSize
            totalExternalMemory = totalExternalSize
            Pair(formatSize(totalExternalSize), true)
        } else {
            Pair(error, false)
        }
    } else {
        Pair(noExternalMemoryDetected, false)
    }
}

/**
 * Gives free external memory size
 * @return String Size of free external memory
 * @return Boolean True if memory size is returned
 */
fun getAvailableExternalMemorySize(): Pair<String?, Boolean> {
    val dirs: Array<File> = ContextCompat.getExternalFilesDirs(CanonApplication.getCanonAppInstance(), null)
    if (externalMemoryAvailable()) {
        return if (dirs.size > 1) {
            val stat = StatFs(dirs[1].path)
            val blockSize = stat.blockSizeLong
            val availableBlocks = stat.availableBlocksLong
            var freeExternalSize = blockSize * availableBlocks
            freeExternalMemory = freeExternalSize
            Pair(formatSize(freeExternalSize), true)
        } else {
            Pair(error, false)
        }
    } else {
        return Pair(noExternalMemoryDetected, false)
    }
}

/**
 * Gives used external memory size
 *  @return String Size of used external memory
 * @return Boolean True if memory size is returned
 */
fun getUsedExternalMemorySize(): Pair<String?, Boolean> {
    return if (externalMemoryAvailable()) {
        val totalExternalSize = getTotalExternalMemorySize()
        val freeExternalSize = getAvailableExternalMemorySize()
        if (totalExternalSize.second && freeExternalSize.second) {
            var usedExternalVolume = totalExternalMemory - freeExternalMemory
            Pair(formatSize(usedExternalVolume), true)
        } else {
            Pair(error, false)
        }
    } else {
        Pair(noExternalMemoryDetected, false)
    }
}

/**
 *Formats the long to size of memory in gb,mb etc.
 * @param size Size of memory
 */
fun formatSize(size: Long): String? {
    return android.text.format.Formatter.formatFileSize(CanonApplication.getCanonAppInstance(), size)
}

/**
 * Gives total internal memory size
 *  @return String Size of total internal memory
 * @return Boolean True if memory size is returned
 */
fun getTotalInternalStorage(): Pair<String?, Boolean> {
    if (showStorageVolumes()) {
        return Pair(formatSize(totalInternalStorage), true)
    } else {
        return Pair(error, false)
    }

}

/**
 * Gives free or available internal memory size
 *  @return String Size of free internal memory
 * @return Boolean True if memory size is returned
 */
fun getFreeInternalStorageVolume(): Pair<String?, Boolean> {
    return if (showStorageVolumes()) {
        Pair(formatSize(freeInternalStorage), true)
    } else {
        Pair(error, false)
    }
}

/**
 *For calculation of internal storage
 */
private fun showStorageVolumes(): Boolean {
    val storageManager = CanonApplication.canonApplicationInstance.applicationContext.getSystemService(Context.STORAGE_SERVICE) as StorageManager
    val storageStatsManager = CanonApplication.canonApplicationInstance.applicationContext.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager
    if (storageManager == null || storageStatsManager == null) {
        return false
    }
    val storageVolumes: List<StorageVolume> = storageManager.storageVolumes
    for (storageVolume in storageVolumes) {
        var uuidStr: String? = null
        storageVolume.uuid?.let {
            uuidStr = it
        }
        val uuid: UUID = if (uuidStr == null) StorageManager.UUID_DEFAULT else UUID.fromString(uuidStr)
        return try {
            freeInternalStorage = storageStatsManager.getFreeBytes(uuid)
            totalInternalStorage = storageStatsManager.getTotalBytes(uuid)
            true
        } catch (e: Exception) {
            // IGNORED
            false
        }
    }
    return false
}

fun getTotalInternalExternalMemory(): Pair<Long?, Boolean> {
    if (externalMemoryAvailable()) {
        if (getTotalExternalMemorySize().second) {
            if (getTotalInternalStorage().second) {
                return Pair(totalExternalMemory + totalInternalStorage, true)
            } else {
                return Pair(0, false)
            }
        }
        return Pair(0, false)
    } else {
        if (getTotalInternalStorage().second) {
            return Pair(totalInternalStorage, true)
        } else {
            return Pair(0, false)
        }
    }

}

fun getTotalFreeStorage(): Pair<Long,Boolean> {
    if (externalMemoryAvailable()){
        if(getFreeInternalStorageVolume().second){
            getFreeInternalStorageVolume()
            getAvailableExternalMemorySize()
                return Pair(freeExternalMemory + freeInternalStorage,true)
        }
        else{
            return Pair(0,false)
        }
    }
    else {
        if (getFreeInternalStorageVolume().second){
            getFreeInternalStorageVolume()
            return Pair(freeInternalStorage,true)
        }
      else{
            return Pair(0,false)
        }
    }

}}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.