当前位置:   article > 正文

Android FileProvider的使用_fileprovider 使用

fileprovider 使用
  1. package com.lipeng.fileprovider;
  2. import android.content.Context;
  3. import android.net.Uri;
  4. import android.text.TextUtils;
  5. import androidx.core.content.FileProvider;
  6. import java.io.File;
  7. /**
  8. * 2023/4/20
  9. * @author : lp
  10. */
  11. public class MyFileProvider extends FileProvider {
  12. /**
  13. * 使用FileProvider
  14. *
  15. * 1.
  16. * 因为是ContextProvider的子类,所以需要在AndroidManifest.xml中注册:
  17. * <provider
  18. * android:authorities="${applicationId}.fileprovider"
  19. * android:name="androidx.core.content.FileProvider"
  20. * android:exported="false"
  21. * android:grantUriPermissions="true">
  22. * <meta-data
  23. * android:name="android.support.FILE_PROVIDER_PATHS"
  24. * android:resource="@xml/conversation_file_paths">
  25. * </meta-data>
  26. * </provider>
  27. * authorities:可以自定义,也可以使用(${applicationId}.fileprovider)的形式
  28. * name:即当前类,继承FileProvider的实现类,也可以如示例在清单文件中配置系统的FileProvider,
  29. * 在使用的地方直接使用系统的FileProvider,根据使用情况的多样性决定即可
  30. * android:exported="false" 只能为false
  31. * android:grantUriPermissions="true" 是否允许授予权限
  32. * android:resource="@xml/conversation_file_paths" 见2
  33. *
  34. * 2.
  35. * 因为需要对真实的文件路径进行映射,所以需要编写一个xml文档,用于描述可使用的文件目录,以及通过name去映射该文件夹目录
  36. * <resources>
  37. * <paths>
  38. * <root-path
  39. * name="root"
  40. * path="" />
  41. *
  42. * <files-path
  43. * name="files"
  44. * path="" />
  45. *
  46. * <cache-path
  47. * name="cache"
  48. * path="" />
  49. *
  50. * <external-path
  51. * name="external"
  52. * path="" />
  53. *
  54. * <external-files-path
  55. * name="external_file_path"
  56. * path="" />
  57. * <external-cache-path
  58. * name="external_cache_path"
  59. * path="" />
  60. * </paths>
  61. * </resources>
  62. * root-path/files-path/cache-path... 为对应的真实的系统文件路径
  63. * name:将真实的文件路径映射成的值
  64. *
  65. * 3.
  66. * 获取通过FileProvider获取映射的Uri, 见函数getUribyProvider()
  67. *
  68. * 4.
  69. * 授予Uri权限,有2种方式
  70. *
  71. * 一种是,通过Intent传递uri给第三方应用使用,通过addFlags的形式
  72. * Intent intent = new Intent(Intent.ACTION_SENDTO);
  73. * intent.setData(uri);
  74. * intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
  75. *
  76. * 另一种是,通过grantUriPermission(),指定包名的形式,
  77. * context.grantUriPermission("使用该uri的程序包名", providerUri,
  78. * Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
  79. * revokeUriPermission(): 删除指定uri授予给其他进程的临时权限
  80. *
  81. */
  82. private static final String PROVIDER_AUTHORITIES = ".fileprovider";
  83. public Uri getUribyProvider(Context context, String filePath) {
  84. if (TextUtils.isEmpty(filePath)) {
  85. return null;
  86. }
  87. File temFile = new File(filePath);
  88. if (!temFile.exists()) {
  89. return null;
  90. }
  91. return getUriForFile(context,
  92. context.getPackageName() + PROVIDER_AUTHORITIES, temFile);
  93. }
  94. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/669337
推荐阅读
相关标签
  

闽ICP备14008679号