Android开发之基础------------测试相关、sdcard操作、SharedPreferences存取

Android设备标识符合规存储:从权限最小化到全链路加密实践 设备标识符是移动开发中用于识别设备的关键技术概念,其本质是一串能够唯一标识硬件或软件实例的字符序列。在Android生态中,标识符的工作原理经历了从全局统一到应用隔离的演变,例如Android ID在Android 8.0后变为由应用签名、用户和设备共同决定。这项技术的核心价值在于平衡功能实现与用户隐私保护,确保在广告归因、风险控制等应用场景下合法合规。随着GDPR等全球隐私法规的强化,标识符处理必须遵循“权限最小化”和“目的限定”原则,采用分层存储与加密技术。本文聚焦于通过Android Keystore 阅读详情

好的软件是测试出来的!

一.对app的测试常见的测试方法有monkey测试,使用adb shell指令完成。

1.具体指令:   adb shell    进入手机的Linux环境。

monkey   包名(packageName)    测试次数(count )      

monkey测试可以形象比喻成让一只淘气的小猴子在你的手机上点上指定的(count)次数。

二、如果需要测试代码功能模块,可以使用单元测试,两种方法。

第一种方法 1.创建一个类集成AndroidTestCase,该类就具备了单元测试的功能
2.在androidmanifest.xml文件中的application节点下配置一个uses-library
    <uses-library android:name="android.test.runner" />
3.在androidmanifest.xml文件中的manifest节点下配置一个instrumentation, 其中targetPackage代表要测试的是哪个工程。
       <instrumentation android:name="android.test.InstrumentationTestRunner"
                android:targetPackage="cn.itcast.action" android:label="Tests for My App" />
第二种 4.如果不知道如何配置androidmanifest.xml,可以右击新建一个android test project;就会自动配置。

再说说关于手机的sdcard的相关操作

#5.存储到SD卡,获取SD的大小及可用空间  



sdcard使用注意事项:


1.硬性编码问题 ,通过Environment获取一个sdcard的目录

Environment.getExternalStorageDirectory().getPath();

2.权限问题,需要在androidmanifest.xml加一个写外部存储的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3.判断sdcard的状态

Environment.getExternalStorageState();//获取sdcard的状态

//判断sdcard的状态是否可用
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(mContext, "sdcard不存在或未挂载", Toast.LENGTH_SHORT).show();
return;
}
4.判断sdcard的剩余空间

File sdcard_filedir = Environment.getExternalStorageDirectory();//获取sdcard目录的文件对象
long usableSpace = sdcard_filedir.getUsableSpace();//获取可用空间
long totalSpace = sdcard_filedir.getTotalSpace();//获取sdcard总空间

String usableSpace_str = Formatter.formatFileSize(mContext, usableSpace);//格式化文件大小为字符串
String totalSpace_str = Formatter.formatFileSize(mContext, totalSpace);

if(usableSpace < 200 * 1024 *1024){//判断sdcard空间是否小于200M,如果小于提示用户
Toast.makeText(mContext, "sdcard空间不足,剩余"+usableSpace_str+",总空间:"+totalSpace_str, Toast.LENGTH_SHORT).show();
return;
}

SharedPreferences介绍  (重点) 用来做数据存储


SharedPreferences是用来存储一些键值对数据,如标记性的信息,设置性的信息。
SharedPreferences存储数据是以xml文件存储数据的。


使用SharedPreferences存储数据:



//1.通过Context对象创建SharedPreference对象
//name : sharedPreference文件的名称   mode:文件的操作模式
SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
//2.通过sharedpreference对象获取一个Editor对象
Editor editor = sharedPreferences.edit();
//3.往Editor对象中添加键值对
editor.putString("username", username);
editor.putString("password", password);
//4.提交Editor中的数据
editor.commit();


使用SharedPreferences读取数据:
//1.通过Context对象创建SharedPreference对象
//name : sharedPreference文件的名称   mode:文件的操作模式
SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);


//2.直接使用sharedpreference获取值
//key:存放到shared中的键值对中的键   defValue:代表着默认值 ,当sharedPreference不存在时返回默认值
String username = sharedPreferences.getString("username", "");
String password = sharedPreferences.getString("password", "");




使用PreferenceManager获取一个默认的sharedPreference对象.
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);

Android单元测试之 Mockito,sharedpreferences线程安全 public void playWavFile(String fileName){ playedWav=true; } public boolean wavWasPlayed(){ return playedWav; } public void resetWav(){ playedWav=false; } } 这样我们通过Mock出来的对象,就可以随时模拟时间的流动的。 1.4 Mockito介绍 Mockito是Mock框架下的一种实现,所以Mockito的测试思想就是Mock的测试思想。 目前An 阅读详情

相关推荐

Android外卖App实战:RecyclerView+Room+状态机完整工程

Android App开发中,RecyclerView是替代ListView的现代列表控件,Room则是Google推荐的SQLite抽象层数据库方案,二者结合可构建具备数据持久化与高效UI更新能力的移动应用。其核心原理在于通过ListAdapter实现智能Diff更新、利用Room注解生成DAO简化数据库操作,并借助枚举驱动的状态机保障业务逻辑严谨性。这类技术组合广泛应用于订单管理、商品展示等典型场景,尤其适合课程设计与初学者项目落地。本文提供适配Android Studio 2023.2+、支持targ

weixin_34253126的博客 374

Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?

前言上篇《Android单元测试 - 几个重要问题》 讲解了“何解决Android依赖、隔离Native方法、静态方法、RxJava异步转同步”这几个Presenter单元测试中常见问题。如果读者你消化得差不多,就接着看本篇吧。在日常开发中,数据储存是必不可少的。例如,网络请求到数据,先存本地,下次打开页面,先从本地读取数据显示,再从服务器请求新数据。既然如此重要,对这块代码进行测试,也成为单元测...

qq_42483967的博客 993

wanAndroid客户端源码解析:MVVM+Room+Retrofit生产级实践

Android应用架构设计是移动开发的核心能力,其中MVVM模式通过分离关注点提升可维护性,Room数据库提供编译时校验的本地持久化方案,Retrofit则统一管理网络请求与响应解析。三者协同构建出具备离线缓存、状态管理、模块解耦等特性的健壮架构。本文以真实维护的wanAndroid客户端项目为蓝本,深入拆解从Gradle多模块配置、JDK/SDK版本兼容,到Repository分层、StateFlow状态流、OkHttp拦截器链与Room缓存策略的全链路实现,覆盖新手入门跃迁与老手技术验证两大场景,是理解

weixin_28040125的博客 252

sd 卡测试软件 apk,CardTest V1.2A(SD/TF检测工具)

CardTest is a free software used to diagnose flash cards such as CF, SD, MMC, xD, etc through a card reader or slot. Since version 1.2a, CardTest supports scanning RAW filesystem for lost JPEG images....

weixin_31648507的博客 3160

Android中使用SDcard读取文件

平时我们需要在手机上面存储想音频,视频等等的大文件,以前学过使用File进行存储(使用File操作进行存储);由于考虑到手机本身的存储空间小,这时候我们需要把文件存储在SDcard中,今天自己也学习了一下在android进行sdcard的存储使用方法; 首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name=android.permis

TSMaster二次开发实战:如何用Python搞定CAN/CANFD事件回调(附完整代码)

本文详细介绍了如何利用Python进行TSMaster二次开发,实现CAN/CANFD事件回调功能。通过实战代码演示,讲解了预发送与后处理回调的核心区别、注册流程、资源管理及性能优化技巧,帮助工程师高效构建自动化测试与数据监控应用。

star的博客 668

【Android學習專題】数据存储篇:SharedPreferences/Files/SDCard

  【Android学习专题】数据存储篇:SharedPreferences/Files/SDCard    SkySeraph Feb 2nd 2012  SZTCL Email:zgzhaobo@gmail.com    QQ:452728574 ------------------------------------------------------------------...

weixin_34406061的博客 235

Android BluetoothSocket

BluetoothSocket是Android中用于在蓝牙设备之间进行数据传输的一种Socket。它提供了一种类似于TCP/IP协议的数据传输方式,可以在两个设备之间建立一个虚拟的通信管道,使得两个设备之间可以进行数据的传输和接收。BluetoothSocket可以用于客户端和服务端之间的通信,通过BluetoothSocket可以实现数据的双向传输。

liuning1985622的博客 1477

【Android学习专题】数据存储篇:SharedPreferences/Files/SDCard

【数据存储概述 】 Ⅰ Android的5种方式存储数据   1.使用SharedPreferences存储数据;   2.使用Files存储数据;   3.使用SQLite数据库存储数据;   4.使用ContentProvider存储数据;   5.网络存储数据; Ⅱ 测试界面  ----------------------------------------------...

weixin_34194087的博客 115

ArcGIS基础:城市交通网络构建及设施服务分析(一):道路数据处理与拓扑操作

首先需要加载数据, 1:选择这个数据库:,右键导入,选择导入单个要素,弹出“要素类至要素类” 2:输出位置(导入的数据是CAD格式数据)。 3:输出要素类为道路。 4:字段只保留道路类型字段。 这个操作是分类合并各级道路数据。 1:通过属性选择各类道路数据。 2:比如此类都是“干道”。 3:编辑器下来,然后合并即可。 得到如图所示,需要用到三个字段。 上面这个操作是打断道路相交线。 1:选中所有数据。 2:找到高级编辑中的打断相交线。 3:确定即可。 下面进行拓扑检查,虽然我们已经进行合并和打断相交.

yuanYW7556的博客 2万+

ClearML中文文档实战:从安装到第一个实验的保姆级教程

本文提供ClearML从零开始的实战指南,涵盖核心组件理解、Python SDK安装、服务器配置及首个自动化实验的完整流程。通过改造PyTorch训练脚本的实例,详细演示了如何利用ClearML自动记录实验参数、指标与模型,实现机器学习实验的可复现性与高效管理,并简要介绍了进阶的自动化工作流。

weixin_29216049的博客 398

android 面试题

ContextImpl.startActivity → Instrumentation.execStartActivity → AMS.startActivity → 校验权限、创建 ActivityRecord、Pause 当前 Activity → ApplicationThread.scheduleTransaction → ActivityThread.H → LaunchActivityItem → performLaunchActivity(创建 Activity、调用 onCreate)。

qq_25657125的博客 391

避坑指南:微信小程序蓝牙广播在iOS上的那些‘坑’(附serviceUuids传值解决方案)

本文深入解析微信小程序蓝牙广播在iOS平台上的开发难点,特别是`serviceUuids`传值解决方案。通过对比iOS与安卓的蓝牙协议实现差异,提供实战编码策略和硬件端配合方案,帮助开发者有效规避兼容性问题,提升蓝牙外围设备开发效率。

weixin_30316097的博客 423

Android 复制粘贴对话框弹出监听实现

长按文本框或者webview界面,会弹出复制粘贴剪切等对话框,但是目前好多厂商都是自己写的控件,先说一下对系统的对话框进行监听的情况。 这里是为了监听对话框来对自定义view进行高度的处理,对华为三星等手机做个适配,自定义了一个view,在onLayout方法中根据自定义的view在屏幕中的位置变化来进行判断复制粘贴对话框的弹出和隐藏。代码: @Override protected

camel@Y blog 6332

【雕爷学编程】Arduino动手做(75)---TTL转RS-485模块之二线制可以实现真正的多点双向通信

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验七十五:TTL转RS-485模块 MAX485 RS485模块 MAX485 是一个8.

雕爷学编程 1万+

Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。一个程序在运行(执行)的过程中所需要的硬件和软件环境运行时的主要作用是提供程序运行所需要的环境和基础设施,通过为程序提供内存分配、线程管理、类型检查、对象实例化和垃圾回收等操作来支持程序的运行公共语言运行时(Common Language Runtime,CLR)是整个.NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境。

游戏开发小Y的博客 13万+

repo,可以直接复制粘贴到你的~/bin/repo文件中

#!/usr/bin/env python # repo default configuration # import os REPO_URL = os.environ.get('REPO_URL', None) if not REPO_URL: REPO_URL = 'https://gerrit.googlesource.com/git-repo' REPO_REV = 'stable'...

camel@Y blog 4246

040、全志V853低功耗AI视觉平台的ISP调优——电池供电场景下的画质与功耗平衡

本文分享了全志V853 AI视觉平台在电池供电场景下的ISP调优经验。作者通过实际项目踩坑案例,揭示了V853 ISP的特殊性:不同于主流平台,其ISP与CPU共享时钟域,降噪能力有限,需特别注意功耗控制。关键优化策略包括:关闭无效ISP模块、优化Sensor联动时钟、采用场景自适应配置、开发快速启动模式等。特别指出V853个体差异大,量产需考虑高低温影响。文章强调V853的ISP功耗优化需从寄存器级别精打细算,不能简单套用其他平台经验,建议选型时单独评估ISP功耗,避免续航缩水。

zzfmlxs的博客 25

Google原生输入法LatinIME词库构建流程分析(一)

进入到cpp目录下(pwd=.../cpp/),在command目录中有个pinyinime_dictbuilder.cpp文件,源码中可以看到main函数,这里就是词库构建的入口,接下来看下main函数源码: 25 /** 26 * Build binary dictionary model. Make sure that ___BUILD_MODEL___ is defined 2...

camel@Y blog 3855

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

android wifi---------------广播

2016年12月10日,今天是周六,天气不错,但是没出去,昨天在公司做WiFi这块的需求,想着把WiFi这块相关的一些广播整理以下以供自己日后使用起来方便,所以今天就在si3下一边看(WifiManager.java)一边记录一下(@hide的不要)。 //当前是否可以开始扫描:mWifiManager.startScan()可以调用否,不过这是个@hide的 public static fi

camel@Y blog 3044

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android 只获取特定包名log

此命令用于在Ubuntu命令行中获取指定包名(应用)的所有log信息: adb logcat --pid=$(adb shell pidof -s pkg_name) 把pkg_name换成需要过滤的应用包名即可,特此记录。 StackOverFlow ...

camel@Y blog 2407

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Google原生输入法LatinIME词库扩容(Windows10环境)

去年在Linux(ubuntu)环境下针对LatinIME进行词库扩容处理,针对LatinIME的词库构建进行了一些列分析,大家可以查阅历史文章。词库扩容最近试了一下是可以的,具体流程大致如下(windows10环境): 1、安装MinGw以及gcc、g++、gdb等,下载地址:e795, 安装完成配置环境变量到path(..\mingw\bin) 2、进入到..\cpp\command目录进行make windows下没有make命令的,需要到MinGw\bin目录下重命名mingw32-mak

camel@Y blog 2385

Google原生输入法LatinIME引擎初始化流程分析(二)

引擎初始化首先是在Java层调用native的初始化方法,Java层调用如下: private void initPinyinEngine() { byte usr_dict[]; usr_dict = new byte[MAX_PATH_FILE_LENGTH]; // Here is how we open a built-in d...

camel@Y blog 2367

Google原生输入法LatinIME词库构建流程分析--相关数据结构分析

其实输入法词库相关数据结构的定义基本上都在头文件dictdef.h文件中,进入到代码目录cpp下. 初始化字库,首先读取txt文件内容到数据结构lemma_arr和valid_hzs中,lemma_arr是一个数组类型为LemmaEntry,下面来看下LemmaEntry定义(cpp/include/dictdef.h): //rawdict_utf16_65105_freq.txt每一行是...

camel@Y blog 2236
上一篇: 安卓中多线程断点续传文件下载核心代码总结
下一篇: Android开发之基础-------XML文件的序列化和解析
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值