一 : content-url(content://)相比于file-url(file:///),安全很多。intent通过把uri设置为它的参数,并通过setFlags设置flag,可以让其他app获得该uri的临时访问。而file的话,授权是永久的,除非手动改变。
二:使用fileProvIDer的步骤如下:
<manifest> ... <application> ... <provIDer androID:name="androIDx.core.content.fileProvIDer" 固定 androID:authoritIEs="com.mydomain.fileprovIDer" 自定义,一般包名加provIDer就行 androID:exported="false" 是否public,是否可被访问 androID:grantUriPermissions="true"> 是否允许授予临时访问权限给文件 ... </provIDer> ... </application> </manifest>
因为fileprovIDer只能给你“事先指定”的文件路径下的文件授权,所以我们需要指定哪些文件是可以被授权的:https://developer.androID.com/reference/kotlin/androIDx/core/content/fileProvIDer#specifying-available-files, paths标签下可以有1或多个元素,
<files-path name="这里是啥无所谓" path="." />-----------1
<external-path name="这里是啥无所谓" path="." />-------------2
似乎上面那里path那个路径我除了用 . , 其他都不行
<Meta-data androID:name="androID.support.file_PROVIDER_PATHS" androID:resource="@xml/file_paths" /> 根据第二步的文件夹名,在第一步的标签下加上如果在内部存储目录下放置一张图片“1.png”的话,要生成uri,首先第二步那里要采用1,然后这样生成:
val fileDir = context.applicationContext.filesDirval file = file(fileDir, "1.png")val contentUri:Uri = getUriForfile(getContext(), "com.mydomain.fileprovIDer", file)//fragment里用requireContext(), 第二个参数和第一步里的“自定义”对应
file的absolute path为:/data/user/0/包名/files/1.jpg尽管实际上是data/data/包名/files/1.pnguri打印出来是:content://自定义的那个/这里是啥无所谓的那个/1.png
如果在外部存储目录下放置图片,第二步那里要用2,然后这样:
val fileDir = context.applicationContext.getExternalfilesDir(Environment.DIRECTORY_PICTURES)//里面可以是Environment类里的其他常数val file = file(fileDir, filename)
val contentUri:Uri = getUriForfile(getContext(), "com.mydomain.fileprovIDer", file)//fragment里用requireContext(), 第二个参数和第一步里的“自定义”对应
file的absolute path为:
/storage/emulated/0/AndroID/data/包名/files/Pictures/filename
uri打印出来是:
content://自定义的那个权限名/这里是啥无所谓的那个/AndroID/data/包名/files/Pictures/filename
还可以灵活使用query和delete对content-uri进行 *** 作,如果要使用insert和update要继承fileProvIDer自定义。 总结
以上是内存溢出为你收集整理的Android-FileProvider学习——文件 *** 作全部内容,希望文章能够帮你解决Android-FileProvider学习——文件 *** 作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)