Android는 내부 / 외부 메모리의 무료 크기를 얻습니다.


98

내 장치의 내부 / 외부 저장소에있는 사용 가능한 메모리의 크기를 프로그래밍 방식으로 얻고 싶습니다. 이 코드를 사용하고 있습니다.

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);

그리고 내가 얻는 결과는 다음과 같습니다.

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

문제는 1,96GB지금 SdCard의 여유 메모리를 얻고 싶다는 것 입니다. 무료 크기를 얻을 수 있도록이 코드를 어떻게 수정할 수 있습니까?


API 레벨 18부터는 Long으로 끝나도록 메소드 이름을 변경했습니다. 아마 당신은 이전에 API 수준의 검사를 추가해야합니다
Jayshil 데이브에게

모든 솔루션 내가 내부 저장소로 포맷 할 때 아무도 일하지 않으려 고 노력했습니다 ... 나를 기쁘게 해줄 수 있습니까? 어떻게 이것을 달성합니까?
Yogesh Rathi

답변:


182

다음은 귀하의 목적에 맞는 코드입니다.

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();
    }

RAM 크기 얻기

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

2
getBlockSize()그리고 getBlockCount사용되지 않습니다.
Nima G

2
@DineshPrajapati 답을 주셔서 감사합니다. 내부 저장소를 계산하는 데 Environment.getDataDirectory 대신 Environment.getRootDirectory ()를 사용하면 일부 출력이 표시됩니다. 이것은 내부 메모리 다른 메모리를 참조합니다.
AK Joshi

3
@DineshPrajapati .. MOTO의 G2에서 테스트는 외부 저장 장치에 대한 잘못된 데이터를 얻기
AK 조시

1
최신 API 레벨 (> 18)을 위해 마지막에 Long 사용
Gun2sh 2015 년

1
지식 공유를 위해 정말 감사
Kishan SONI에게

40

이것이 내가 한 방법입니다.

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
그러나 이것은 타락되었습니다 :(
abbasalim aug

@ ArMo372, 당신이 이것에 대한 대체 코드를 찾았습니까?
SimpleCoder 2016

3
getBlockSizegetAvailableBlocksgetBlockSizeLong및로 바꾸십시오 getAvailableBlocksLong.
smg

1
이것은 올바른 사용 가능한 공간을 얻지 못합니다. 이 대신 1678 @smg의 1141을 받고있다

1
내가 내부 저장소로 포맷을 수행 할 때 솔루션 당신이 나를 기쁘게 할 수 ... 작동하지 않는이 달성하는 방법
인 Yogesh 라티

27

API 9부터 다음을 수행 할 수 있습니다.

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

2
File.getUsableSpace ()는 아마도 루트로 실행하지 않기 때문에 더 좋을 것입니다.
Mark

File.getUsableSpace()외모 쉬운 방법은 사용하지 않고 사용하려면 StatFs. StatFs@MarkCarter를 사용하는 이유는 무엇 입니까?
StuStirling 2014-08-21

1
@ DiscoS2 minSdkVersion이 9보다 작 으면 StatFs를 사용합니다.
Mark

1
스토리지 변경 사항도 어떻게 모니터링합니까?
안드로이드 개발자

24

사용 가능한 모든 저장소 폴더 (SD 카드 포함)를 얻으려면 먼저 저장소 파일을 가져옵니다.

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

그런 다음 각각의 사용 가능한 크기를 얻을 수 있습니다.

3 가지 방법이 있습니다.

API 8 이하 :

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

API 9 이상 :

long availableSizeInBytes=file.getFreeSpace();

API 18 이상 (이전 버전이 정상이면 필요하지 않음) :

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

지금 얻은 멋진 형식의 문자열을 얻으려면 다음을 사용할 수 있습니다.

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

또는 정확한 바이트 수를보고 싶은 경우에 사용할 수 있지만 멋지게 :

NumberFormat.getInstance().format(availableSizeInBytes);

내부 저장소는 첫 번째 외부 저장소가 에뮬레이트 된 저장소이므로 첫 번째 외부 저장소와 동일 할 수 있다고 생각합니다.


편집 : Android Q 이상에서 StorageVolume을 사용하면 다음과 같은 것을 사용하여 각각의 여유 공간을 얻을 수 있다고 생각합니다.

    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)}")
        }
    }

이것이 정확한지 확실하지 않고 각각의 전체 크기를 얻을 수있는 방법을 찾을 수 없어서 여기에 썼고 여기 에 대해 물었 습니다 .


1
API 23을 사용하는 장치에서 이동식 SD 카드 (또는 USB OTG 플래시 드라이브)에 여유 공간을 확보하는 방법은 무엇입니까? new StatFs (file.getPath ()). getAvailableBytes () 또는 file.getUsableSpace ()는 Nexus 5 (Marshmallow 6.0.1)의 실제 저장소 크기에 관계없이 972546048 바이트를 제공합니다.
isabsent

@isabsent Nexus 5에는 SD 카드 슬롯이 없습니다. 어떻게 확인 했습니까?
안드로이드 개발자

USB OTG 플래시 드라이브로 확인했습니다.
isabsent

@isabsent 나는 그것을 사용하지 않았습니다. 죄송합니다. API 22 이하에서 잘 작동합니까?
안드로이드 개발자

1
@Smeet Android 6 이상에서 사용해 볼 수 있습니까? 그렇다면 다음과 같은 문제 일 수 있습니다. code.google.com/p/android/issues/detail?id=200326
Android 개발자

9

@ Android-Droid- Environment.getExternalStorageDirectory()SD 카드가 아니어도되는 외부 저장소에 대한 잘못된 점이며 내부 메모리를 마운트 할 수도 있습니다. 보다:

외부 SD 카드 위치 찾기


7

이 간단한 스 니펫 시도

    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];
}

감사합니다.하지만 java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648오류가 digitGroups있습니다. 결과는 -2147483648입니다.
Acuna

내가 내부 저장소로 포맷을 수행 할 때 솔루션 당신이 나를 기쁘게 할 수 ... 작동하지 않는이 달성하는 방법
인 Yogesh 라티

6

내부 저장 경로와 외부 저장 경로가 있으면 사용 가능한 저장 장치를 찾는 것은 매우 쉽습니다. 또한 휴대 전화의 외부 저장 경로를 사용하여 쉽게 찾을 수 있습니다.

Environment.getExternalStorageDirectory (). getPath ();

그래서 이동식 sdcard, USB OTG (USB OTG가 없기 때문에 테스트되지 않은 USB OTG)와 같은 외부 이동식 저장소의 경로를 찾는 방법에 집중하고 있습니다.

아래 방법은 가능한 모든 외부 이동식 저장소 경로 목록을 제공합니다.

 /**
     * 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;
}

내가 기억하는 것처럼 경로 처리에 상수 이름을 사용하면 일부 장치에는 자체 경로가있을 수 있으므로 일부 장치에서는 작동하지 않을 수 있습니다. 그렇지 않기를 바랍니다. 노력에 +1.
안드로이드 개발자

1
@androiddeveloper 투표 해 주셔서 감사합니다. 모든 장치를 가지고 있지는 않지만 4 개의 다른 장치에서 테스트했으며 제대로 작동하기 때문에 장치에서이 코드를 테스트하려면 모두의 지원이 필요합니다. 여기에 댓글을 달아주세요.
Smeet

내가 내부 저장소로 포맷을 수행 할 때 솔루션 당신이 나를 기쁘게 할 수 ... 작동하지 않는이 달성하는 방법
인 Yogesh 라티

4

외부 메모리 항목에 대한 빠른 추가

externalMemoryAvailable()Dinesh Prajapati의 답변 에있는 메서드 이름으로 혼동하지 마십시오 .

Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())미디어가 있고 읽기 / 쓰기 액세스 권한이있는 마운트 지점에 마운트 된 경우 메모리의 현재 상태를 제공합니다. trueNexus 5와 같이 SD 카드가없는 기기에서도 사용할 수 있지만 스토리지 관련 작업을 수행하기 전에는 '필수'방법입니다.

장치에 SD 카드가 있는지 확인하려면 방법을 사용할 수 있습니다. ContextCompat.getExternalFilesDirs()

USB 플래시 드라이브와 같은 일시적인 장치는 표시되지 않습니다.

또한 ContextCompat.getExternalFilesDirs()Android 4.3 이하에서는 항상 1 개의 항목 만 반환합니다 (사용 가능한 경우 SD 카드, 그렇지 않은 경우 내부). 여기에서 자세한 내용을 읽을 수 있습니다 .

  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;
}

제 경우에는 충분했지만 일부 Android 기기에는 2 개의 SD 카드가있을 수 있으므로 모두 필요한 경우 위의 코드를 조정하세요.


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
        }
    }
}

StorageStatsManager 클래스는 Android O 이상을 도입하여 외부 / 내부 저장소에 무료 및 총 바이트를 제공 할 수 있습니다. 소스 코드에 대한 자세한 내용은 다음 기사를 읽을 수 있습니다. Android O보다 낮은 경우 반사를 사용할 수 있습니다.

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


2

이게 제가했던 방식입니다 ..

내부 총 메모리

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

내부 자유 크기

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

외부 여유 및 총 메모리

 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

외부 menory에 대해 다른 방법이 있습니다.
File external = Environment.getExternalStorageDirectory(); free:external.getFreeSpace(); total:external.getTotalSpace();


0

다른 솔루션을 확인한 후 코드를 직접 작성하십시오.

  • 총 외부 메모리
  • 무료 외부 메모리
  • 사용 된 외부 메모리
  • TotaL 내부 메모리
  • 사용 된 내부 메모리
  • 무료 내부 메모리

'' ''

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)
        }
    }

}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.