অ্যান্ড্রয়েড অভ্যন্তরীণ / বাহ্যিক মেমরির বিনামূল্যে আকার পায়


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এখনই। আমি এই কোডটি কীভাবে ঠিক করতে পারি যাতে আমি বিনামূল্যে আকারটি পেতে পারি?


এপিআই স্তরের 18 হিসাবে তারা লংয়ের সাথে শেষ হওয়ার জন্য পদ্ধতিটির নামকরণ করেছেন। সম্ভবত এটির আগে আপনার এপিআই স্তরের একটি চেক যুক্ত করা দরকার
জয়শিল ডেভ

সমস্ত সমাধান আমি কারও কাজ না করার চেষ্টা করেছি, যখন আমি অভ্যন্তরীণ স্টোরেজ হিসাবে ফর্ম্যাট করি ... আপনি কি আমাকে খুশি করতে পারেন, কীভাবে এটি অর্জন করবেন?
যোগেশ রাঠি

উত্তর:


183

আপনার উদ্দেশ্যটির জন্য নীচে কোডটি দেওয়া হয়েছে:

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

র‌্যাম সাইজ পান

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

4
getBlockSize()এবং getBlockCountহ্রাস করা হয়।
নিমা জি

4
@ দিনেশপ্রজপতি উত্তরের জন্য ধন্যবাদ, আমার কাছে জিজ্ঞাসা আছে, যদি আমি অভ্যন্তরীণ স্টোরেজ গণনার জন্য পরিবেশ.গেটডাটা ডিরেক্টরী-এর পরিবর্তে এনভায়রনমেন্ট.টেটডাটা ডিরেক্টরী () ব্যবহার করি তবে আমি কিছু আউটপুট পাচ্ছি ..এটি অভ্যন্তরীণ স্মৃতিটিকে অন্য স্মৃতিতে বোঝায় ..
এ কে জোশী

4
@ দিনেশপ্রজপতি .. বহিরাগত সঞ্চয়স্থানের জন্য ভুল তথ্য পাওয়ার জন্য মোটো জি 2 তে পরীক্ষিত
এ কে জোশী

4
এটি হতে পারে যে দু'দফা এপিআই-এর অবমূল্যায়ন হয়েছে, এটি পরীক্ষা করে দেখুন ডেভেলপাররা।
অ্যান্ড্রয়েড.কম

4
নতুন এপিআই স্তরের জন্য শেষ পর্যন্ত দীর্ঘ ব্যবহার করুন (> 18)
গুন 2sh

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

4
তবে এটি অপসারণ করা হয়েছে :(
আব্বাসালিম

@ আরমো ৩72২, আপনারা কি এর বদলি কোডটি খুঁজে পেয়েছেন?
সিম্পল কোডার

4
শুধু প্রতিস্থাপন getBlockSizeএবং getAvailableBlocksসাথে getBlockSizeLongএবং getAvailableBlocksLong
স্মাগ

4
এটি সঠিকভাবে উপলব্ধ স্থান পাচ্ছে না। এটি 1678 @ এসএমজি এর পরিবর্তে 1141 পাচ্ছে

4
আমি যখন অভ্যন্তরীণ স্টোরেজ হিসাবে ফর্ম্যাট করি তখন সমাধান কাজ করে না ... আপনি কী আমাকে খুশি করতে পারেন, কীভাবে এটি অর্জন করবেন
যোগেশ রাঠি

27

এপিআই 9 যেহেতু আপনি এটি করতে পারেন:

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

4
আপনি সম্ভবত মূল হিসাবে চালাচ্ছেন না কারণ ফাইল.জেটসুবসেসপেস () সম্ভবত আরও ভাল।
চিহ্নিত করুন

File.getUsableSpace()সৌন্দর্য একটি সহজ পদ্ধতি ব্যবহার করে বদলে ব্যবহার করতে চান StatFs। আমি কেন StatFs@ মার্ককার্টার ব্যবহার করব?
স্টুস্টার্লিং

4
@ DiscoS2 আপনি StatFs ব্যবহার করেন যদি আপনার minSdkVersion 9. কম
মার্ক

4
আপনি কীভাবে স্টোরেজ পরিবর্তনগুলি নিরীক্ষণ করবেন?
অ্যান্ড্রয়েড বিকাশকারী

26

সমস্ত উপলব্ধ স্টোরেজ ফোল্ডার (এসডি কার্ড সহ) পেতে, আপনি প্রথমে স্টোরেজ ফাইলগুলি পান:

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

তারপরে আপনি সেগুলির প্রত্যেকটির উপলব্ধ আকার পেতে পারেন।

এটি করার 3 টি উপায় রয়েছে:

এপিআই 8 এবং নীচে:

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

এপিআই 9 এবং উপরে:

long availableSizeInBytes=file.getFreeSpace();

এপিআই 18 এবং উপরে (পূর্বেরটি ঠিক আছে তবে প্রয়োজন হয় না):

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

আপনি এখন যা পেয়েছেন তার একটি দুর্দান্ত ফর্ম্যাট স্ট্রিং পেতে, আপনি ব্যবহার করতে পারেন:

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

বা আপনি সঠিক বাইট নম্বর দেখতে চান তবে আপনি এটি ব্যবহার করতে পারেন তবে সুন্দরভাবে:

NumberFormat.getInstance().format(availableSizeInBytes);

মনে রাখবেন যে আমি মনে করি অভ্যন্তরীণ স্টোরেজটি প্রথম বাহ্যিক স্টোরেজ হিসাবে একই হতে পারে, যেহেতু প্রথমটি অনুকরণীয়।


সম্পাদনা: অ্যান্ড্রয়েড কিউ এবং তারপরে স্টোরেজভোলিউম ব্যবহার করে, আমি মনে করি যে এরকম কিছু ব্যবহার করে প্রত্যেকের বিনামূল্যে স্থান পাওয়া সম্ভব:

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

আমি নই নিশ্চিত এই সঠিক, এবং তাই আমি এটা সম্পর্কে লিখেছেন আমি প্রতিটি মোট আকার পেতে একটি উপায় খুঁজে পাচ্ছি না, এখানে , এবং এটি সম্পর্কে জিজ্ঞাসা এখানে


4
এপিআই 23 সহ ডিভাইসগুলিতে অপসারণযোগ্য এসডি কার্ডে (বা ইউএসবি ওটিজি ফ্ল্যাশ ড্রাইভ) মুক্ত স্থান কীভাবে পাবেন? নতুন স্টাটএফ (ফাইল.গেটপথ ())। getAv উপলভ্যাইটস () বা ফাইল.সেটসেসপেস () Nexus 5 (মার্শমালো 6.0.1) এ রিয়েল স্টোরেজ আকার নির্বিশেষে 972546048 বাইট দেয়।
isabmitted

@ নিখোঁজ নেক্সাস 5 এর এসডি কার্ড স্লট নেই। আপনি এটি চেক কিভাবে?
অ্যান্ড্রয়েড বিকাশকারী

আমি এটি ইউএসবি ওটিজি ফ্ল্যাশ ড্রাইভ দিয়ে পরীক্ষা করেছি।
isabmitted

@ অবৈধ আমি কখনই এটি ব্যবহার করি নি। দুঃখিত এটি 22 এবং নীচে নীচে API তে ভাল কাজ করে?
অ্যান্ড্রয়েড বিকাশকারী

4
@ স্মিট এটি কি অ্যান্ড্রয়েড 6 বা তারপরে উপরে চেষ্টা করা সম্ভব? যদি তা হয় তবে সম্ভবত এটি এর মতো একটি সমস্যা: code.google.com/p/android/issues/detail?id=200326
অ্যান্ড্রয়েড বিকাশকারী

9

@ অ্যান্ড্রয়েড -ড্রয়েড - আপনি Environment.getExternalStorageDirectory()বাহ্যিক স্টোরেজকে ভুল পয়েন্টস যা এসডি কার্ডের দরকার নেই, এটি অভ্যন্তরীণ মেমরিরও হতে পারে। দেখা:

একটি বাহ্যিক এসডি কার্ডের অবস্থান সন্ধান করুন


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 বলে মনে হয়।
আকুনা

আমি যখন অভ্যন্তরীণ স্টোরেজ হিসাবে ফর্ম্যাট করি তখন সমাধান কাজ করে না ... আপনি কীভাবে আমাকে এটি করতে পারেন দয়া করে
যোগেশ রাঠি

6

আপনি যদি অভ্যন্তরীণ পাশাপাশি বাহ্যিক স্টোরেজ পাথ পান তবে স্টোরেজটি উপলভ্য হওয়া খুব সহজ। এছাড়াও ফোনের বাহ্যিক স্টোরেজ পাথটি ব্যবহার করে খুঁজে পাওয়া খুব সহজ

এনভায়রনমেন্ট.জেটএক্সটার্নাল স্টোরেজ ডিরেক্টরী ()। গেটপ্যাথ ();

সুতরাং আমি কীভাবে অপসারণযোগ্য এসডকার্ড, ইউএসবি ওটিজি (আমার কাছে ইউএসবি ওটিজি না থাকায় ইউএসবি ওটিজি পরীক্ষিত হয়নি) যেমন বাহ্যিক অপসারণযোগ্য স্টোরেজগুলির পথগুলি কীভাবে খুঁজে বের করা যায় সে সম্পর্কে আমি কেবল মনোনিবেশ করছি।

পদ্ধতির নীচে সমস্ত বাহ্যিক অপসারণযোগ্য স্টোরেজ পাথের একটি তালিকা দেবে।

 /**
     * 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।
অ্যান্ড্রয়েড বিকাশকারী

4
@ অ্যান্ড্রয়েড ডেভেলপার ভোট দেওয়ার জন্য আপনাকে ধন্যবাদ প্রিয়। আপনার ডিভাইসে এই কোডটি পরীক্ষা করার জন্য আমার সবার সমর্থন দরকার কারণ আমার কাছে সমস্ত ডিভাইস নেই তবে 4 টি আলাদা ডিভাইসে পরীক্ষিত এবং সূক্ষ্মভাবে কাজ করছে working এখানে মন্তব্য করুন কোনও শরীরের মোবাইলে কাজ করছে না।
স্মিত

আমি যখন অভ্যন্তরীণ স্টোরেজ হিসাবে ফর্ম্যাট করি তখন সমাধান কাজ করে না ... আপনি কী আমাকে খুশি করতে পারেন, কীভাবে এটি অর্জন করবেন
যোগেশ রাঠি

4

বাহ্যিক স্মৃতি বিষয়টিতে দ্রুত সংযোজন

externalMemoryAvailable()দীনেশ প্রজাপতির উত্তরে পদ্ধতির নাম দিয়ে বিভ্রান্ত হবেন না ।

Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())মিডিয়া উপস্থিত থাকলে এবং পড়ার / লেখার অ্যাক্সেসের সাথে এর মাউন্ট পয়েন্টে মাউন্ট করা থাকলে আপনাকে মেমরির বর্তমান অবস্থা দেয়। আপনি trueএমনকি Nexus 5 এর মতো কোনও এসডি-কার্ডবিহীন ডিভাইসগুলিতে পাবেন But তবে স্টোরেজ সহ যে কোনও ক্রিয়াকলাপের আগে এটি অবশ্যই 'আবশ্যক' পদ্ধতি।

আপনার ডিভাইসে কোনও এসডি-কার্ড রয়েছে কিনা তা পরীক্ষা করতে আপনি পদ্ধতিটি ব্যবহার করতে পারেন ContextCompat.getExternalFilesDirs()

এটি USB ফ্ল্যাশ ড্রাইভের মতো ক্ষণস্থায়ী ডিভাইসগুলি দেখায় না।

এছাড়াও সচেতন থাকুন যে ContextCompat.getExternalFilesDirs()অ্যান্ড্রয়েড ৪.৩ এ এবং তার চেয়ে কম সর্বদা কেবল ১ টি এন্ট্রি ফিরিয়ে আনবে (এসডি-কার্ড যদি এটি পাওয়া যায় তবে অন্যথায় অভ্যন্তরীণ)। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন ।

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

আমার ক্ষেত্রে এটি যথেষ্ট ছিল, তবে ভুলে যাবেন না যে কয়েকটি অ্যান্ড্রয়েড ডিভাইসে 2 টি এসডি-কার্ড থাকতে পারে, তাই আপনার যদি তাদের সমস্তের প্রয়োজন হয় - উপরের কোডটি সামঞ্জস্য করুন।


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

স্টোরেজস্ট্যাটস ম্যানেজার ক্লাস অ্যান্ড্রয়েড ও এর ওপরে প্রবর্তন করেছে যা আপনাকে বাহ্যিক / অভ্যন্তরীণ স্টোরেজে বিনামূল্যে এবং মোট বাইট দিতে পারে। উত্স কোড সহ বিশদ জন্য, আপনি আমার নিম্নলিখিত নিবন্ধটি পড়তে পারেন। আপনি অ্যান্ড্রয়েড ও এর চেয়ে কমের জন্য প্রতিবিম্ব ব্যবহার করতে পারেন

https://medium.com/cashify-engineering/how-to-get-stores-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

নিজেই বিভিন্ন সমাধান লিখন কোড যাচাইয়ের পরে এটি অনুসন্ধানের সম্পূর্ণ কোড

  • মোট বাহ্যিক স্মৃতি
  • ফ্রি এক্সটার্নাল মেমরি
  • বহিরাগত মেমরি ব্যবহৃত
  • টোটাএল অভ্যন্তরীণ স্মৃতি
  • অভ্যন্তরীণ মেমরি ব্যবহৃত
  • বিনামূল্যে অভ্যন্তরীণ স্মৃতি

'' ''

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

}}

0

এখানে উল্লিখিত সমাধানগুলির কোনওটিই বাহ্যিক মেমোরির জন্য ব্যবহার করা যাবে না। এখানে আমার কোড (র‌্যাম, রম, সিস্টেম স্টোরেজ এবং বাহ্যিক স্টোরেজ)। আপনি (মোট স্টোরেজ - ব্যবহৃত স্টোরেজ) ব্যবহার করে ফ্রি স্টোরেজ গণনা করতে পারেন। এবং এছাড়াও, এক অবশ্যই Environment.getExternalStorageDirectory()বাহ্যিক স্টোরেজ ব্যবহার করা উচিত নয় । এটি অগত্যা বাহ্যিক এসডি কার্ডের দিকে নির্দেশ করে না। এছাড়াও, এই সমাধানটি সমস্ত অ্যান্ড্রয়েড সংস্করণ (রিয়েল ডিভাইস এবং ইমুলেটরগুলিতে এপিআই 16-30 এর জন্য পরীক্ষিত) সাথে কাজ করবে।

    // Divide by (1024*1024*1024) to get in GB, by (1024*1024) to get in MB, by 1024 to get in KB..

    // RAM
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
    manager.getMemoryInfo(memoryInfo);
    long totalRAM=memoryInfo.totalMem;
    long availRAM=memoryInfo.availMem;  // remember to convert in GB,MB or KB.
    long usedRAM=totalRAM-availRAM;

    // ROM
    getTotalStorageInfo(Environment.getDataDirectory().getPath());
    getUsedStorageInfo(Environment.getDataDirectory().getPath());

    // System Storage
    getTotalStorageInfo(Environment.getRootDirectory().getPath());
    getUsedStorageInfo(Environment.getRootDirectory().getPath());

    // External Storage (SD Card)
    File[] files = ContextCompat.getExternalFilesDirs(context, null);
    if(Build.VERSION.SDK_INT<=Build.VERSION_CODES.JELLY_BEAN_MR2){
        if (files.length == 1) {
            Log.d("External Storage Memory","is present");
            getTotalStorageInfo(files[0].getPath());
            getUsedStorageInfo(files[0].getPath());
        }
    } else {
        if (files.length > 1 && files[0] != null && files[1] != null) {
            Log.d("External Storage Memory","is present");
            long t=getTotalStorageInfo(files[1].getPath());
            long u=getUsedStorageInfo(files[1].getPath());
            System.out.println("Total External Mem: "+t+" Used External Mem: "+u+" Storage path: "+files[1].getPath());
        }
    }
}

public long getTotalStorageInfo(String path) {
    StatFs statFs = new StatFs(path);
    long t;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
        t = statFs.getTotalBytes();
    } else {
        t = statFs.getBlockCount() * statFs.getBlockCount();
    }
    return t;    // remember to convert in GB,MB or KB.
}

public long getUsedStorageInfo(String path) {
    StatFs statFs = new StatFs(path);
    long u;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
        u = statFs.getTotalBytes() - statFs.getAvailableBytes();
    } else {
        u = statFs.getBlockCount() * statFs.getBlockSize() - statFs.getAvailableBlocks() * statFs.getBlockSize();
    }
    return u;  // remember to convert in GB,MB or KB.
}

এখন এখানে রমের জন্য আমি পথটিকে "/ ডেটা" হিসাবে এবং সিস্টেম স্টোরেজ পথটি "/ সিস্টেম" হিসাবে ব্যবহার করেছি। এবং আমি বহিরাগত স্টোরেজ ব্যবহার করেছি ContextCompat.getExternalFilesDirs(context, null);সুতরাং এটি অ্যান্ড্রয়েড কিউ এবং অ্যান্ড্রয়েড আর এও কাজ করবে। আমি আশা করি এটা তোমাকে সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.