目录
Android操作权限设置与Apk真正安全的缓存数据
一、常用的关于Android系统的路径设置知识
二、Android路径路径设置和使用不得当带来的问题
2.1、应用数据愈来愈大,手机或手机助手提供用户做清理
被删除的路径,其中,包含了files路径和cache临时缓存路径、临时路径tmp,具体到代码级别,就是:
2.2、因而将你的数据放在TPath.GetPublicPath包的公开路径下其实是不安全的
三、除非用户很专业才会用手机助手去删除的路径
内部存储共享的文档路径:
内部存储共享的图片路径:
内部存储共享的照片路径:
内部存储共享的下载路径:
等等:
总结一下安全的真正可以用来被你用作Apk本地缓存的路径:
四、要使用路径首先要动态申请获取Android权限
《delphi开发Android获取手机权限》:
五、应当在什么时机代码动态申请获取Android权限
5.1、考虑除了路径因素以外的Apk影响因素
系统注册与登录是任何App的必需品,它离不开Android包信息及版本信息的获取及其必须的Android权限
5.2、请问什么时机最合适?!
一定要规避用户首次使用App时面临的问题
六、Delphi开发Android手机Apk时主窗体的设计及窗体间的上下文切换
6.1、设计与步骤
6.2、京东商城Apk案例
6.2.1、京东Apk首次下载安装界面-即闪屏页面Splash的主窗体
6.2.2、京东Apk首次下载安装的权限android.permission.CALL_PHONE
6.2.3、京东Apk广告类欢迎页面动态申请的权限及关闭页面前的本机配置数据处理
6.2.4、京东Apk最终应用界面的主窗体
6.2.5、查询京东Apk首次安装后的权限
6.2.6、您是否发现京东Apk首次安装后的数据超大
6.3、三个主窗体分别做什么、它们如何切换用户态进程的上下文
6.3.1、应用程序的闪屏页面Splash主窗体
6.3.2、应用程序的广告类欢迎页面的主窗体
6.3.3、最终应用页面的主窗体
群友有问起我Android本地缓存数据的问题,专门写一篇,给同事们共享一下。
常用的关于Android系统的路径,请参考本博客博文,不再赘述:《手机路径、Windows路径知识》https://blog.csdn.net/pulledup/article/details/96837667
但是,路径如果设置和使用不得当,会带来问题:
如果用户在手机上点了【设置-应用管理-存储-删除数据】:
上图中,应用的【数据】越来越大,用户被迫干脆给你清掉了,他可能会点【删除数据】!
【删除数据】删的是哪个路径呢:
删除前:
删除后:
System.IOUtils.TPath.GetPublicPath :/storage/emulated/0/Android/data/你的应用的包名及Android_packageName/files
获得权限后可读可写
System.IOUtils.TPath.GetTempPath :/storage/emulated/0/Android/data/你的应用的包名及Android_packageName/files/tmp
获得权限后可读可写
System.IOUtils.TPath.GetPicturesPath:/storage/emulated/0/Android/data/你的应用的包名及Android_packageName/files/Pictures
其中,你的应用的包名及Android_packageName :
PackageName := TAndroidHelper.Context.getPackageName;
Android_packageName := JStringToString(PackageName);
而/storage/emulated/0/Android/data/你的应用的包名及Android_packageName/files/cache路径下的东西,如果用户在手机上点了【设置-应用管理-存储-清空缓存】,则下图中的图片数据会消失:
System.IOUtils.TPath.GetPublicPath :/storage/emulated/0/Android/data/你的应用的包名及Android_packageName/files
这些个,凡是在TPath.GetPublicPath下的子路径,都不安全:
System.IOUtils.TPath.GetTempPath
System.IOUtils.TPath.GetPicturesPath
......
System.IOUtils.TPath.GetSharedDocumentsPath : /storage/emulated/0/Documents
System.IOUtils.TPath.GetSharedPicturesPath : /storage/emulated/0/Pictures
System.IOUtils.TPath.GetSharedCameraPath : /storage/emulated/0/DCIM
System.IOUtils.TPath.GetSharedDownloadsPath : /storage/emulated/0/Download
TPath.GetSharedDownloadsPath参数Android存取位置:/storage/emulated/0/Download
TPath.GetSharedMusicPath参数Android存取位置:/storage/emulated/0/Music
TPath.GetSharedMoviesPath参数Android存取位置:/storage/emulated/0/Movies
TPath.GetSharedAlarmsPath参数Android存取位置:/storage/emulated/0/Alarms
TPath.GetSharedRingtonesPath参数Android存取位置:/storage/emulated/0/Ringtones
TPath.GetSharedDocumentsPath参数Android存取位置:/storage/emulated/0/Documents
TPath.GetSharedPicturesPath参数Android存取位置:/storage/emulated/0/Pictures
TPath.GetSharedCameraPath参数Android存取位置:/storage/emulated/0/DCIM
TPath.GetSharedDownloadsPath参数Android存取位置:/storage/emulated/0/Download
TPath.GetSharedMusicPath参数Android存取位置:/storage/emulated/0/Music
TPath.GetSharedMoviesPath参数Android存取位置:/storage/emulated/0/Movies
TPath.GetSharedAlarmsPath参数Android存取位置:/storage/emulated/0/Alarms
TPath.GetSharedRingtonesPath参数Android存取位置:/storage/emulated/0/Ringtones
https://blog.csdn.net/pulledup/article/details/107773589
它会涉及本机唯一识别码,本机唯一识别码与Android包信息及版本信息:
如何获取本机唯一识别码与Android包信息及版本信息,以下引用“高勇的手机通用功能框架”,需要的可以联系他入群delphi移动编程大本营(群号174483085):
因而,这涉及到App主窗体的设计及窗体之间的上下文切换。
设计三个App主窗体,让它们在应用程序的不同阶段正确进行上下文切换:
6.1.1、应用程序的闪屏页面Splash主窗体
6.1.2、应用程序的广告类欢迎页面的主窗体
6.1.3、最终应用页面的主窗体
隐私政策:
该主窗体是个TabControl可以自动切换欢迎或广告的图片或页面,请注意:
1、这个背景界面似乎和最终应用页面的主窗体相似,其实是一个独立的广告类欢迎页面;
2、这里是静态图片或分发到本地的动态加载的图片,并非从Rest服务器请求的图片。
理由:可读完6、即可明白:
请注意上面截图,1:Android的权限弹窗,它是不阻塞的,也就是说,它是不阻塞TabControl的计时分页Action显示slide幻灯片的。
请注意上面截图,2:Android的权限弹窗的背后的背景,颜色在发生过渡,这是符合TabControl的slides特征的。
请注意6.2.6,3:Android权限申请完毕,首次安装之后存储情况。
请注意,4:该广告欢迎页面关闭前,它做了必要的本机配置数据的存取,以控制将来任意时候,用户重新进入系统,在本页面的计时分页Action停留多长时间,或者根本不显示本页面:
请注意,5:一旦经历了上述步骤,之后任意时候用户手动【设置-应用管理-应用权限】,哪怕将任意权限全部关闭即未授予任何权限,京东Apk也依然正常运行:
但是,如果机主在任何时候,操作【设置-应用管理-京东-存储-删除数据】:
在删除之前,你会发现,应用【数据】发生了改变,
在删除之后,再次启动应用,您将会被迫重复之前6.2.1、6.2.2、6.2.3的操作。
这些,充分说明,在步骤6.2.3中,京东已经将必要的配置信息,写入到了伴随应用程序Deployment在路径.\assets\internal\下的不可见的本机配置文件中啦:
System.IOUtils.GetHomePath+PathDelim+某配置文件
或
System.IOUtils.GetDocumentsPath+PathDelim+某配置文件。
该主窗体已经可以和Rest服务器交互数据啦:
请注意,只有必须的“电话+位置”权限,并无我们通常意识下的“存储”权限:
其下的单项权限明细为:
请注意,读取本机识别码:
请注意,京东Apk首次安装后的数据327MB占了总计Apk存储的一半还多:
为什么这样呢?!
它把几乎所有必须的静态资源(包含图片、图标、文件、声音、视频、Sqlite本机数据库等多媒体文件)均在应用开发时Deployment分发出来了,为的是,保证运行时Apk的本地高效。
综合京东商城App及实际应用的需要:
设计三个App主窗体,让它们在应用程序的不同阶段正确进行上下文切换:
6.1.1、应用程序的闪屏页面Splash主窗体
6.1.2、应用程序的广告类欢迎页面的主窗体
6.1.3、最终应用页面的主窗体
作用:友好地展示应用的闪屏(iOS称为故事板),它是一个App的品牌Logo的展示区。
通常这个窗体在做主窗体的上下文切换期间,Android操作系统会自动拉起所有你的应用中会用到的(即你必须在AndroidManifest.xml中显式的声明的所有运行时受限类别的权限)“运行时的受限的权限类别”,详见:《Android权限分类及保护级别》https://blog.csdn.net/pulledup/article/details/116092001
这些权限的使用原则:1、操作系统自动拉起授权许可时,如果权限被机主“禁止”,并且在应用程序的代码动态调用这些受限数据或受限操作的时机,仍然被机主“禁止”的话,那么下次启用应用时,仍然会被自动拉起;并且当应用程序运行到被检测到调用了这些受限数据或受限操作的时刻,会被操作系统抛出“权限不足”(permission deny权限受限)的异常;2、操作系统自动拉起授权许可后,当应用程序运行到可能会被检测到调用这些受限数据或受限操作的时刻之前,代码仍然需要动态动态调用这些受限数据或受限操作,让机主再次确认“始终允许”,以防“自动拉起授权许可”时被用户“禁止”,会导致异常的不良用户操作体验。
需要注意的是:1、除非您的商业级别能与类似“京东”和BAT一样(因为它们均有与手机厂家特权或Android平台OEM谈判的筹码),否则,可能在此会自动拉起比较多的所有运行时受限类别的权限。2、除非你能给最终用户带来类似BAT或京东一样的信用认可,否则不要在应用存储内积累越来越大的“应用-数据”,这样稍有不慎,数据就被用户给“删除”了;这样可能会带来从远程服务器重新下载或同步更新大量数据的消耗,这些都是不良的用户体验。
作用:1、顾名思义,就是简单的广告和欢迎;2、同时这个时刻,动态拉起应用必须的动态权限的充分理由以让用户充分理解并提请用户授权通过;3、在拿到“受限数据或受限操作”的权限后,代码做相应的操作或数据的读写。
技巧:1、可以在这个窗体被用户关闭之前,拿到权限,并提前做好App所需的数据的异步准备(无论本机的,还是远程的,抑或是远程到本地的同步);2、主窗体之间的上下文切换,在正确的时机产生Create“6.3.3最终应用页面的主窗体”、在在正确的时机显示加载出Show“6.3.3最终应用页面的主窗体”。
作用:和用户进行App功能的具体展示、UI的交互、业务逻辑及数据的处理。
技巧:最好在它Show出来时,App所必须的基础资料等数据,已经被下载或同步更新到本地数据库啦,或者用户所需数据的头20分页数据已经被下载或同步更新到本地数据库啦,这样能带来良好的UE用户体验和优异的App性能。