精华内容
下载资源
问答
  • 手机总显示存储空间不足最应该的就是清理掉日常生活当中不必要的应用。而且造成这种存储空间不足的绝大多数都是应用所产生的垃圾文件以及缓存。通过以下三种办法能更好的解决存储空间不足的现象。 卸载不常用的应用...

    手机总显示存储空间不足最应该的就是清理掉日常生活当中不必要的应用。而且造成这种存储空间不足的绝大多数都是应用所产生的垃圾文件以及缓存。通过以下三种办法能更好的解决存储空间不足的现象。


    • 卸载不常用的应用

    现在我们手机当中随随便便都会有三四十个APP,但这些APP平时经常能用到以及经常使用的只有一二十个左右。有很多我们甚至半年一年才会打开一次,而这些软件留在手机当中在后台同样会产生很多的缓存以及垃圾文件,因此我们有必要及时的将它卸载掉。再加上现在支付宝微信各种的小程序可以替代很多软件,所以完全没有必要在手机里留着。

    • 下载第三方软件清理

    我们现在手机当中都会自带手机管家这个应用,但这些手机管家的应用去清理并且杀毒的技术都是来源于第三方像360腾讯猎豹这几个主流的企业。所以我们这时候就需要下载这些第三方专业的清理软件能更好的清理掉手机系统当中,以及应用当中所产生的垃圾文件和缓存。

    • 使用外置sd卡

    还有一个方法就是最直接的给手机当中加入内存卡来增加存储空间,一般像现在的智能机都是两双卡托,一个是可以放置外置SD卡另一个可以放置手机电话卡。所以我们可以选择一个大内存的外置SD卡放入手机中,将不常用的应用全部安置在SD卡当中,这样我们使用这些应用时所产生的文件缓存都会在这张存储卡上,不会占用我们手机自带的存储空间。


    综上所述,我们日常使用手机经常会出现内存空间不足的现象,而这些都是来自于应用所产生的缓存、内容、垃圾文件等。通过以上三种方法可以极大的释放我们手机内存空间。

    展开全文
  • 德州奥斯汀--(美国商业资讯)--高性能、低功耗通用闪存存储(UFS)代表移动存储的未来,嵌入式移动产品的广泛普及和可移动UFS卡的新近涌现即是力证。随着2019年一些UFS卡系统的持续推出,预计2020年将成为UFS卡成为可...

    德州奥斯汀--(美国商业资讯)--高性能、低功耗通用闪存存储(UFS)代表移动存储的未来,嵌入式移动产品的广泛普及和可移动UFS卡的新近涌现即是力证。随着2019年一些UFS卡系统的持续推出,预计2020年将成为UFS卡成为可移除移动存储行业首选的一年。

     

    20199月:UFS卡在中国深圳的中国闪存市场峰会(CFMS)上荣获最佳产品创新奖

     

    顺序读取性能比SD卡快5
    随机读取性能比SD卡快70

     

    UFS是由JEDEC固态技术协会(半导体标准的全球领导者)开发的高级开放标准闪存接口,该接口首先用于嵌入式存储,并使用免版税使用模式外形规格扩展到UFS卡存储。此外,还将继续开发更高性能版本的UFS和UFS卡。

     

    通用闪存存储协会(UFSA)已与JEDEC固态技术协会和行业领导者合作,为UFS制定合规性测试和标识认证计划,进而创建强大的生态系统,使系统公司能够与多供应商共同推出UFS卡系统。

     

    JEDEC固态技术协会和UFSA董事会主席Mian Quddus表示:“嵌入式UFS和UFS卡彰显通过JEDEC固态技术协会和UFSA共同合作的领先企业的力量,满足全球对更高性能存储及相关开放标准产品的需求。”

     

    通过多场合规性研讨会,UFSA已认证多个UFS卡及多个UFS控制器和控制器IP。新的UFS供应商以及多家插座供应商和UFS转USB桥接芯片已为系统企业强化既有的UFS生态系统。

     

    是德科技(Keysight)数字化标准与应用计划负责人、UFSA合规主席Perry Keller表示:“UFSA为JEDEC固态技术协会UFS标准创建了合规性测试环境,以让人们对认证产品充满信心。UFSA将继续举办研讨会,以认证其他产品和供应商。”

     

    是德科技、BitifEye和Protocol Insight的测试设备产品在扩展自动化测试和认证的环境方面起到很大作用。

     

    激增的嵌入式UFS产品已迅速出现在智能手机、平板电脑和无人机等广泛应用中。但是,由于UFS卡的增加直接涉及最终用户,因此需要进行广泛的合规性和兼容性测试,以确保供应商之间的互操作性。自从UFSA创建其合规性测试矩阵以来,它已认证了一批强大的供应商。LG和三星电子(Samsung Electronics)最近推出的产品将加入日益增加的支持UFS卡的笔记本电脑和上网本计算机之列。(链接见下文)

     

    三家UFS卡开发企业拥有UFSA认证的设备(群联(Phison)、三星电子和慧荣科技(Silicon Motion, SMI))。

     

    群联移动存储总监兼UFSA董事会成员Horace Chen表示:“随着市场的加速发展,我们已准备好为该行业提供支持。”

     

    三星电子NAND闪存规划副总裁Hangu Sohn表示:“UFS卡将在加快存储过程和增加存储容量方面发挥关键作用。 此外,凭借免版税使用模式外形规格和开放标准设计,我们预计将在2020年快速向这些卡过渡。”

     

    慧荣科技移动存储营销总监兼UFSA董事会成员Robert Hsieh表示:“我们是UFS控制器和卡设计的积极推动者,随着行业的发展,我们已做好准备满足其需求。”

     

    为UFS添加USB3.1和USB-C读卡器的功能后,UFS卡就可以成为设备之间首选的传输设备。(链接见下文)

     

    在近期举行的柏林国际电子消费品展览会(IFA Berlin)上,海信T91手机原型展示了UFS卡环绕microSD卡运行,其顺序读写和随机写入速度分别提高了6倍和35倍。与非高端设备中常用的内置eMMC存储相比,UFS卡也快很多。这些数字已经接近内置UFS 2.1的速度,后者已在近期发布的旗舰产品(例如Galaxy S10、华为P30等)中使用。显然,UFS卡技术已准备就绪,而高通(Qualcomm)的芯片组也支持该技术。

     

    UFSA内部的UFS生态系统提供商:

     

    • 认证的金色UFS卡 – 群联、三星电子、SMI
    • 认证的UFS控制器 – 群联、SMI
    • 认证的控制器IP – 新思科技(Synopsys)
    • UFS转USB桥接控制器 – SMI、智微科技(JMicron)
    • 插座 – 安费诺(Amphenol)、莫仕(Molex)
    • 测试设备 – BitifEye、是德科技、Protocol Insight
    • 测试固定装置 – Astek

     

    相关链接

     

    https://www.lge.co.kr/lgekor/product/pc/notebook/productDetail.do?cateId=&prdId=EPRD.346421

     

    https://news.samsung.com/us/samsung-galaxy-book-flex-and-galaxy-book-ion-new-computing-experience/

     

    https://www.aliexpress.com/item/4000210496806.html

     

    关于UFSA

     

    通用闪存存储协会(UFSA)是开放的行业协会,旨在为JEDEC固态技术协会UFS标准的广泛普及和接受提供支持。UFSA的主要任务包括通过提供产品合规性和UFS标识认证管理以推广UFS技术和基础架构。通过合规性测试,UFSA为JEDEC固态技术协会提供宝贵的意见,以供将来制定规范之用。www.ufsa.org

     

    关于JEDEC

     

    JEDEC固态技术协会是微电子行业标准开发的全球领导者。代表将近300家成员公司的数千名志愿者在100多个JEDEC技术委员会和任务组中共事,以满足行业、制造商和消费者等各个细分领域的需求。JEDEC委员会编写的出版物和标准已为世界各地所接受。所有JEDEC标准都可以从JEDEC网站上下载。如需了解更多信息,敬请访问www.jedec.org

     

    前瞻性陈述

     

    本新闻稿包含《1934年证券交易法》第21E条所定义的前瞻性陈述,包括有关UFS的预期发布和收益的陈述。任何非历史事实的陈述均可视为前瞻性陈述。这些陈述涉及已知和未知的风险、不确定性和其他因素,可能导致实际结果、时间范围或成果与前瞻性陈述中明示或暗示的内容截然不同。UFSA没有义务公开更新任何前瞻性陈述,也没有义务更新实际结果可能与这些前瞻性陈述中预期的结果产生截然不同的原因,即使将来有新信息出现。

    展开全文
  • 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

    展开全文
  • 存储空间却越来越不够用,很大程度上是因为应用的体积也在逐渐增加。那么用户改怎么解决这个痛点呢?今天快店铺小编为你介绍一下快应用,帮你完美解决问题: 什么是快应用? 按照官方的说法,快应用具有轻量、...

    近年来,各个手机品牌推出的机型存储容量都是64GB起步。而存储空间却越来越不够用,很大程度上是因为应用的体积也在逐渐增加。那么用户改怎么解决这个痛点呢?今天快店铺小编为你介绍一下快应用,帮你完美解决问题:

    什么是快应用?
    在这里插入图片描述

    按照官方的说法,快应用具有轻量、流畅、功能完整的特点,在保障用户体验的基础上,释放手机存储空间和硬件的压力。

    快应用是怎么解决手机存储空间的?
    在这里插入图片描述
    快应用使用前端技术栈开发,原生渲染,同时具备H5页面和原生应用的双重优点。
    用户无需下载安装,即点即用,享受原生应用的性能体验。
    快应用框架深度集成进各厂商手机系统中,可以在操作系统层面实现用户需求与应用服务间的无缝连接,提升用户的使用体验和应用服务的转化效率,同时支持生成桌面图标等留存能力。
    开发方面,快应用标准和平台,最大化降低了开发者的开发和推广成本,开发者可一站式接入实现跨厂商终端运行。
    快应用联盟官方服务商第壹近场,快店铺通过WIFI指纹进行场景识别,以手机为流量入口,以AI为核心技术,为线下商家提供一站式SaaS平台;赋能线下商家场景的提供从“识别定位”到“手机上开店”一整套的智能场景快应用服务。与手机厂家合作,提供多种流量入口及推广方案,为入驻商家提供丰富的方案。

    展开全文
  • G13官方标配rom为512M,许多人说为什么512M的ROM只看见150M,其实其余的是被system及cache等占去了。...很多玩家想了很多办法来增加g13的存储空间,比如用app2ad、Link2SD等等,但这些都治标不治本,
  • 有许多使用安卓的小伙伴说自己内存一直是不够用,其实我们通过设置它的虚拟内存来解决,下面是学习啦小编为大家介绍安卓手机设置增加虚拟内存的方法,欢迎大家阅读。安卓手机设置增加虚拟内存的方法1这里只讲解一个最...
  • 使用netty4.X实现的手机游戏服务器,支持tcp,udp,http,websocket链接,采用protobuf自定义协议栈进行网络通信,支持rpc远程调用,使用mybatis3支持db存储分库分表,支持异步mysql存储,db保存时同步更新reids缓存。...
  • 智能手机游戏编程学期项目 智能手机游戏编程学期项目... 如果您在满足某些条件的同时碰铃,您的分数将会增加。 敌人AI(计算机。卡以一定速度翻转。当在一定范围内以随机速度满足条件时,按门铃。在条件不以特定概率
  • 新版的SDK越来越方便使用,摆脱了命令行的输入,不过命令有时解决大问题 ...ROM手机内存 手机自带存储大小 也是系统分区 刷机也就是刷系统所用的ROM版本也是指此 使用SDK 模拟Android系统手机内存只能是94...
  • 存储解析

    2018-07-19 12:02:34
    云计算 [1] (cloud computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。过去在图中往往用云来表示电信网,后来...
  • 提取码:d3jj 复制这段内容后打开百度...计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,已经不能满...
  • 新版的SDK越来越方便使用,摆脱了命令行的输入,不过命令有时解决大...ROM手机内存 手机自带存储大小 也是系统分区 刷机也就是刷系统所用的ROM版本也是指此 使用SDK 模拟Android系统手机内存只能是94M,更改
  • 代码指的是系统代码,Android系统支持USBhost功能。当u盘插在手机上时,系统自动甄别其是否为指定外设,如果是,没有额外动作,一切如常;如果不是,系统自动移除外设;楼主是Android新手,希望大家给予些帮助或思路
  • 截至2020年10月,全球手机用户约54亿人,网民约45亿人,全球每天产生的数据约300多万T,每年所需存储空间约为100亿T,我们对数据存储的需求仍在增长。然而,现实中还存在海量闲置的空间资源未被利用。 数据的有效...
  • 基于Symbian的情景数据存储管理,袁梦龙,罗明珊,随着智能手机所集成的传感器数量和用户对手机依赖性的增加,应用程序通过手机所能采集的关于用户行为或使用场景相关的数据越来越
  • 计算机从最初到现在经历了无数次技术革新,而其中央处理器与内存储器的空间也在日渐增加。一个世纪未到,存储空间的度量单位甚至跨越了四个量级,如今我们所使用的计算机也与几十年前大不相同。 举我们身边的例子...
  • mysql存储过程

    2009-10-07 15:20:35
    由于数据库扩展,db1_user中,将增加一个字段mobile,如果用户名为手机号码,则将mobile的值为用户名,否则为空. create procedure mobile() begin declare temName int default 0; declare username varchar(32)...
  • 软件网络化已经成为智能手机的趋势,在苹果推出了自己Mobile Me服务之后,微软也要推出自己的网络存储服务了,它的名字叫做:My Phone。两者的名字很像,不是么?就是功能也是异曲同工。 My Phone服务可通过手机...
  • Android 存储路径我这里分为内部存储和外部存储,其中这里的外部存储指了手机内部的SDCard,很多手机可能额外还有扩展卡内存,可以增加扩展卡(外置SDCard),这里我不做说明了。内部存储其实我们用到的最多的/data...
  • 在不少人的眼中,折叠屏手机往往无法给人以踏实感,能够被感知到的折痕、看起来很脆弱的铰链,容易让用户担心机身磨损以及机械结构强度。近日,国外虐机达人JerryRigEverything针对华为Mate X2进行了一番堪称暴力的...
  • 本文分享一个通过数据库(ORACLE)的存储过程,遵循“对修改封闭,对增加开放”的开闭原则,实现的可扩展性极强的灵活接口方案。 背景 本人从事离散型MES系统的开发工作,近期负责了一个PCBA(电子、手机)行业的...
  • 为了保持“联系和联络”,消费者越来越多地依赖于他们的便携式设备,其范围包括了从智能手机、个人媒体播放器与数码相机到新兴的解决方案,例如笔记本电脑等。目前的手持设备可为多种应用服务,并提供了各种不同的...
  • 昨天,看到自己的手机上显示存储空间已满,请删除一些数据的提示,觉得很奇怪。因为,手机内存在前几天还是20多M剩余,这几天也没有做过什么消耗 内存的操作,手机内存不可能就这么没有了!我试着删除几条短信息...
  • ST推出微小型高集成芯片,该芯片使用ST公司世界领先的IPAD (Integrated Passive and Active Devices)技术生产,可以为手机、GPS导航设备、数码相机及大量使用可抽取SD协议卡的其他消费类和工业产品提供存储卡接口所...
  • 2021年全球存储产品全线提价。2月底的DRAM、内存模块、NAND FLASH、NOR Flash等的价格均出现调涨。以内存的价格为例——DRAMeXchange数据显示,截至今年2月3日,8Gb DDR4...随着PC、5G手机、汽车、数据中心对存储性能和
  • 无线移动软件工程和普适计算最终项目的存储库 概述 无处不在的计算已成为每个人日常生活的一部分。 计算机无处不在,没有人注意到它。 智能手机的兴起也促进了基于手机的软件和应用程序的开发。 如今,人们经常使用...
  • windows phone的所有文件IO操作都被限制在隔离存储空间中(IsolatedStorage),因此一个应用程序是不能访问注册表和其他应用程序内容的。... 我们在隔离存储空间中可以增加、删除、修改文件和目录,也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 753
精华内容 301
关键字:

手机增加存储