在文件选择器中访问外部存储

Posted

技术标签:

【中文标题】在文件选择器中访问外部存储【英文标题】:Access external storage in File Chooser 【发布时间】:2015-06-04 11:48:53 【问题描述】:

我正在尝试实现文件选择器。我在我的应用程序中使用android File Explore 作为文件选择器。当我运行该应用程序时,它向我显示内部存储并返回文件路径,但它根本不显示外部存储。

这是我的 AndroidManifest.xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unicloud.mittal" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:logo="@drawable/ic_launcher"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".loginWithGooglePlus"
            android:label="@string/app_name"
            android:logo="@drawable/ic_launcher" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".FileExplore"
            android:label="Pick a file"
            android:permission="android.permission.MANAGE_DOCUMENTS" >
            <intent-filter>
                <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
            </intent-filter>

        </activity>
    </application>

</manifest>

我哪里做错了?

【问题讨论】:

也添加你的java代码?您使用哪个 API 来获取外部存储? 链接到我的 java 文件在问题的第一行,我正在使用 API 21... 【参考方案1】:

在上面的 github 链接中,您使用的是 Environment.getExternalStorageDirectory() API,它按预期工作。我想你误解了这个 API 的使用。此 API 将始终返回主外部存储目录。以下解释可能对您有所帮助:

首先,内部存储、外部存储(也称为主外部存储)和辅助外部存储有什么区别?

内部存储:是用户无法访问的存储,除非通过已安装的应用程序(或通过 root 设备)。示例:data/data/app_packageName

主外部存储:内置共享存储,“用户可以通过插入 USB 电缆并将其作为驱动器安装在主机上来访问”。示例:当我们说 Nexus 5 32 GB。

辅助外部存储:可移动存储。示例:SD 卡。

现在下一个问题。如何在 Lollipop 中访问 SD 卡? 为了访问 SD 卡,Android 在 KitKat 中引入了新的Storage Access Framework。

这里有一个解释得很漂亮的答案:https://***.com/a/26765884/631803

【讨论】:

我的 min sdk 是 4.0.3,我的编译和目标 sdk 是 5.0。那么如果我使用 KitKat 的这个 Storage Access Framework 方法,它是否适用于所有 Android 4.0.3+ 的设备? 没有。它仅适用于软件版本 >=KitKat 的设备

以上是关于在文件选择器中访问外部存储的主要内容,如果未能解决你的问题,请参考以下文章

无法在文件夹中写入外部存储下载 - Android

Android 内部和外部存储

从 nuxtjs 中的外部 js 文件访问存储

访问 Nucleo 上的外部存储

错误记录Android 分区存储下的 SD 卡应用专属外部存储空间目录访问 ( 需手动创建应用专属外部存储空间目录 )

错误记录Android 分区存储下的 SD 卡应用专属外部存储空间目录访问 ( 需手动创建应用专属外部存储空间目录 )