使用OKHTTP下载pdf文件

时间:2016-05-16 12:17:55

标签: android download okhttp android-download-manager

我在Android应用程序中使用ok-http。

我有来自网络服务的.pdf文件的网址。

我必须在ImageView的点击事件上下载pdf文件。我在谷歌搜索过但是找不到具体的答案。

如果有人知道,请给我解决方案。 感谢。

3 个答案:

答案 0 :(得分:1)

查看官方OkHttp的食谱: https://github.com/square/okhttp/wiki/Recipes

答案 1 :(得分:0)

为实现这一目标,还有很多工作要做,而且我仍然在努力为PDF实现同样的目标,但这里有一些代码可供我下载图像文件:

String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/ergonomics/pdf_test");
myDir.mkdirs();
String fname = "TestPdf-01A.pdf";

File file = new File(myDir, fname);
if (file.exists()) file.delete();

InputStream is = response.body().byteStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
    baf.append((byte) current);
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(baf.toByteArray());
fos.close();

只是FYI ByteArrayBuffer与Android中的所有Apache内容一起被弃用。但是,从理论上讲,它是有效的,并且应该很容易让你遵循。

答案 2 :(得分:0)

我使用OKHttp下载具有此类功能的PDF。下载PDF和json文件的唯一区别是处理响应的方式。我将 response.body?.byteStream()用于PDF。

fun downloadPdf(context: Context, pdfUrl: String, completion: (Boolean) -> Unit) {

    val request = Request.Builder()
        .url(pdfUrl)
        .build()
    val client = OkHttpClient.Builder()
        .build()

    client.newCall(request).enqueue(object: Callback {

        override fun onResponse(call: Call, response: Response) {
            println("successful download")

            val pdfData = response.body?.byteStream()

           //At this point you can do something with the pdf data
           //Below I add it to internal storage

            if (pdfData != null) {

                try {
                    context.openFileOutput("myFile.pdf", Context.MODE_PRIVATE).use { output ->
                        output.write(pdfData.readBytes())
                    }

                } catch (e: IOException) {
                    e.printStackTrace()
                }
            }
            completion(true)
        }

        override fun onFailure(call: Call, e: IOException) {

            println("failed to download")
            completion(true)
        }
    })
}