关于 Android 没有文件存储权限保存文件的问题

这篇具有很好参考价值的文章主要介绍了关于 Android 没有文件存储权限保存文件的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我发现Android 有些APP 他们不需要申请文件存储权限就可以进行文件的保存翻阅大量文章总结如下:

前言:

从 Android 10 开始,Android 引入了一种新的存储权限模型,其中应用需要明确请求运行时权限以访问外部存储。在这种情况下,许多应用程序可能需要请求 WRITE_EXTERNAL_STORAGE 权限才能将文件下载到公共目录(例如 "Download" 目录)。这是为了提高用户的隐私和数据安全。

但是,有一些应用可能使用特定的权限或 API 或者具有特定的使用案例,可以绕过运行时权限请求。这通常是因为这些应用可能是系统应用、文件管理器、云存储应用、或者拥有其他特权。这些应用可能不受相同的权限限制。

在一些情况下,应用可能会使用不需要特定存储权限的公共存储 API(例如 MediaStoreDownloadManager)来保存文件到公共目录。这些 API 可能会更加灵活,但通常仍受到安全限制,以确保访问的合法性。

如果您注意到其他应用可以在不申请存储权限的情况下将文件下载到公共目录,那可能是因为它们在特权环境中运行,或者它们使用了特殊的 API,或者它们使用了其他方式来绕过权限限制。不过,通常情况下,普通的应用仍然需要明确请求存储权限,以确保合法的文件操作。

官网说明:

  • 应用专属存储空间:存储仅供应用使用的文件,可以存储到内部存储卷中的专属目录或外部存储空间中的其他专属目录。使用内部存储空间中的目录保存其他应用不应访问的敏感信息。
  • 共享存储:存储您的应用打算与其他应用共享的文件,包括媒体、文档和其他文件。
  • 偏好设置:以键值对形式存储私有原始数据。
  • 数据库:使用 Room 持久性库将结构化数据存储在专用数据库中
  • 内容类型 访问方法 所需权限 其他应用是否可以访问? 卸载应用时是否移除文件?
    应用专属文件 仅供您的应用使用的文件 从内部存储空间访问,可以使用 getFilesDir() 或 getCacheDir() 方法

    从外部存储空间访问,可以使用 getExternalFilesDir() 或 getExternalCacheDir() 方法
    从内部存储空间访问不需要任何权限

    如果应用在搭载 Android 4.4(API 级别 19)或更高版本的设备上运行,从外部存储空间访问不需要任何权限
    媒体 可共享的媒体文件(图片、音频文件、视频) MediaStore API 在 Android 11(API 级别 30)或更高版本中,访问其他应用的文件需要 READ_EXTERNAL_STORAGE

    在 Android 10(API 级别 29)中,访问其他应用的文件需要 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE

    在 Android 9(API 级别 28)或更低版本中,访问所有文件均需要相关权限
    是,但其他应用需要 READ_EXTERNAL_STORAGE 权限
    文档和其他文件 其他类型的可共享内容,包括已下载的文件 存储访问框架 是,可以通过系统文件选择器访问
    应用偏好设置 键值对 Jetpack Preferences 库
    数据库 结构化数据 Room 持久性库
    公共存储(只介绍 --- 共享存储):

如果用户数据可供或应可供其他应用访问,并且即使在用户卸载应用后也可对其进行保存,请使用共享存储空间。Android 提供用于存储和访问以下类型的可共享数据的 API:

  • 媒体内容:系统提供标准的公共目录来存储这些类型的文件,这样用户就可以将所有照片保存在一个公共位置,将所有音乐和音频文件保存在另一个公共位置,依此类推。您的应用可以使用此平台的 MediaStore API 访问此内容。
  • 文档和其他文件:系统有一个特殊目录,用于包含其他文件类型,例如 PDF 文档和采用 EPUB 格式的图书。您的应用可以使用此平台的存储访问框架访问这些文件。
  • 数据集:在 Android 11(API 级别 30)及更高版本中,系统会缓存多个应用可能使用的大型数据集。这些数据集可为机器学习和媒体播放等用例提供支持。应用可以使用 BlobStoreManager API 访问这些共享数据集。

具体公共目录内容说明:

  • 图片(包括照片和屏幕截图),存储在 DCIM/ 和 Pictures/ 目录中。系统将这些文件添加到 MediaStore.Images 表格中。
  • 视频,存储在 DCIM/Movies/ 和 Pictures/ 目录中。系统将这些文件添加到 MediaStore.Video 表格中。
  • 音频文件,存储在 Alarms/Audiobooks/Music/Notifications/Podcasts/ 和 Ringtones/ 目录中。此外,系统还可以识别 Music/ 或 Movies/ 目录中的音频播放列表,以及 Recordings/ 目录中的录音。系统将这些文件添加到 MediaStore.Audio 表格中。Recordings/ 目录在 Android 11(API 级别 30)及更低版本中不可用。
  • 下载的文件,存储在 Download/ 目录中。在搭载 Android 10(API 级别 29)及更高版本的设备上,这些文件存储在 MediaStore.Downloads 表格中。此表格在 Android 9(API 级别 28)及更低版本中不可用。

个人总结:

通过以上资料的说明:APP需要下载的文件例如是图片、视频、音乐会保存放在DCIM、Movies 或者Movies 目录中;像PDF、APK等文件可以放在Download目录中,他们不需要进行对应权限的申请;例如在Android 13中保存apk文件使用 getExternalStoragePublicDirectory 如果不申请 WRITE_EXTERNAL_STORAGE权限会保存文件失败;如果我们只用官方说明的MediaStore  API 来保存文件则不会遇到权限申请的问题。

示例代码1:

 String destinationPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/app_update.apk";

示例代码2:

public class ApkFileSaver {

    // 定义保存文件的目录和文件名
    private static final String DIRECTORY_NAME = Environment.DIRECTORY_DOWNLOADS;
    private static final String FILE_NAME = "my_app.apk";

    public static Uri saveApkFileToDownloads(Context context, byte[] apkData) {
        ContentResolver contentResolver = context.getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Downloads.DISPLAY_NAME, FILE_NAME);
        contentValues.put(MediaStore.Downloads.MIME_TYPE, "application/vnd.android.package-archive");
        contentValues.put(MediaStore.Downloads.RELATIVE_PATH, DIRECTORY_NAME);

        Uri contentUri = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
        Uri fileUri = contentResolver.insert(contentUri, contentValues);

        if (fileUri != null) {
            try {
                // 打开文件输出流并写入APK数据
                contentResolver.openOutputStream(fileUri).write(apkData);
                return fileUri;
            } catch (Exception e) {
                e.printStackTrace();
                // 处理保存文件时的异常
            }
        }
        return null;
    }
}

参考文章:https://developer.android.com/training/data-storage/shared/media?hl=zh-cn文章来源地址https://www.toymoban.com/news/detail-797282.html

到了这里,关于关于 Android 没有文件存储权限保存文件的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于在Android 11系统手机上请求READ_PHONE_STATE权限的问题

    起因是因为bugly报错: 上网查了下,原来在Android11及以上机型上调用telephonyManager.getNetworkType()需要READ_PHONE_STATE权限,于是我就在应用启动时加上了申请该权限的代码,并且在调用getNetworkType()方法的地方加了判断,如果系统版本大于等于11并且没有被授予READ_PHONE_STATE权限,就

    2024年02月12日
    浏览(50)
  • android studio开发——android11版本以上权限动态申请问题,包括文件读写、图片、相机的调用

    用于android手机的升级,现在已经是android13版本了,对于权限问题可能更加敏感了,前段时间开发发现之前的方法已经不再适用于android11以后的版本了 读写权限申请最好是跳转到设置中进行才是最好了,下面我们开始进行 首先是AndroidManifest.xml文件的权限 然后这里讲解一下权

    2024年02月10日
    浏览(59)
  • 关于android11,12权限问题Unable to decode stream: open failed: EACCES (Permission denied)

    第一次发博客 这个问题是我在制作一款app时发现的,我本来想在一个textview中加入一个图片 但是总是报错 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20230129_123518.jpg: open failed: EACCES (Permission denied) 我在浏览了大多数关于这个问题的讨论和

    2024年02月07日
    浏览(71)
  • Win10你没有权限在此位置中保存文件,请与管理员联系以获得相应权限

    问题背景: 保存文件时,弹窗:你没有权限在此位置中保存文件,请与管理员联系以获得相应权限。 解决方案: 1.右键需要保存的文件,点击\\\"属性\\\" 2.进入安全Tab   3.选择当前用户名,点击编辑,进入到编辑页面。   4. 确定用户名,并赋予权限,最后应用。   

    2024年02月12日
    浏览(53)
  • Android存储权限完美适配(Android11及以上适配)

    一、Bug简述 一个很普通的需求,需要下载图片到本地,我的三个测试机(荣耀Android10,红米 11 和小米Android 13都没有问题)。 然后,主角登场了,测试的三星Android 13 死活拉不起存储权限弹窗。 想了下,三星的系统可能和小米的系统做了些区别。于是就是看了下存储权限的版

    2024年02月06日
    浏览(48)
  • Android所有版本的存储权限适配

                 第一步:在Manifest文件添加如下权限          uses-permission android:name=\\\"android.permission.WRITE_EXTERNAL_STORAGE\\\" android:maxSdkVersion=\\\"28\\\" tools:ignore=\\\"ScopedStorage\\\"/              uses-permission android:name=\\\"android.permission.MANAGE_EXTERNAL_STORAGE\\\"/          uses-permission android:name=\\\"android.p

    2024年01月17日
    浏览(35)
  • Android 13 关于安卓判断通知权限

    判断权限是否开启: public class NoticePermissionUtil {       private static final String CHECK_OP_NO_THROW = \\\"checkOpNoThrow\\\";     private static final String OP_POST_NOTIFICATION = \\\"OP_POST_NOTIFICATION\\\";       //调用该方法获取是否开启通知栏权限     public static boolean isNotifyEnabled(Context context) {        

    2023年04月13日
    浏览(43)
  • 关于安卓13中Android/data目录下的文件夹只能查看无法进行删改的问题

    因为升级了安卓13,然后有个app需要恢复数据,打算和以前一样直接删除Android/data下对应目录再添加,结果不行,以下是结合网上以及自己手机情况来做的一种解决方案。 准备: 待恢复app(包名com.test.ai) 其他app(包名com.other.ai,这个app当做临时变量就行,随便任意app,且知

    2024年02月09日
    浏览(76)
  • 【Android 】android13 新权限获取 读写文件权限

    android13 新权限获取 参考:Android 13(API 33)读写SD卡权限的调整适配 - Mr,Han - 博客园 android在 获取文件读写权限(尤其是音视频、图片等等资源)的权限获取逻辑更换了。 必须申请如下权限: 这段逻辑可以看上面的文件拷贝类的代码:

    2024年02月04日
    浏览(68)
  • Android 保存/读取本地SD卡文件(兼容Android 13)

    1.manifeast文件 (1)app权限 (2)application配置 (3)组件配置 注意:Android 12以上,组件创建会自动生成以下属性 表示”是否支持其它应用调用当前组件” 如果不添加改属性,会报错。 2.动态申请文件存储权限 说明,Android的权限根据版本号分为三种 1:Android6.0之前 2:Androi

    2024年02月05日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包