Android外部存储无法访问问题解决方法

 最近在做Android 应用开发,IDE是android studio ,  使用的版本配置如下:

compileSdk 32
buildToolsVersion '32.0.0'
defaultConfig {
    applicationId "com.example.gzpersonmanager"
    minSdk 21
    targetSdk 32
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

可以看到使用的框架版本是32.1.1 ,使用的时最新的Android 12 版本的API和SDK, 开发过程中涉及到一个场景,就是要把APP的SQLite 数据库,通过外部存储,使用代码,写入APP的内部数据存储 /data/data/packetname/files/databases/ 目录下,主要是为了数据库安全,简单来说就是一个把外部Sqlite数据库文件,在APP启动过程中,复制到APP私有的data/data/目录下,实现数据库本地更新。
但是在过程中遇到一个错误,提示是 没有权限访问外部存储,刚开始是以为没有授权,检查

AndroidManifest.xml ,文件,权限设置如下:是没有问题的。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

文件路径暴露映射也没有问题,配置如下:没有问题!

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.example.gzpersonmanager.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/authfileinfo" />
    </provider>

xml/authfileinfo 文件配置如下: 内部的/data/data/包名/files 和 外部存储路径都映射为真实地址。

没有问题。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path path="." name="files" />
    <external-files-path path="." name="sdcard" />
 </paths>

但是真机调试,还是调试没有权限 ! 百度好多文件,所有的方法都测试了,依旧不行。

最后,终于发现一篇文章,官方在Android 11 以后,使用的存储分区管理,默认所有的应用,可以访问自己的APP私有内部存储,即 /data/data/包名/* 目录,和外部存储的媒体目录,外部存储的媒体目录需要授权后,即可访问,这些目录包括 相册,音乐,和视频目录,除此之外的其他外部存储目录,均无法访问,包括 sdcard/Android/ 和 sdcard/Download目录, 这就是主要原因,知道原因就好解决了。

1.使用存储分区访问, 网上很多帖子都说 requestLegacyExternalStorage =“true” 就可以,事实上,亲自测试,次方法在 targetSdk>29 以上的版本中,依旧无效。
可以使用Scoped Storage 适配来访问外部存储的其他目录,这是第一种方法。

2就是我现在使用的方法, 将框架版本改为28,即 targetSdk:28 , 然后重新删除APP,然后Sync Gradle 工程,就可以完美解决这个问题。

现在就可以完美解决这个问题了。

到此这篇关于Android外部存储无法访问问题解决方法的文章就介绍到这了,更多相关Android外部存储无法访问内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android存储访问框架的使用小结

    目录 打开系统文件选择器与文件过滤 打开指定文件夹 文件夹权限申请 创建文件夹 存储访问框架API 获取文件夹文件 和MediaStore API的不同 存储访问框架,简称:SAF, 就是系统文件选择器+文件操作API.先选择文件,在用文件操作API处理文件.系统文件选择器,就和Windows的文件选择框一样. 其实绝大多数app,都不会使用这个东西,因为太不方便了.图片,视频,普通文件,需要用户去翻文件夹找,这样的用户体验实在太差了.所以大家都是用第三方的或者自己写一个文件选择器. 之所以讲S

  • Android外部存储无法访问问题解决方法

    最近在做Android 应用开发,IDE是android studio , 使用的版本配置如下: compileSdk 32 buildToolsVersion '32.0.0' defaultConfig { applicationId "com.example.gzpersonmanager" minSdk 21 targetSdk 32 versionCode 1 versionName "1.0" testInstrumentationRunner &quo

  • Android调用系统默认浏览器访问的方法

    一.启动android默认浏览器 这样子,android就可以调用起手机默认的浏览器访问. 二.指定相应的浏览器访问 1.指定android自带的浏览器访问 ( "com.android.browser":packagename :"com.android.browser.BrowserActivity":启动主activity) Intent intent= new Intent(); intent.setAction("android.intent.a

  • Android 文件存储及常见问题解决

    Android文件存储 看下网上随处可以搜到的文件存储套路 if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ cacheDir=mContext.getExternalCacheDir().getPath(); }else { cacheDir=mContext.getCacheDir().getPath(); } fileOutputStream=new FileOutputStream(c

  • jquery 跨域访问问题解决方法(笔记)

    这两天需要实现三级域名直接url rewrite到网站静态页面,如 http://123.456.789.com/ UrlRewrite到http://www.789.com/news/123.html 说到这里,也许和js跨域访问没有半点关系,在脑海里排列这的问题都是和UrlRewrite相关的.好吧现在URLRewrite一切就绪,直接在浏览器地址栏中输入http://123.456.789.com/ 会发现,这个在地址栏直接通过http://www.789.com/news/123.htm

  • Android接入ffmpeg库及问题解决方法

    目录 一.准备交叉编译环境 二.交叉编译ffmpeg+libx264+libfdk-aac 1. 交叉编译libfdk-aac 2. 交叉编译libx264 3. 交叉编译ffmpeg 一.准备交叉编译环境 我的环境如下: 系统:ubuntu20.04 NDK版本:r17c NDK构建交叉工具链的方法参考:https://developer.android.com/ndk/guides/standalone_toolchain?hl=zh-cn NDK r17c下载链接:https://deve

  • jQuery 跨域访问问题解决方法

    时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了. 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘. 跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的, 所以通过本机服务器端通过类似httpclient方式完成"跨域访问"的工作,然后在浏览器端用AJAX获取本机服务器端"跨域访问"对应的url.来间接完成跨域访问也是可以

  • Android Studio的中文乱码问题解决方法

    Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框  可以肯定是字体的问题 解决:菜单File->settings对话框,切换到Appearance标签  选择override default fonts by, 先随便选择一个中文字体(PS:小框框都是中文字 呵呵),保存,重启软件,即可.

  • Android中fragment嵌套fragment问题解决方法

    都说fragment好用,duang~~,又遇到问题了,记录一下,分享给遇到这个问题的同学! 1.fragment嵌套fragment时出现getActivity()为null activity A嵌套fragment B,B嵌套fragment C,C跳转到activity D,当activity D被finish掉之后,C中容易爆出getActivity为空.如果你的activity被回收了,那你需要在bundle中保存一下fragment信息,我的解决方法:fragment实例化之后会到a

  • Android动态添加View的问题解决方法

    后台代码 复制代码 代码如下: private void ChangeView()    {        ly.removeAllViews();        LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);        View layout = inflater.inflate(R.layout.grid,null);        GridView gridview

  • Android编程实现TCP客户端的方法

    本文实例讲述了Android编程实现TCP客户端的方法.分享给大家供大家参考,具体如下: 因为项目上需要实现一个TCP Client 端:在网上找好多例子基本上都是阻塞方式完成: 我的实现例子:由Activity 及sever 来实现,在sever 创建一个线程来监听接受数据.收到数据,通过广播发送给Activity; 服务端我没有去实现,你可以下载TCP Socket 调试工具v2.2:创建个9005端口:客户端:访问的IP为10.0.2.2 AnetTest.java: /** * Copy

随机推荐