Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何让用户将文件上载到内部存储器?_Android_File Transfer_Android File - Fatal编程技术网

Android 如何让用户将文件上载到内部存储器?

Android 如何让用户将文件上载到内部存储器?,android,file-transfer,android-file,Android,File Transfer,Android File,我正在编写一个小应用程序,它从设备外部的源读取必须定期写入设备存储的文件,无论是USB、蓝牙、Airdroid等。从我读到的内容来看,没有任何类似的东西可以写入内部存储。我想管理内部存储中的文件以获取隐私 我的第一个解决方案是让用户将文件写入外部存储器,然后点击按钮将其传输到内部存储器。如果n分钟内没有发生这种情况,则外部存储器上的文件将被销毁。但是,我后来发现,getExternalStorageDirectory是非常无用的,因为设备在内部存储上模拟外部存储,而Android不知道是否以及如

我正在编写一个小应用程序,它从设备外部的源读取必须定期写入设备存储的文件,无论是USB、蓝牙、Airdroid等。从我读到的内容来看,没有任何类似的东西可以写入内部存储。我想管理内部存储中的文件以获取隐私

我的第一个解决方案是让用户将文件写入外部存储器,然后点击按钮将其传输到内部存储器。如果n分钟内没有发生这种情况,则外部存储器上的文件将被销毁。但是,我后来发现,
getExternalStorageDirectory
是非常无用的,因为设备在内部存储上模拟外部存储,而Android不知道是否以及如何做到这一点

然而,我想知道是否存在某种内置活动,允许用户直接从内部存储上传或下载文件,而不必像内部存储那样免费访问内部存储的整个文件结构

作为最后一种手段,也许我的应用程序可以通过TCP连接接收文件并将其写入内部存储器本身。这很混乱,但寻找SD卡也是如此。请看问题

新建:此练习的目的是查找SD卡目录中的所有.csv文件,让用户选择一个,处理它,然后将输出文件写入SD卡。用户将输入一个“权重”值,该值将用于处理文件的计算

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

TLDR:
getExternalStorageDirectory()
getExternalFilesDirs()[0]
(API 19+)应返回“”存储位置,即内部存储

编辑:如果您只想写入eMMC,而不关心它的私密性,只需使用
getFilesDir()
,它保证您正在写入eMMC


说明

为了避免晦涩和方便,我将使用以下术语

  • 私有存储:应用程序在内存中的私有存储-
    /data/data/package name
  • eMMC:手机的内部存储器
  • SD:手机的可扩展存储空间(可移动)
  • 如果我没弄错你的问题,你就不想写信给私有存储,因为私有存储不允许其他应用访问这些数据。因此,我们的目标是写信给eMMC,更具体地说,公开访问eMMC,而不是在eMMCs应用程序的私人空间中

    根据Android文档(API 1)

    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