如何让用户将文件上传到内部存储空间?

时间:2016-09-01 13:06:11

标签: android file-transfer android-file

我正在编写一个小应用程序,用于读取必须定期从设备外部源写入存储设备的文件,无论是USB,蓝牙,Airdroid等。从我读过的内容,没有这样可以写入内部存储。我想管理内部存储中的文件以获取访问隐私。

我的第一个解决方案是允许用户将文件写入外部存储,然后点击按钮将其传输到内部存储的活动。如果在n分钟内没有发生这种情况,则会破坏外部存储上的文件。但是,我发现getExternalStorageDirectory非常无用,因为设备模仿内部存储上的外部存储,Android无法知道是否以及如何完成。

然而,我想知道是否有某种内置活动可以让用户直接从内部存储上传或下载文件,但不能免费访问内部存储的整个文件结构,就像他们一样内部存储。

作为最后的手段,也许我的应用程序可以通过TCP连接接收文件并将其写入内部存储本身。它很乱,但试图找到一张SD卡也是如此。请参阅问题Find an external SD card location

新:本练习的目的是找到SD卡上目录中的所有.csv文件,让用户选择一个,处理它,并将输出文件写入SD卡。用户将输入" Weight"将在计算中用于处理文件的值。

但是,由于Android在提供真正外部存储(即SD卡)的位置方面是如此不可靠,我想尝试将文件存储在内部存储中,其中Android似乎更加诚实可靠。存储

2 个答案:

答案 0 :(得分:4)

TLDR getExternalStorageDirectory()getExternalFilesDirs()[0](API 19+)应该返回" 主要& #34;存储地点,即内部存储。

编辑:如果您只想写信给 eMMC 并且不关心它是私有的,只需使用getFilesDir()并保证您和&# #39;重写 eMMC

<强>解释

为避免晦涩和方便,我将使用以下条款

  1. PrivateStorage :应用内存中的私有存储空间 - /data/data/package name
  2. eMMC :手机的内部存储空间
  3. SD :手机的可扩展存储空间(可移动)
  4. 如果我理解你的问题,你就不想写信给 PrivateStorage 允许其他应用访问该数据。因此,目标是写入 eMMC 并更具体,可公开访问的 eMMC ,而不是eMMC应用程序的私有空间

    根据Android Docs(API 1),

      

    Environment.getExternalStorageDirectory()返回外部存储目录。如果用户已在其计算机上安装此目录,已从设备中删除或发生其他一些问题,则该目录当前可能无法访问。您可以使用getExternalStorageState()确定其当前状态。

    根据 API 19 docs

      

    您现在可以在辅助外部存储媒体上读取和编写特定于应用程序的文件,例如,当设备同时提供模拟存储和SD卡时。新方法getExternalFilesDirs()的工作方式与现有的getExternalFilesDir()方法相同,只不过它返回一个File对象数组。返回的File数组中的第一个条目被认为是 device&#39; s&#34; primary&#34;外部存储,与现有方法(如getExternalFilesDir())返回的文件相同。

    总结一下,getExternalStorageDirectory()getExternalFilesDirs()[0] 都应该返回&#34; 主要&#34;存储位置, eMMC 。但在实践中您可以注意到,对于少数手机(KarbonnTitiniumS2,XoloX3000和许多其他手机),它返回可能不一定 eMMC

    以下是该句话的第二个快照:这款手机TitaniumS2正在运行4.2所以我无法使用getExternalFilesDirs()

    enter image description here enter image description here

    您还可以注意到,出于同样的原因, ES Explorer 错误地标识为/sdcard0作为内部存储空间( eMMC )和/sdcard1作为旧版和新版的外部存储( SD ),确实继续告诉用户sdcard0为内部存储。< / p>

    此外,还提出了用于查找非主要(SD)存储的issue

      

    似乎找不到用于查找非主要外部存储设备的API函数,谷歌无意修复这种情况,让应用程序使用hacky解决方法,例如解析所有当前挂载的文件系统。对于当前的操作系统而言,如果不能正确支持插入的USB记忆棒上的文件等基本操作,那将是非常可怕的。

答案 1 :(得分:0)

希望这有帮助...

您可以获取用户想要上传的文件,并且可以读取数据...然后您想将它们写入您的应用程序路径......

如果我错了,请纠正我......

以下是如何尝试将文件写入应用程序的路径...我的一个是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

输出

<ComboBox VerticalAlignment="Center" HorizontalAlignment="Left" HorizontalContentAlignment="Left" SelectedItem="{Binding VariableValue}" ItemsSource="{Binding VariablesValues}" Width="160" Margin="0,0,0,0" IsEnabled="true" IsTextSearchEnabled="True" IsEditable="True"/>

欢迎更正和建议!!!