Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.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_Sqlite_Download - Fatal编程技术网

Android 我如何将下载的文件保存到我的应用程序以供以后使用?

Android 我如何将下载的文件保存到我的应用程序以供以后使用?,android,file,sqlite,download,Android,File,Sqlite,Download,我的应用程序使用API将数据保存到数据库。部分数据将包括文件(pdf、图像和视频)的url。我已经通过AsyncTask完成了这个api请求 我的计划是使用api提供的url->本地保存文件->将其位置存储在数据库中 通过这种方式,我可以根据一组SQLite参数调用pdf文档列表,获取文件信息,创建文件列表,并允许用户通过选择来查看pdf(或图像…或视频…) 我什么都能用,但不知道怎么用 从url中下拉文件 本地保存文件 将当前保存的文件位置保存到数据库 我知道这是一个很大的要求,我正在寻找更好

我的应用程序使用API将数据保存到数据库。部分数据将包括文件(pdf、图像和视频)的url。我已经通过AsyncTask完成了这个api请求

我的计划是使用api提供的url->本地保存文件->将其位置存储在数据库中

通过这种方式,我可以根据一组SQLite参数调用pdf文档列表,获取文件信息,创建文件列表,并允许用户通过选择来查看pdf(或图像…或视频…)

我什么都能用,但不知道怎么用

  • 从url中下拉文件
  • 本地保存文件
  • 将当前保存的文件位置保存到数据库
  • 我知道这是一个很大的要求,我正在寻找更好的资源来实现这一点。有相当多的资源,但挑选最好的选择是压倒性的

    谢谢

    -----编辑-----

    使用“合子”的答案后出现错误:

    java.io.FileNotFoundException: /storage/emulated/0/library/2/invester-service.jpg: open failed: ENOENT (No such file or directory)
        at libcore.io.IoBridge.open(IoBridge.java:416)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
        at com.myBooks.library.BooksDB$1.run(BooksDB.java:812)
        at java.lang.Thread.run(Thread.java:856)
    Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
        at libcore.io.Posix.open(Native Method)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
        at libcore.io.IoBridge.open(IoBridge.java:400)
    
    我已经添加了创建目录的代码(根据合子的建议),但是我得到了相同的错误。mkdir出现故障,并且存储状态在运行时显示已装载:

    File folder = new File(Environment.getExternalStorageDirectory() + "/library/"+file_type);
    String state = Environment.getExternalStorageState();
    //create a new file, specifying the path, and the filename
    //which we want to save the file as.
    
    boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdir();
        Log.d("storage state",state);
    }
    if (success) {
        // Do something on success
        Log.d("success","made it");
    } else {
        // Do something else on failure 
        Log.d("success","didn't made it");
    }
    

    其实很简单。您只需使用HttpURLConnection和输入输出流下载文件并将其保存到您想要的任何位置,就可以完成1和2。然后,只需向数据库类添加一个方法,将保存文件的位置存储到数据库中

    不久前,我编写了一个非常简单的文件下载应用程序,其中包括任务1和任务2所需的所有代码。在这里复制/粘贴有点太多,所以我只发送GitHub源链接给您。查看第102行及以下内容

    记住,网络代码永远不应该在GUI线程上运行


    祝你好运

    哇!谢谢我会检查一下,看看它对我有什么作用。如果一切顺利,我会选择这个作为答案。是的,我在启动屏幕期间通过GUI外部的异步任务运行所有api和网络调用。听起来不错!让我知道它是如何工作的,或者如果你有任何其他问题。我的所有文件都出现“FileNotFoundException”和“open failed”错误。我尝试使用myprogress查看情况,但ProgressDialog初始化中的“上下文”似乎导致了NullPointerException错误。我已更新问题以显示错误以及调用错误的位置。我认为您需要确保/storage/emulated/0/library/2/存在,因为我不相信它会自动创建必要的目录,如果这有意义的话。那么首先检查目录是否存在?您可能需要首先创建目录结构。
    File folder = new File(Environment.getExternalStorageDirectory() + "/library/"+file_type);
    String state = Environment.getExternalStorageState();
    //create a new file, specifying the path, and the filename
    //which we want to save the file as.
    
    boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdir();
        Log.d("storage state",state);
    }
    if (success) {
        // Do something on success
        Log.d("success","made it");
    } else {
        // Do something else on failure 
        Log.d("success","didn't made it");
    }