- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个小应用程序,用于读取必须定期从设备外部源(USB、蓝牙、Airdroid 等)写入设备存储的文件。从我读过的内容来看,没有类似的东西可以写入内部存储。我想管理内部存储中的文件以获得访问隐私。
我的第一个解决方案是让用户将文件写入外部存储,然后点击一个按钮将它们传输到内部存储。如果这在 n 分钟内没有发生,则外部存储上的文件将被销毁。但是,从那以后我发现 getExternalStorageDirectory
非常无用,因为设备在内部存储上模拟外部存储,而 Android 不知道这是否完成以及如何完成。
但我想知道是否有某种内置 Activity 允许用户直接从内部存储上传或下载文件,但不能像内部存储那样免费访问内部存储的整个文件结构.
作为最后的手段,也许我的应用程序可以通过 TCP 连接接收文件并将它们写入内部存储本身。这很困惑,但试图找到一张 SD 卡也是如此。见问题Find an external SD card location .
NEW:这个练习的目的是在SD卡上的一个目录中找到所有的.csv文件,让用户选择一个,处理它,并将输出文件写入SD卡.用户将输入一个“权重”值,该值将用于处理文件的计算。
但是,由于 Android 在提供真正的外部存储(即 SD 卡)的位置方面非常不可靠,我想尝试将文件存储在内部存储中,Android 似乎更诚实可靠地确定文件的位置存储。
最佳答案
TLDR:getExternalStorageDirectory()
和 getExternalFilesDirs()[0]
(API 19+)应该返回“主要”存储位置,即内部存储。
编辑:如果您只想写入eMMC 并且不关心它是私有(private)的,只需使用getFilesDir()
和它保证您正在写入 eMMC。
解释:
为了避免晦涩和方便,我将使用以下术语
/data/data/package name
如果我对你的问题的理解是正确的,你不想写入PrivateStorage,这将NOT允许其他应用程序访问该数据。因此,目标是写入 eMMC ,更具体地说,是可公开访问的 eMMC 而不是在 eMMC 应用的私有(private)空间中。
根据 Android 文档 (API 1),
Environment.getExternalStorageDirectory()
returns the primary external storage directory. This directory may not currently be accessible if it has been mounted by the user on their computer, has been removed from the device, or some other problem has happened. You can determine its current state with getExternalStorageState().
并且根据API 19 docs ,
You can now read and write app-specific files on secondary external storage media, such as when a device provides both emulated storage and an SD card. The new method getExternalFilesDirs() works the same as the existing getExternalFilesDir() method except it returns an array of File objects.The first entry in the returned File array is considered the device's "primary" external storage, which is the same as the File returned by existing methods such as getExternalFilesDir().
总而言之,getExternalStorageDirectory()
和 getExternalFilesDirs()[0]
应该 返回“primary”存储位置,即eMMC。然而在实践中您会注意到它返回的可能不一定是eMMC,对于一些手机(KarbonnTitiniumS2、XoloX3000 和许多其他手机)
这是第二个句子的一些快照:This phone TitaniumS2 was running 4.2 so I couldn't use getExternalFilesDirs()
您还可以注意到,出于同样的原因,ES Explorer 错误地 将 /sdcard0
识别为内部存储(eMMC ) 和 /sdcard1
作为新旧版本的外部存储 (SD) 并且确实继续告诉用户 sdcard0
作为内部存储。
还有一个 issue用于查找非主 (SD) 存储,已提出。
It seems there is no API function for finding non-primary external storage devices and google has no intention of fixing the situation, leaving applications to use hacky workarounds like parsing all currently mounted filesystems. It's pretty terrible for a current-gen OS to not properly support something as basic as accessing files on an inserted USB stick.
关于android - 如何让用户将文件上传到内部存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39272348/
我是一名优秀的程序员,十分优秀!