2017-09-14 14 views
0

私は応答でURLを取得しています。私はそのURLのhtmlをダウンロードして、ユーザーがオフラインでも見ることができるようにしたい。各項目にURLが含まれているrecyclerViewです。したがって、ユーザーがある項目のURLをクリックすると、それを外部ディスクに保存する必要があります。以下はRetrofitを使用してURLからHTMLファイルをダウンロード

コードです:私は、エラーを取得しています

// option 2: using a dynamic URL 
@Streaming 
    @GET 
    Call<ResponseBody> downloadFileWithDynamicUrlSync(@Url String fileUrl); 

NewsAdapter:

case R.id.save: 
         Gson gson = new GsonBuilder() 
           .setLenient() 
           .create(); 
         Retrofit retrofit = new Retrofit.Builder() 
           .baseUrl("https://www.nytimes.com/") 
           .addConverterFactory(GsonConverterFactory.create(gson)) 
           .build(); 
         Log.i("Retrofit build", "initiated"); 
         ApiInterface retrofitInterface = retrofit.create(ApiInterface.class); 

           final Call<ResponseBody> call = retrofitInterface.downloadFileWithDynamicUrlSync("2017/09/13/us/nursing-home-deaths-florida.html"); 

         Log.i("Retrofit req execute", "initiated"); 

          new AsyncTask<Void, Void, Void>() { 
           @Override 
           protected Void doInBackground(Void... voids) { 
            boolean writtenToDisk = false; 
            try { 
             writtenToDisk = writeResponseBodyToDisk(call.execute().body()); 
            } catch (IOException e) { 
             e.printStackTrace(); 
            } 
            ; 

            Log.d("success", "file download was a success? " + writtenToDisk); 
            return null; 
           } 
          }.execute(); 


         break; 

private boolean writeResponseBodyToDisk(ResponseBody body) { 
     try { 
      // todo change the file location/name according to your needs 
      File futureStudioIconFile = new File(Environment.DIRECTORY_DOWNLOADS + File.separator + "Future Studio Icon.png"); 

      InputStream inputStream = null; 
      OutputStream outputStream = null; 

      try { 
       byte[] fileReader = new byte[4096]; 

       long fileSize = body.contentLength(); 
       long fileSizeDownloaded = 0; 

       inputStream = body.byteStream(); 
       outputStream = new FileOutputStream(futureStudioIconFile); 

       while (true) { 
        int read = inputStream.read(fileReader); 

        if (read == -1) { 
         break; 
        } 

        outputStream.write(fileReader, 0, read); 

        fileSizeDownloaded += read; 

        Log.d("filedownload", "file download: " + fileSizeDownloaded + " of " + fileSize); 
       } 

       outputStream.flush(); 

       return true; 
      } catch (IOException e) { 
       return false; 
      } finally { 
       if (inputStream != null) { 
        inputStream.close(); 
       } 

       if (outputStream != null) { 
        outputStream.close(); 
       } 
      } 
     } catch (IOException e) { 
      return false; 
     } 
    } 

ApiInterface

Failed to invoke public com.squareup.okhttp.ResponseBody() with no args 

誰かがどのように教えてもらえますに正しく実装してください。

+0

"2017/9月13日/私たち/特別養護老人ホーム・死亡-florida.html":

は、このコードを使用し、この

@GET Call<ResponseBody> downloadFile(@Url String url); 

ようなインターフェイスを作成します。ファイルをダウンロードするには、domian nameの接頭辞を付けます。 –

答えて

0

URLを使用してファイルをダウンロードします。ストリーミング注釈を削除する必要はありません。

完全なURLを使用していないため、ファイル本体が届いていません。

public void onResponse(Call<ResponseBody> call, Response<ResponseBody> 
response) 
         { 
          if (response.isSuccessful()) { 
           String filePath = Utils.downloadFile(response.body(),"filename"); 

          } 
         } 



public String downloadFile(ResponseBody body, String fileName) { 
    String filePath = null; 
    try { 
     int count; 
     byte data[] = new byte[1024 * 4]; 
     InputStream bis = new BufferedInputStream(body.byteStream(), 1024 * 8); 
     File storageDir = new File(Environment.getExternalStorageDirectory(), "AppName"); 
     if (!storageDir.exists()) { 
      storageDir.mkdirs(); 
     } 
     File outputFile = new File(storageDir, fileName); 
     OutputStream output = new FileOutputStream(outputFile); 
     while ((count = bis.read(data)) != -1) { 
      output.write(data, 0, count); 
     } 
     output.flush(); 
     output.close(); 
     bis.close(); 
     filePath = outputFile.getAbsolutePath(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return filePath; 
} 
関連する問題