精华内容
下载资源
问答
  • Android 获取手机存储总大小,系统占用空间

    万次阅读 多人点赞 2018-12-08 22:00:02
    内置内存和外置内存(SD),目前可扩展内存的机型正在减少,大部分是内置存储的手机,内置128G、256G已经很常见,但如果有扩展功能的话,买个乞丐版+SD卡也是美滋滋,毕竟厂家增加存储空间手机定价也不便宜。...

    一、Android 存储介绍及通常查询大小

    手机存储有两种,内置内存和外置内存(SD),目前可扩展内存的机型正在减少,大部分是内置存储的手机,内置128G、256G已经很常见,但如果有扩展功能的话,买个乞丐版+SD卡也是美滋滋,毕竟厂家增加存储空间后手机定价也不便宜。言归正传,获取存储空间,很简单,使用中的 android.os.StatFs,传入需查阅的内存路径即可查询总内存大小,剩余可用空间,已用空间,示例代码如下:

    public void queryStorage(){
            StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath());
    
            //存储块总数量
            long blockCount = statFs.getBlockCount();
            //块大小
            long blockSize = statFs.getBlockSize();
            //可用块数量
            long availableCount = statFs.getAvailableBlocks();
            //剩余块数量,注:这个包含保留块(including reserved blocks)即应用无法使用的空间 
            long freeBlocks = statFs.getFreeBlocks();
            //这两个方法是直接输出总内存和可用空间,也有getFreeBytes
            //API level 18(JELLY_BEAN_MR2)引入
            long totalSize = statFs.getTotalBytes();
            long availableSize = statFs.getAvailableBytes();
    
    		Log.d("statfs","total = " + getUnit(totalSize));
    		Log.d("statfs","availableSize = " + getUnit(availableSize));
    		
    		//这里可以看出 available 是小于 free ,free 包括保留块。
    		Log.d("statfs","total = " + getUnit(blockSize * blockCount));
    		Log.d("statfs","available = " + getUnit(blockSize * availableCount));
            Log.d("statfs","free = " + getUnit(blockSize * freeBlocks));
    }
    
    private String[] units = {"B", "KB", "MB", "GB", "TB"};
    
    /**
     * 单位转换
     */
    private String getUnit(float size) {
            int index = 0;
            while (size > 1024 && index < 4) {
                size = size / 1024;
                index++;
            }
            return String.format(Locale.getDefault(), " %.2f %s", size, units[index]);
        }
    

    示例运行截图:
    内存示例
    注:我手机只有内置存储,大小是 16G,用这个方法是不会把系统空间算进来的。计算SD卡容量,需要兼容不同厂家定制的挂载路径,只要有sd路径就可以查询容量,sd卡查询不在本文说明范围,可自行查找其他文章。

    本文是为了实现查询手机存储总大小以及系统占用,所以需要使用Android的另一个类,存储管理 android.os.StorageManager,API地址 StorageManager

    在 android 6.0 之前,只能查到共享卷即除系统外的内存大小,目前我没有找到其他可读取总内存的方法,如有请评论一下,在android 7.1 之后版本,StorageManager 提供一个方法 getPrimaryStorageSize 可以查询内置存储的总容量,所以在 6.0 - 7.0 版本也是不能查所有,以及计算系统的占用大小,7.1之后版本可以准确计算存储大小以及系统占用请求,如果你看到一些机型可以显示系统占用多少,有可能是厂商自行设计的API,具体你可以查看显示的总容量是否为自己购买的内存大小。下面进入正文。

    二、类简介

    StorageManager 从API level 9 (Android 2.3, Gingerbread) 引入,部分被hide修饰函数在不同android版本上区别较大,也有遇到过厂商会删除或者重写某些函数,所以在使用时要做好异常处理,因为NoSuchMethodException 很多。

    基本函数,外暴露方法:

    • allocate 函数,为你的应用申请空间,查询可用空间等
    • cache 系统给应用提供的缓存
    • obb 隔离文件系统,处理如游戏安装包的外置资源,减少APK大小
    • StorageVolume 用户可以使用的共享/外置存储卷

    但重点是里面被隐藏的方法,让我们对手机总存储查询及系统占用计算提供了可能,至于为什么@hide,如果曾有在不同系统版本调用或者看过android源码,会发现各个版本区别特别大,况且这也不是一个特别需要的功能。所以我们将使用反射来做这个查询,但仍会有很大几率失败,厂商的定制修改若不按常路出牌,开发要么做特殊适配,否则也是失败。[允悲]
    隐藏方法@hide

    • public @NonNull List<VolumeInfo> getVolumes() 获取手机所有存储卷,内置和外置
    • public long getPrimaryStorageSize() 获取内置存储大小,主要用来计算系统占用
    • 隐藏类 VolumeInfo 存储卷的基本信息

    三、查询

    存储空间查询分两步,一是内置存储,二是外置存储。
    系统大小,获取内置大小减去内置存储块大小(系统 = 内置总 - volume.getPath().getTotalSpace())

    Talk is cheap,show me the code.

    1. android 6.0 之前版本查询(6.0-7.0 版本也适用)

    上面说过在 6.0 - 7.0 版本也是不能查总存储空间,以及计算系统的占用大小,所以可以直接通过 StatFs 来查询(代码在上面),不过外置存储的话需要去适配sd路径,比较麻烦。
    下面是通过 StorageManager 做的内存查询,需做版本区分

    public void query(){
    	StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
    	float unit = 1024;
    	int version = Build.VERSION.SDK_INT;
    	if (version < Build.VERSION_CODES.M) {//小于6.0
    		long totalSize = 0, availableSize = 0;
    	    try {
    	        Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
    	        StorageVolume[] volumeList = (StorageVolume[]) getVolumeList.invoke(storageManager);
    	        if (volumeList != null) {
    	            Method getPathFile = null;
    	            for (StorageVolume volume : volumeList) {
    	                if (getPathFile == null) {
    	                    getPathFile = volume.getClass().getDeclaredMethod("getPathFile");
    	                }
    	                File file = (File) getPathFile.invoke(volume);
    	                totalSize += file.getTotalSpace();
    	                availableSize += file.getUsableSpace();
    	            }
    	        }
    	    } catch (NoSuchMethodException e) {
    	        e.printStackTrace();
    	    } catch (IllegalAccessException e) {
    	        e.printStackTrace();
    	    } catch (InvocationTargetException e) {
    	        e.printStackTrace();
    	    }
    	    String data = "totalSize = " + getUnit(totalSize, unit) + " ,availableSize = " + getUnit(availableSize, unit);
    	        Log.d(TAG, data);
    	}
    }
    
    //或者直接使用 StatFs 直接查询
    public void queryStorage(){
    	//如上面
    }
    
    
    2. android 6.0-android 7.0 版本查询

    虽然 6.0-7.0 这区间版本不能查到内置内存总容量,但也可以查询到内置存储卷,而不仅仅是共享卷部分,但同样也可以直接使用StatFs查询,无区别

    public void query(){
    	StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
    	try {
    	    Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");//6.0
    	    List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);
    	    long total = 0L, used = 0L;
    	    for (Object obj : getVolumeInfo) {
    	
    	        Field getType = obj.getClass().getField("type");
    	        int type = getType.getInt(obj);
    	        Log.d(TAG, "type: " + type);
    	        if (type == 1) {//TYPE_PRIVATE
    	
    	            long totalSize = 0L;
    	            long systemSize = 0L;
    	
    	            Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
    	            boolean readable = (boolean) isMountedReadable.invoke(obj);
    	            if (readable) {
    	                Method file = obj.getClass().getDeclaredMethod("getPath");
    	                File f = (File) file.invoke(obj);
    	                totalSize = f.getTotalSpace();
    	                String _msg = "剩余总内存:" + getUnit(f.getTotalSpace(), unit) + "\n可用内存:" + getUnit(f.getFreeSpace(), unit) + "\n已用内存:" + getUnit(f.getTotalSpace() - f.getFreeSpace(), unit);
    	                Log.d(TAG, _msg);
    	                used += totalSize - f.getFreeSpace();
    	                total += totalSize;
    	            }
    	            String data = "totalSize = " + getUnit(totalSize, unit) + " ,used(with system) = " + getUnit(used, unit) + " ,free = " + getUnit(totalSize - used, unit);
    				Log.d(TAG, data);
    	        } else if (type == 0) {//TYPE_PUBLIC
    	            //外置存储
    	            Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
    	            boolean readable = (boolean) isMountedReadable.invoke(obj);
    	            if (readable) {
    	                Method file = obj.getClass().getDeclaredMethod("getPath");
    	                File f = (File) file.invoke(obj);
    	                used += f.getTotalSpace() - f.getFreeSpace();
    	                total += f.getTotalSpace();
    	            }
    	        } else if (type == 2) {//TYPE_EMULATED
    	
    	        }
    	    }
    	    Log.d(TAG, "总内存 total = " + getUnit(total, 1000) + "\n已用 used(with system) = " + getUnit(used, 1000) + "\n可用 available = " + getUnit(total - used, 1000));
    	
    	} catch (Exception e) {
    	    e.printStackTrace();
    	}	
    }
    
    3. android 7.1及之后版本查询
    public void query(){
    	StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
    	try {
    		Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");//6.0
    		List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);
    		long total = 0L, used = 0L;
    		for (Object obj : getVolumeInfo) {
    		
    		    Field getType = obj.getClass().getField("type");
    		    int type = getType.getInt(obj);
    		
    		    Log.d(TAG, "type: " + type);
    		    if (type == 1) {//TYPE_PRIVATE
    		
    		        long totalSize = 0L;
    		
    		        //获取内置内存总大小
    		        if (version >= Build.VERSION_CODES.O) {//8.0也可以不做这个判断
    		            unit = 1000;
    		            Method getFsUuid = obj.getClass().getDeclaredMethod("getFsUuid");
    		            String fsUuid = (String) getFsUuid.invoke(obj);
    		            totalSize = getTotalSize(fsUuid);//8.0 以后使用
    		        } else if (version >= Build.VERSION_CODES.N_MR1) {//7.1.1
    		        	//5.0 6.0 7.0没有
    		            Method getPrimaryStorageSize = StorageManager.class.getMethod("getPrimaryStorageSize");
    		            totalSize = (long) getPrimaryStorageSize.invoke(storageManager);
    		        }
    		        long systemSize = 0L;
    		        Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
    		        boolean readable = (boolean) isMountedReadable.invoke(obj);
    		        if (readable) {
    		            Method file = obj.getClass().getDeclaredMethod("getPath");
    		            File f = (File) file.invoke(obj);
    		
    		            if (totalSize == 0) {
    		                totalSize = f.getTotalSpace();
    		            }
    		            String _msg = "剩余总内存:" + getUnit(f.getTotalSpace(), unit) + "\n可用内存:" + getUnit(f.getFreeSpace(), unit) + "\n已用内存:" + getUnit(f.getTotalSpace() - f.getFreeSpace(), unit);
    		            Log.d(TAG, _msg);
    		            systemSize = totalSize - f.getTotalSpace();
    		            used += totalSize - f.getFreeSpace();
    		            total += totalSize;
    		        }
    		        Log.d(TAG, "totalSize = " + getUnit(totalSize, unit) + " ,used(with system) = " + getUnit(used, unit) + " ,free = " + getUnit(totalSize - used, unit));
    		
    		    } else if (type == 0) {//TYPE_PUBLIC
    		        //外置存储
    		        Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
    		        boolean readable = (boolean) isMountedReadable.invoke(obj);
    		        if (readable) {
    		            Method file = obj.getClass().getDeclaredMethod("getPath");
    		            File f = (File) file.invoke(obj);
    		            used += f.getTotalSpace() - f.getFreeSpace();
    		            total += f.getTotalSpace();
    		        }
    		    } else if (type == 2) {//TYPE_EMULATED
    		
    		    }
    		}
    		Log.d(TAG, "总内存 total = " + getUnit(total, 1000) + " ,已用 used(with system) = " + getUnit(used, 1000)+ "\n可用 available = " + getUnit(total - used, 1000));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    }
    
    /**
     * API 26 android O
     * 获取总共容量大小,包括系统大小
     */
    public long getTotalSize(String fsUuid) {
        try {
            UUID id;
            if (fsUuid == null) {
                id = StorageManager.UUID_DEFAULT;
            } else {
                id = UUID.fromString(fsUuid);
            }
            StorageStatsManager stats = getSystemService(StorageStatsManager.class);
            return stats.getTotalBytes(id);
        } catch (NoSuchFieldError | NoClassDefFoundError | NullPointerException | IOException e) {
            e.printStackTrace();
            return -1;
        }
    }
    

    综上,要获取系统内存大小,需先获取内置存储空间大小,通过 StorageManager 的方法 getPrimaryStorageSize()获取,也可以通过StorageStatsManager(前提是 Android O 及以上版本,需权限permission.PACKAGE_USAGE_STATS),获取内置存储大小后,减去内置存储块的总容量,即为系统占用的空间大小。因为在 7.1.1版本后才有getPrimaryStorageSize() 这方法,所以在该版本前都可以使用StatFs来完成查询,此时系统大小未知。

    完整代码如下:
    更好的阅读体验移步 github <~~ 戳我

    public static void queryWithStorageManager(Context context) {
    	//5.0 查外置存储
    	StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
    	float unit = 1024;
    	int version = Build.VERSION.SDK_INT;
    	if (version < Build.VERSION_CODES.M) {//小于6.0
    	    try {
    	        Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
    	        StorageVolume[] volumeList = (StorageVolume[]) getVolumeList.invoke(storageManager);
    	        long totalSize = 0, availableSize = 0;
    	        if (volumeList != null) {
    	            Method getPathFile = null;
    	            for (StorageVolume volume : volumeList) {
    	                if (getPathFile == null) {
    	                    getPathFile = volume.getClass().getDeclaredMethod("getPathFile");
    	                }
    	                File file = (File) getPathFile.invoke(volume);
    	                totalSize += file.getTotalSpace();
    	                availableSize += file.getUsableSpace();
    	            }
    	        }
    	        Log.d(TAG, "totalSize = " + getUnit(totalSize, unit) + " ,availableSize = " + getUnit(availableSize, unit));
    	    } catch (NoSuchMethodException e) {
    	        e.printStackTrace();
    	    } catch (IllegalAccessException e) {
    	        e.printStackTrace();
    	    } catch (InvocationTargetException e) {
    	        e.printStackTrace();
    	    }
    	} else {
    	
    	    try {
    	        Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");//6.0
    	        List<Object> getVolumeInfo = (List<Object>) getVolumes.invoke(storageManager);
    	        long total = 0L, used = 0L;
    	        for (Object obj : getVolumeInfo) {
    	
    	            Field getType = obj.getClass().getField("type");
    	            int type = getType.getInt(obj);
    	
    	            Log.d(TAG, "type: " + type);
    	            if (type == 1) {//TYPE_PRIVATE
    	
    	                long totalSize = 0L;
    	
    	                //获取内置内存总大小
    	                if (version >= Build.VERSION_CODES.O) {//8.0
    	                    unit = 1000;
    	                    Method getFsUuid = obj.getClass().getDeclaredMethod("getFsUuid");
    	                    String fsUuid = (String) getFsUuid.invoke(obj);
    	                    totalSize = getTotalSize(context, fsUuid);//8.0 以后使用
    	                } else if (version >= Build.VERSION_CODES.N_MR1) {//7.1.1
    	                    Method getPrimaryStorageSize = StorageManager.class.getMethod("getPrimaryStorageSize");//5.0 6.0 7.0没有
    	                    totalSize = (long) getPrimaryStorageSize.invoke(storageManager);
    	                }
    	                long systemSize = 0L;
    	
    	                Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
    	                boolean readable = (boolean) isMountedReadable.invoke(obj);
    	                if (readable) {
    	                    Method file = obj.getClass().getDeclaredMethod("getPath");
    	                    File f = (File) file.invoke(obj);
    	
    	                    if (totalSize == 0) {
    	                        totalSize = f.getTotalSpace();
    	                    }
    	                    systemSize = totalSize - f.getTotalSpace();
    	                    used += totalSize - f.getFreeSpace();
    	                    total += totalSize;
    	                }
    	                Log.d(TAG, "设备内存大小:" + getUnit(totalSize, unit) + "\n系统大小:" + getUnit(systemSize, unit));
    	                Log.d(TAG, "totalSize = " + getUnit(totalSize, unit) + " ,used(with system) = " + getUnit(used, unit) + " ,free = " + getUnit(totalSize - used, unit));
    	
    	            } else if (type == 0) {//TYPE_PUBLIC
    	                //外置存储
    	                Method isMountedReadable = obj.getClass().getDeclaredMethod("isMountedReadable");
    	                boolean readable = (boolean) isMountedReadable.invoke(obj);
    	                if (readable) {
    	                    Method file = obj.getClass().getDeclaredMethod("getPath");
    	                    File f = (File) file.invoke(obj);
    	                    used += f.getTotalSpace() - f.getFreeSpace();
    	                    total += f.getTotalSpace();
    	                }
    	            } else if (type == 2) {//TYPE_EMULATED
    	
    	            }
    	        }
    	        Log.d(TAG, "总内存 total = " + getUnit(total, unit) + "\n已用 used(with system) = " + getUnit(used, 1000) + "\n可用 available = " + getUnit(total - used, unit));
    	
    	    } catch (SecurityException e) {
    	        Log.e(TAG, "缺少权限:permission.PACKAGE_USAGE_STATS");
    	    } catch (Exception e) {
    	        e.printStackTrace();
    	    }
    	}
    }
    

    测试结果截图:

    android P:手机存储截图
    手机存储截图
    Log日志:进制分别为 1024 和 1000
    日志

    android 5.1 存储截图(这个是魅族mx5,不知道他的系统怎么计算,然后加上去就是总量 14.56 = 2.77 + 11.79)
    魅族5.1
    Log日志:
    日志

    android 6.0 模拟器存储
    截图
    Log 日志:
    日志

    此处附上不同版本获取内置总大小的源码,有兴趣可以到下面的源码网站查看

    /** {@hide} */ 
    //android N
    public long getPrimaryStorageSize() {
            for (String path : INTERNAL_STORAGE_SIZE_PATHS) {
                    final long numberBlocks = readLong(path);
                    if (numberBlocks > 0) {
                            return numberBlocks * INTERNAL_STORAGE_SECTOR_SIZE;
                        }
                }
            return 0;
        }
    /** {@hide} */ 
    //android O
    public long getPrimaryStorageSize() {
            return FileUtils.roundStorageSize(Environment.getDataDirectory().getTotalSpace());
        }
    
    /** {@hide} */ 
    //android P
    public long getPrimaryStorageSize() {
        return FileUtils.roundStorageSize(Environment.getDataDirectory().getTotalSpace()
                + Environment.getRootDirectory().getTotalSpace());
    }
    

    参考:
    android 源码在线查询 www.androidos.net.cn
    android 源码在线查询 androidxref.com

    展开全文
  • Storage space on smartphones and tablets can be easy to fill up, especially if you use a phone or tablet for a long... We’ll show you how to take back some of that space on your Android device. 智能...
    android free up storage hero

    Storage space on smartphones and tablets can be easy to fill up, especially if you use a phone or tablet for a long time. We’ll show you how to take back some of that space on your Android device.

    智能手机和平板电脑上的存储空间很容易装满,尤其是长时间使用手机或平板电脑时。 我们将向您展示如何收回Android设备上的部分空间。

    It’s possible to get Android phones and tablets with 128GB or 256GB of storage, but there’s a chance that you still have a device with 64GB or even 32GB. If you don’t keep all of your files in cloud storage, it can be easy to run out of storage space.

    可以获取具有128GB或256GB存储空间的Android手机和平板电脑,但是仍有可能您的设备仍具有64GB甚至32GB的存储空间。 如果您不将所有文件都保存云存储中 ,则很容易耗尽存储空间。

    The good news is you can clear out some extra space whenever you need it, and Android phones have tools built in to do the job. Plus, there are third-party apps that you can download to make it even easier.

    好消息是,您可以在需要时清理出一些额外的空间,而Android手机内置了可以完成这项工作的工具。 另外,您可以下载第三方应用程序以使其变得更加容易。

    Android的内置存储工具 (Android’s Built-in Storage Tool)

    There is a “Storage” section in the settings on every Android device that gives you information about what is taking up storage space. This section can also be used to free up space.

    每个Android设备上的设置中都有一个“存储”部分,可为您提供有关占用存储空间的信息。 此部分还可用于释放空间。

    On your Android phone or tablet, swipe down from the top of the screen once or twice, then tap the Gear icon to open the “Settings” menu.

    在您的Android手机或平板电脑上,从屏幕顶部向下滑动一次或两次,然后点击齿轮图标以打开“设置”菜单。

    swipe down to access the android settings shortcut

    Next, select “Storage” in the “Settings” menu. On a Samsung Galaxy phone, you will need to tap “Device Care” first to get to the “Storage” option.

    接下来,在“设置”菜单中选择“存储”。 在Samsung Galaxy手机上,您需要先点击“设备维护”以进入“存储”选项。

    select storage from the settings menu

    Toward the top of the screen, you will see how much storage you have used, and how much is available. Underneath, there’s a list of storage categories. Some Android phones include a “Free Up Space” button on this screen (more on that below).

    在屏幕顶部,您将看到已使用了多少存储空间以及可用空间。 在下面,有一个存储类别列表。 一些Android手机在此屏幕上包含“释放空间”按钮(更多信息在下面)。

    pixel LG and samsung storage screens
    Left: Pixel | Center: LG | Right: Samsung
    左:像素| 中心:LG | 右:三星

    Select one of the categories to clean it up.

    选择一种类别进行清理。

    select a section from the storage overview

    You will see a list of apps associated with the category. In this example, we see music apps as we’re cleaning up the audio files. Tap one of the apps.

    您将看到与该类别关联的应用程序列表。 在此示例中,我们在清理音频文件时看到了音乐应用程序。 点击其中一个应用。

    choose an app to clear its storage

    Tap “Clear Storage” or “Clear Cache.” Be aware that selecting “Clear Storage” will reset the app, signing you out, and clearing all data.

    点击“清除存储”或“清除缓存”。 请注意,选择“清除存储空间”将重置该应用程序,将您注销并清除所有数据。

    clear storage or clear cache

    Alternatively, each section will have a more generic “Files” option under the apps list. This is where you can remove files that are not directly associated with an app.

    另外,每个部分在应用程序列表下都有一个更通用的“文件”选项。 在这里,您可以删除不与应用程序直接关联的文件。

    choose files to delete general files

    A file manager will open to the folder and allow you to select which files to delete.

    文件管理器将打开该文件夹,并允许您选择要删除的文件。

    delete general files from the file manager

    As mentioned above, some phones include a “Free Up Space” button on the “Storage” screen. If your phone has this button, tap it.

    如上所述,某些电话在“存储”屏幕上包括“释放空间”按钮。 如果您的手机具有此按钮,请点击它。

    select the "free up space" button

    If you have file manager apps installed on your phone, you might be asked which app you’d like to use to complete the action. The one we want to use is “Smart Storage.” Select it, and tap “Just Once.”

    如果您的手机上安装了文件管理器应用,则可能会询问您要使用哪个应用来完成操作。 我们要使用的是“智能存储”。 选择它,然后点击“仅一次”。

    choose "smart storage" from the pop up menu

    The next screen can vary, depending on the device you have. In some form or another, you will see a list of suggested areas that can be cleaned up to free up space. Here are some common areas you might see:

    下一个屏幕可能会有所不同,具体取决于您所使用的设备。 以某种形式,您会看到建议区域的列表,可以对其进行清理以释放空间。 这是您可能会看到的一些常见区域:

    • Backed Up Photos & Videos: This will remove media that has already been backed up to cloud storage.

      备份的照片和视频:这将删除已经备份到云存储的媒体。

    • Temporary Files: Files such as cached data and clipboard items that aren’t needed anymore.

      临时文件:不再需要的文件,例如缓存的数据和剪贴板项目。

    • Downloads: Items that you have previously downloaded.

      下载:您先前下载的项目。

    • Idle/Infrequently Used Apps: Usually, this will show apps you don’t use often and allow you to uninstall them in bulk.

      空闲/不经常使用的应用程序:通常,这将显示您不经常使用的应用程序,并允许您批量卸载它们。

    pixel free up space menu
    “Free Up Space” on a Pixel phone
    Pixel手机上的“释放空间”

    Look through the different areas and select anything you would like to remove. Tap “Free Up,” “Delete,” or “Remove” to remove the files.

    浏览不同的区域,然后选择要删除的任何内容。 点击“释放”,“删除”或“删除”以删除文件。

    choose files to remove

    You can head back to the main Storage menu and check how much space you now have available on your Android smartphone or tablet.

    您可以返回到主“存储”菜单,并检查您现在在Android智能手机或平板电脑上有多少空间。

    Google档案 (Files by Google)

    The Google Files app icon

    If Android’s built-in method isn’t good enough for you, there are additional tools you can install from the Google Play Store. “Files by Google,” the company’s own file manager app, includes a tool to help people keep storage space tidy.

    如果Android的内置方法对您来说不够好,则可以从Google Play商店安装其他工具。 该公司自己的文件管理器应用程序“ Google提供的文件”包括一个工具,可以帮助人们保持存储空间整洁。

    Some Android phones come with “Filed by Google” preinstalled, but it’s available to everyone from the Play Store. The app has a handy tool that recommends things that can be removed from your phone, saving you the trouble of doing it manually. Check out our guide for freeing up storage space with “Files by Google.”

    某些Android手机预装了“由Google归档”,但Play商店的所有人都可以使用。 该应用程序有一个方便的工具,可以推荐可以从手机中删除的内容,从而省去了手动操作的麻烦。 请查看我们的指南,以释放“ Google档案”中的存储空间。

    翻译自: https://www.howtogeek.com/686890/how-to-free-up-storage-space-on-your-android-phone/

    展开全文
  • android 设备占用When you picked up your shiny new Android device, you probably thought “yeah, this has plenty of storage. I’ll never fill it up!” But here you are, some number of months later with ...
    android 设备占用

    android 设备占用

    When you picked up your shiny new Android device, you probably thought “yeah, this has plenty of storage. I’ll never fill it up!” But here you are, some number of months later with a full phone and no clue why. No worries: here’s how you can figure out where the space hogs are.

    当您拿起闪亮的新Android设备时,您可能会想:“是的,它有足够的存储空间。 我永远不会填满它!” 但是在这里,几个月后,您已经拥有一部完整的手机,却不知道为什么。 不用担心:这是您找出太空猪在哪里的方法。

    You can use built-in features to figure this out, or third-party apps. I find the easiest and most straightforward tools to use are often the ones included in Android itself, so we’ll start with those, before showing you some of your other options. It’s worth noting that things may look a little different depending on what handset and version of Android you’re using here.

    您可以使用内置功能来解决此问题,也可以使用第三方应用程序。 我发现使用起来最简单,最直接的工具通常是Android本身包含的工具,因此,在介绍一些其他选项之前,我们先从这些工具入手。 值得注意的是,根据您在此使用的手机和Android版本,情况可能看起来有所不同。

    如何在Stock Android中查找存储使用情况 (How to Find Storage Usage in Stock Android)

    To find storage stats on your device running stock Android (like a Nexus or Pixel phone), first pull down the notification shade and tap the cog icon. (If you have a Samsung Galaxy device, skip to the next section.)

    要在运行常规Android(例如Nexus或Pixel手机)的设备上查找存储状态,请先下拉通知栏,然后点击齿轮图标。 (如果您有Samsung Galaxy设备,请跳至下一部分。)

    From there, scroll down to Storage and tap it.

    从那里向下滚动到“存储”并点击它。

    Oreo is the newest version of Android, and it brings some pretty dramatic changes to the storage menu, so we’ll highlight the differences here.

    奥利奥(Oreo)是Android的最新版本,它为存储菜单带来了一些相当大的变化,因此我们在这里重点介绍它们之间的差异。

    In Nougat, you get a handful of pretty straightforward categories, like Apps, Images, Videos, and the like. Tap on a category and you’ll see exactly what you’d expect: things that fall into that description, sorted by the amount of space they take up.

    在牛轧糖中,您会获得一些非常简单的类别,例如应用程序,图像,视频等。 点击类别,您将确切看到期望的内容:属于该描述的事物,按其占用的空间排序。

    In Oreo, however, Google has taken a different approach. It still uses a similar category-based approach, but this time things are sort of bundled together. For example, Photos & Videos is now one entry instead of two. But there are also new options here, like Games and Movie & TV apps, just to name a couple.

    但是,在奥利奥(Oreo)中,谷歌采取了另一种方法。 它仍然使用类似的基于类别的方法,但是这次将事物捆绑在一起。 例如,“照片和视频”现在是一个条目,而不是两个。 但是,这里还提供了一些新选项,例如游戏和影视应用程序,仅举几例。

    But here’s where Oreo’s approach is completely different from Nougat: instead of having all apps shows up under the “Apps” entry, now apps show up depending on which category they fall into. For example, all of your photo-based apps—be those camera applications or photo editors—will show up under the Photos & Videos menu. The same goes for Music & Audio, Movie & TV Apps, and so on, so forth.

    但是,这是奥利奥(Oreo)与牛轧糖(Nougat)完全不同的方法:不是将所有应用都显示在“应用”条目下,而是根据应用所属的类别显示应用。 例如,您所有基于照片的应用程序(无论是那些相机应用程序还是照片编辑器)都将显示在“照片和视频”菜单下。 音乐和音频,电影和电视应用程序等也是如此。

    This is a bit of a weird change to get acclimated to if you’re a longtime Android user. Instead of simply tapping on “Apps” to see a list of every application on your phone, you now have to tap through several different menus to find the same information.

    如果您是长期使用Android的用户,那么要适应这个变化会有些奇怪。 现在,您不仅要轻按“应用程序”以查看手机上每个应用程序的列表,还必须轻按几个不同的菜单来查找相同的信息。

    But at the same time, I kind of like this containerized approach—grouping apps alongside the same files they use makes a lot of sense. It also helps you get a feel for superfluous apps you may have installed—things that are basically just taking up space because you use one main app for everything.

    但与此同时,我有点喜欢这种容器化方法-将应用程序与使用的相同文件分组在一起很有意义。 它还可以帮助您体验可能已安装的多余应用程序,因为您使用一个主应用程序来完成所有事情,因此这些事情基本上只是占用空间。

    It’s also worth noting that if an app doesn’t fall into any of the listed categories, you’ll find it in the “Other Apps”section.

    还值得注意的是,如果某个应用程序不属于任何列出的类别,则可以在“其他应用程序”部分中找到它。

    如何在Samsung Galaxy设备上查找存储使用情况 (How to Find Storage Usage on Samsung Galaxy Devices)

    So Samsung does this thing where it changes things simply because it can, and the settings menu always takes one of the biggest hits—things are all over the place here, and the storage menu is no exception.

    因此,三星之所以这样做,是因为它可以更改它,仅仅是因为它可以改变,并且设置菜单始终是最大的成功之一-事情到处都是,存储菜单也不例外。

    Note: We’re using a Galaxy S8 running Android Nougat here. If your device is older, things may look and function a little differently.

    注意:我们在这里使用的是运行Android Nougat的Galaxy S8。 如果您的设备较旧,则外观和功能可能会有所不同。

    To get to the Settings menu, first pull down the notification shade and tap the cog icon.

    要进入“设置”菜单,首先下拉通知栏,然后点击齿轮图标。

    From there, tap on into the Device Maintenance menu.

    从那里,点击进入设备维护菜单。

    It will immediately start running the device maintenance checklist, but you can pretty much ignore that—just tap on “Storage” at the bottom.

    它会立即开始运行设备维护清单,但是您几乎可以忽略它—只需点击底部的“存储”。

    Here, you’ll see some simple categories, like Documents, Images, Audio, Videos, and Apps.

    在这里,您会看到一些简单的类别,例如文档,图像,音频,视频和应用。

    You can tap on each entry to see what sort of stuff is taking up space from that particular category. The bad news is that there are no sorting options here, so you can’t sort your list of apps by which ones are the largest. You’ll just have to scroll down, take note of which apps use more space, and consider which ones you want to uninstall. Have fun with that.

    您可以点击每个条目以查看哪种材料正在占用该特定类别的空间。 坏消息是这里没有排序选项,因此您无法对最大的应用程序列表进行排序。 您只需向下滚动,注意哪些应用程序使用了更多空间,并考虑要卸载哪些应用程序。 玩得开心。

    最好的独立应用程序:Google Files Go (The Best Separate App for the Job: Google Files Go)

    If you’re not happy with what your stock operating system offers in terms of storage stats, there are a number of apps available in the Play Store that should take things up a notch for you. But we think the best is Google’s own file management from the Play Store, called Files Go. It’s an excellent tool for checking your device’s storage stats—especially if you’re using something like a Galaxy phone that doesn’t let you sort files and apps by size, or you’re not into Oreo’s new sorting options.

    如果您不满意库存操作系统提供的存储统计信息,则Play商店中有许多可用的应用程序可以帮助您解决问题。 但是我们认为最好的方法是Google在Play商店中自己的文件管理功能,称为Files Go 。 它是检查设备存储状态的绝佳工具,特别是如果您使用的是类似Galaxy手机之类的工具,该工具无法按大小对文件和应用程序进行排序,或者您不属于Oreo的新排序选项中。

    Go ahead and give it an install and get it set up. You’ll need to grant it storage permissions and whatnot, as well as usage access for app tracking. Once that’s done, you’re ready to rock and roll.

    继续并进行安装并进行设置。 您需要向其授予存储权限和其他权限,以及对应用程序进行跟踪的使用权限。 完成后,您就可以摇滚。

    While the main interface is useful for intelligently cleaning up space, that’s a different story for a different day—you’re looking for the Files section. Tap on that option at the bottom.

    尽管主界面对于智能清理空间很有用,但不同的日子不同,您正在寻找“文件”部分。 点击底部的选项。

    This section is super straightforward: it’s broken down into categories. Tap on each one to see what’s filling up space in each category.

    本节非常简单:分为几类。 点击每个按钮,查看每个类别中的填充空间。

    Now, here’s the important part: if you want to sort the options by size, tap the three lines in the upper right corner, then choose “By size.”

    现在,这是重要的部分:如果要按大小对选项进行排序,请点击右上角的三行,然后选择“按大小”。

    Poof! Now you can easily see what’s taking up the most space in each category—even apps. It’ll even tell you when they were last used, so you know which apps are less important to you.

    of ! 现在,您可以轻松查看每个类别(甚至是应用程序)中占用最多空间的内容。 它甚至会告诉您上次使用的时间,因此您知道哪些应用程序对您不太重要。



    Now that you’ve found what’s using up your storage, you can pretty easily get rid of it: delete files you don’t need, uninstall apps that you’re not using, etc. As you probably noticed Android Oreo and Samsung devices both offer a sort of quick “free up space” button—use that to intelligently get rid of stuff you probably don’t need (you’ll confirm first, don’t worry). Otherwise, If you’re looking for more ways to free up space, we have a solid list of options here.

    现在,您已经找到存储空间中正在使用的内容,可以轻松摆脱它:删除不需要的文件,卸载不使用的应用程序,等等。您可能已经注意到Android Oreo和Samsung设备提供了一种快速的“释放空间”按钮-使用它可以智能地清除您可能不需要的东西(您将首先确认,不用担心)。 否则,如果您正在寻找释放空间的更多方法,请在此处提供可靠的选项列表

    翻译自: https://www.howtogeek.com/206591/how-to-see-whats-taking-up-space-on-your-android-device/

    android 设备占用

    展开全文
  • Android存储空间总结

    千次阅读 2020-10-25 08:45:36
    app为了使自己的应用数据好看,直接将资源存储到sd卡,存储在sd卡的文件将不会计算成该app的内存占用。 app处于卖方市场。如果不给存储权限用户就无法使用app部分甚至全部功能。 目前,随着Android越发完善,

    概述

    Android存储在6.0之前,真的可以用“混乱不堪”来形容。
    造成的原因很多,个人认为有以下几点:

    1. android早期手机本身的内存很小,大部分app的读写都在sd卡内操作。
    2. 用户权限意识薄弱,android 6.0之前直接在安装时申请权限,用户往往在未知情况下就给予了存储权限。
    3. app为了使自己的应用数据好看,直接将资源存储到sd卡,存储在sd卡的文件将不会计算成该app的内存占用。
    4. app处于卖方市场。如果不给存储权限用户就无法使用app部分甚至全部功能。

    目前,随着Android越发完善,官方也有了自己推荐的存储方案。作为一个android开发者,非常有比较了解一下。

    官方文档:访问应用专属文件

    笔者根据自己的日常使用经验以及官方文档做本文总结,如果有理解有误的地方欢迎评论交流。

    存储方案优劣

    内部存储

    只有自己可以访问,其他应用不能访问。自己访问不需要权限。

    android api一般是:context.getCacheDir() 和 context.getFilesDir()

    使用场景

    • 小程序、小游戏
      (持久文件,适合存储在context.getFilesDir())
      与app相关联,app卸载后就没有用了。
    • 缓存图片、视频
      (临时文件,适合存储在context.getCacheDir())
      随时可以清理掉,清理掉后就是走冷启动逻辑。

    优势

    1. 不需要申请权限,用户无感知。
    2. 不会影响手机存储,app删除,即相关资源一起删除。

    劣势

    1. 无法永久化存储,app删除后会跟着删除。
    2. android手机存储不够时,应用的缓存文件会被删除,回收空间。

    外部存储

    获得读写权限后,大家都可以读写。

    android api一般是:Environment.getExternalStorageDirectory()

    使用场景

    • 照片、视频、文档等本地存储
      需要放到外存,便于用户分享和使用。

    优势

    1. 除非用户主动删除,否则可以一直存储在用户手机中。
      (这个用法很多,比如多个应用可以共享一份资源,不用每个应用都维护一份;当应用删除后第二次安装,能保留部分用户数据以及缓存)
    2. 获得权限后也意味着可以读取手机中的其他内容,如照片,视频等。

    劣势

    1. 需要申请用户权限,部分用户会选择拒绝。
    2. sd卡取出后,就无法访问。
      这个问题主要在较老的机型上,目前大部分手机都没有sd卡了。
    3. 由于app被删除时外存中的数据不会自动被删除,因此就会成为用户的“存储垃圾”。

    常用存储方案

    代码

      private void testAndroidFile() {
        Log.d(TAG, "Environment.getDataDirectory() filepath:" + Environment.getDataDirectory());
        Log.d(TAG, "Environment.getDownloadCacheDirectory() filepath:"
            + Environment.getDownloadCacheDirectory());
        Log.d(TAG, "Environment.getRootDirectory() filepath:" + Environment.getRootDirectory());
        Log.d(TAG, "Environment.getExternalStorageDirectory() filepath:"
            + Environment.getExternalStorageDirectory());
        Log.d(TAG, "context.getCacheDir() filepath:" + getCacheDir());
        Log.d(TAG, "context.getDataDir() filepath:" + getDataDir());
        Log.d(TAG, "context.getFilesDir() filepath:" + getFilesDir());
        Log.d(TAG, "context.getObbDir() filepath:" + getObbDir());
        Log.d(TAG, "context.getNoBackupFilesDir() filepath:" + getNoBackupFilesDir());
        Log.d(TAG, "context.getCodeCacheDir() filepath:" + getCodeCacheDir());
        Log.d(TAG, "context.getExternalCacheDir() filepath:" + getExternalCacheDir());
        Log.d(TAG, "context.getExternalFilesDir(null) filepath:" + getExternalFilesDir(null));
      }
    

    打印结果(手机:小米9、Android10、MIUI 12)

    Environment.getDataDirectory() filepath:/data
    Environment.getDownloadCacheDirectory() filepath:/data/cache
    Environment.getRootDirectory() filepath:/system
    Environment.getExternalStorageDirectory() filepath:/storage/emulated/0
     context.getCacheDir() filepath:/data/user/0/com.example.androidfiletest/cache
    context.getDataDir() filepath:/data/user/0/com.example.androidfiletest
     context.getFilesDir() filepath:/data/user/0/com.example.androidfiletest/files
     context.getObbDir() filepath:/storage/emulated/0/Android/obb/com.example.androidfiletest
    context.getNoBackupFilesDir() filepath:/data/user/0/com.example.androidfiletest/no_backup
    context.getCodeCacheDir() filepath:/data/user/0/com.example.androidfiletest/code_cache
    context.getExternalCacheDir() filepath:/storage/emulated/0/Android/data/com.example.androidfiletest/cache
    context.getExternalFilesDir(null) filepath:/storage/emulated/0/Android/data/com.example.androidfiletest/files
    

    Android 11 相关补充

    在android 11 上,google官方推荐使用context.getExternalFilesDir(null)来存储应用信息到sdcard。
    在此处读写有以下特点:

    1. 不需要权限。
    2. 与私有目录一样,在应用删除之后,该目录下的内容也会被删除。

    在Android 11 的机型上,如果继续使用Environment.getExternalStorageDirectory() 在sdcard根目录操作文件,读写会非常慢。

    笔者个人操作经验:删除200MB的文件需要30s左右

    展开全文
  • 使用安卓手机的小伙伴都知道如果手机内存空间不足,最有效的方法就是删除系统里的一些占空间的文件夹。但是手机里的大部分文件夹都是英文名,里面有的是与操作系统息息相关的文件,如果删除就会导致手机无法正常工作...
  • Android之获取手机内部及sdcard存储空间文章链接知识点: 内部存储空间获取总大小和可用大小; sdcard存储空间获取总大小和可用大小; 新名词记录{StatFs:描述文件系统信息的类} 概览在开发中,我们或多或少都会...
  • 计算Android App占用的各种空间大小

    千次阅读 2019-06-10 11:50:44
    一个小需求:计算Android App所占用d的手机内存(RAM)大小、App所产生的数据(Data)大小、App本身所占用的磁盘空间(ROM)大小。当然,这个就必须用到PackageManager了。 1、查看Android中PackageManager源码,...
  • 描述:miui12系统小米系统安卓系统里面存储空间占用太多如何清理 步骤: 点击手机管家->垃圾清理->等待垃圾清理完->清理垃圾->点击应用数据->找到应用数据排名前几位的清理掉
  • 如果您也遇到类似的问题,那么多半是安卓手机经常安装卸载大量的游戏和软件造成的,安卓大量软件不仅会使存储空间越来越小,也是的手机内存占用越来越多,那么手机内存越来越小怎么办呢?下面本文将于大家分享一些...
  • 但是我想说的是关于商业价值的角度去探讨,为什安卓手机对于性能的PK是特别的猛烈的,早期我们接触手机运行内存从之前的1G、2G、4G、6G、8G再到如今都有了12G、16G和18G的运行内存,而储存空间我了解到的从之前的8G...
  • Android 存储空间总结

    2019-12-23 15:19:46
    Android系统的存储空间分为内部存储和外部存储。 存储类型 位置 空间大小 是否可用 是否需要声明 内部 手机系统自带的存储 空间较小 一直可用,剩余空间可能不足 不需要声明 外部 一般是sd卡存储 空间较大...
  • 获取手机剩余内部存储大小,简单的demo
  • StorageStats 中的 codeBytes 包含了 Environment.DIRECTORY_DOWNLOADS 以及 other 所占存储大小 所以在分别计算应用 下载 其他 数据所占存储大小时 需要注意 codeBytes 计算 我们在获取应用所占存储大小时 只需要 ...
  • Android之获取外部存储空间解释

    千次阅读 2017-03-10 12:44:42
    1、获取内部/外部存储空间方法介绍; 2、存储中需要的注意事项; 当我们需要用到存储数据的时候,例如音频文件,视频文件或者是下载的apk等等,我们应该如何来选择存放的目录呢。是放在自己APP所能接触到而其他APP...
  • 原标题:安卓手机为啥运行内存总是占... 就是两个运行内存完全不同的手机,再使用时,内存几乎都会占用一般,这是为何呢!今天小编就拿2G和6G来做个例子。先说普及什么是手机运行内存,通俗易懂就是手机运行程序时所...
  • 用过MIUI系统的朋友可能会发现这样一个现象,当使用过一段时间后,系统的内部储存空间会变得越来越少,而且占用空间90%以上时,系统还会经常发出无足够内存空间的提示,尽管我们尝试过清理垃圾、移动软件到SD卡、...
  • Android获取存储空间的使用情况

    千次阅读 2014-12-26 10:25:07
    android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd卡的大小和剩余空间,获取系统内部空间也就是/system的大小和剩余空间等等。  看下读取sd卡的: Java代码 void readSDCard() {   String state...
  • 手机跑测试任务,没跑多久就会提示“内部存储空间不足”,对不是手机存储,也不是sd卡,而是手机 有1G的内存,但是可用空间只有13M,奇葩啊,都没有任何应用安装在手机上,只能一点点差,从哪儿查起呢,直接看内存...
  • Android通过IPackageStatsObserver.aidl 、PackageStats.aidl两个AIDL文件获取第三方应用的占用大小,包括缓存、数据、应用大小,经验证和手机设置里面显示的大小完全一致。。。。。。如果还需要其他比如清除缓存之...
  • 细说Android的内部存储和外部存储

    千次阅读 2019-02-19 21:32:06
    无论哪种存储,都会涉及到手机存储空间,而其中比较绕人的就是Android手机的内部存储和外部存储了,这两天花了点时间总结了一番,这里写成博客权当记录。 内部存储 概念:注意内部存储不是内存,它是手机中的一...
  • Android 8.1.0 原生系统,Settings 中,点击 “存储” 查看内存使用时,发现内存使用情况都是使用 GB 做的单位,但是如果某一类型文件实在是太小了,比如照片和视频中只有100KB 左右大小,如果还是使用 GB 作为计算...
  • 记录一下平时经常需要... * 根据路径获得,某个文件或文件夹所在的存储器的内存空间总大小 * * @return */ public static long getTotalMemorySize(String path) { StatFs stat = new StatFs(path);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,635
精华内容 13,054
关键字:

安卓手机占用存储空间