Android 如何让用户将文件上载到内部存储器?
我正在编写一个小应用程序,它从设备外部的源读取必须定期写入设备存储的文件,无论是USB、蓝牙、Airdroid等。从我读到的内容来看,没有任何类似的东西可以写入内部存储。我想管理内部存储中的文件以获取隐私 我的第一个解决方案是让用户将文件写入外部存储器,然后点击按钮将其传输到内部存储器。如果n分钟内没有发生这种情况,则外部存储器上的文件将被销毁。但是,我后来发现,Android 如何让用户将文件上载到内部存储器?,android,file-transfer,android-file,Android,File Transfer,Android File,我正在编写一个小应用程序,它从设备外部的源读取必须定期写入设备存储的文件,无论是USB、蓝牙、Airdroid等。从我读到的内容来看,没有任何类似的东西可以写入内部存储。我想管理内部存储中的文件以获取隐私 我的第一个解决方案是让用户将文件写入外部存储器,然后点击按钮将其传输到内部存储器。如果n分钟内没有发生这种情况,则外部存储器上的文件将被销毁。但是,我后来发现,getExternalStorageDirectory是非常无用的,因为设备在内部存储上模拟外部存储,而Android不知道是否以及如
getExternalStorageDirectory
是非常无用的,因为设备在内部存储上模拟外部存储,而Android不知道是否以及如何做到这一点
然而,我想知道是否存在某种内置活动,允许用户直接从内部存储上传或下载文件,而不必像内部存储那样免费访问内部存储的整个文件结构
作为最后一种手段,也许我的应用程序可以通过TCP连接接收文件并将其写入内部存储器本身。这很混乱,但寻找SD卡也是如此。请看问题
新建:此练习的目的是查找SD卡目录中的所有.csv文件,让用户选择一个,处理它,然后将输出文件写入SD卡。用户将输入一个“权重”值,该值将用于处理文件的计算
但是,由于Android在提供真正的外部存储位置(即SD卡)方面非常不可靠,因此我想尝试将文件存储在内部存储中,在内部存储中,Android似乎对该存储的位置更加诚实可靠。TLDR:getExternalStorageDirectory()
和getExternalFilesDirs()[0]
(API 19+)应返回“主”存储位置,即内部存储
编辑:如果您只想写入eMMC,而不关心它的私密性,只需使用getFilesDir()
,它保证您正在写入eMMC
说明: 为了避免晦涩和方便,我将使用以下术语
/data/data/package name
Environment.getExternalStorageDirectory()
返回主外部存储目录。如果用户已将此目录装载到其计算机上、已从设备中删除或发生其他问题,则当前可能无法访问此目录。可以使用getExternalStorageState()确定其当前状态
根据API 19的规定
现在,您可以在辅助外部存储介质上读取和写入特定于应用程序的文件,例如当设备同时提供模拟存储和SD卡时。新方法GetExternalFileDirs()的工作原理与现有的GetExternalFileDir()方法相同,只是它返回一个文件对象数组。返回的文件数组中的第一个条目被视为设备的“主”外部存储器,它与现有方法(如getExternalFilesDir()返回的文件相同
总之,getExternalStorageDirectory()
和getExternalFilesDirs()[0]
都应该返回“主存储位置,即eMMC。然而,在实践中,您可以注意到,对于一些手机(Karbonntiniums2、XoloX3000和许多其他手机),它返回的可能不一定是eMMC
下面是一些快照来补充这句话:这款手机TitaniumS2运行的是4.2,所以我无法使用getExternalFilesDirs()
您还可以注意到,出于同样的原因,ES Explorer错误地将/sdcard0
标识为内部存储器(eMMC),将/sdcard1
标识为外部存储器(SD)在新旧版本中,确实继续告诉用户,sdcard0
作为内部存储
此外,还提出了查找非主要(SD)存储的方法
似乎没有用于查找非主外部存储设备的API函数,google也无意修复这种情况,让应用程序使用黑客解决方法,比如解析所有当前安装的文件系统。对于当前的一代操作系统来说,不正确地支持像访问插入的U盘上的文件这样的基本功能是非常糟糕的
希望这有助于
你可以得到用户想要上传的文件,并且可以读取数据。。。然后您想将它们写入您的应用程序路径
如果我错了,请纠正我
下面是如何尝试将文件写入应用程序的路径。。。我的一个是/data/data/com.test.internalstorage/files
try {
File filesDir = getApplicationContext().getFilesDir();
Log.d(TAG, " Files -> 1 context.getFilesDir()-=> " + filesDir);
Log.d(TAG, " Files -> 1 context.getFilesDir().getName-=> " + filesDir.get-name());
Log.d(TAG, " Files -> 1 context.getFilesDir().getAbsolutePath-=> " + filesDir.getAbsolutePath());
Log.d(TAG, " Files -> 1 context.getFilesDir().getCanonicalPath-=> " + filesDir.getCanonicalPath());
Log.d(TAG, " Files -> 1 context.getFilesDir().getPath-=> " + filesDir.getPath());
String[] lst = getApplicationContext().getFilesDir().list();
for (int i=0; i< lst.length; i++){
Log.d(TAG, " Files -> 1 context.getFilesDir()list("+i+")-=> " + lst[i]);
}
String FILENAME = "hello_file5";
String string = "hello world!";
FileOutputStream fos = null;
fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
Log.d(TAG, " Files ");"
File nw_filesDir = getApplicationContext().getFilesDir();
Log.d(TAG, " Files -> 2 context.getFilesDir()-=> " + nw_filesDir);
String[] nw_lst = getApplicationContext().getFilesDir().list();
for (int i=0; i< nw_lst.length; i++){
Log.d(TAG, " Files -> 2 context.getFilesDir()list("+i+")-=> " + nw_lst[i] +
" -> " + new File(nw_filesDir,nw_lst[i]).getParentFile());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
欢迎修改和建议 您可以将文件直接存储在内部存储器中@但是怎么做呢?在提出这个问题之前,我已经阅读了您链接到的文档,它清楚地表明,关于内部存储,“保存在这里的文件只能由您的应用程序访问”。所以这个问题的关键是用户如何使用,这不是我的问题
D/_TAG_: Files -> 1 context.getFilesDir()-=> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 1 context.getFilesDir().getName-=> files
D/_TAG_: Files -> 1 context.getFilesDir().getAbsolutePath-=> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 1 context.getFilesDir().getCanonicalPath-=> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 1 context.getFilesDir().getPath-=> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 1 context.getFilesDir()list(0)-=> hello_file
D/_TAG_: Files -> 1 context.getFilesDir()list(1)-=> hello_file2
D/_TAG_: Files -> 1 context.getFilesDir()list(2)-=> hello_file3
D/_TAG_: Files -> 1 context.getFilesDir()list(3)-=> hello_file4
D/_TAG_: Files
D/_TAG_: Files -> 2 context.getFilesDir()-=> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 2 context.getFilesDir()list(0)-=> hello_file -> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 2 context.getFilesDir()list(1)-=> hello_file2 -> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 2 context.getFilesDir()list(2)-=> hello_file3 -> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 2 context.getFilesDir()list(3)-=> hello_file4 -> /data/data/com.test.internalstorage/files
D/_TAG_: Files -> 2 context.getFilesDir()list(4)-=> hello_file5 -> /data/data/com.test.internalstorage/files