使用翻新版2下载POST方法的PDF响应 [英] Download POST method's PDF response using retrofit 2

查看:148
本文介绍了使用翻新版2下载POST方法的PDF响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是不熟悉Android和JSON更新的人.我在项目中使用了改造2.这是post API之一,它给出了pdf作为响应.

I am new to android and JSON using retrofit. I am using retrofit 2 with my project. This is one of post API and it gives a pdf as the response.

@POST("examples/campaign_report_new.php")
Call<ResponseBody> getAddressTrackingReport(@Body ModelCredentialsAddressTracking credentials);

我使用下面的代码来实现此功能,并且停留在响应方法中以下载并显示pdf.

I used the below code to do this function and I stuck in the response method to download and show that pdf.

private void downloadPdf() { 
ModelCredentialsAddressTracking
    credentials = new ModelCredentialsAddressTracking(campaign,
    dateFrom, dateTo);            
                ApiService apiService = RetroClient.getApiService();
                Call<ResponseBody> call = apiService.getAddressTrackingReport(credentials);            
                call.enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        try {
                            Log.d(TAG, String.valueOf(response.body().bytes()));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }            
                        boolean writtenToDisk = writeResponseBodyToDisk(response.body());            
                    }            
                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {

                    }
            });
        }

下面的链接是我从邮递员那里得到的回复:

Below link is the response I got from Postman:

单击此处

writeResponseBodyToDisk()函数:

writeResponseBodyToDisk() function :

private boolean writeResponseBodyToDisk(ResponseBody body) {
    try {
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                "Door Tracker");

        // Create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("door tracker", "Oops! Failed create "
                        + "door tracker" + " directory");
            }
        }

        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                Locale.getDefault()).format(new Date());
        File mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "AddressTrackingReport "+ timeStamp + ".pdf");

        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(mediaFile);

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

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

                outputStream.write(fileReader, 0, read);

                fileSizeDownloaded += read;

                Log.d(TAG, "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;
    }
}

请有人帮忙解决.这可能包含错误,因为我是新手.谢谢.

Somebody, please help a solution. This may contain errors Because I am new to it.Thanks.

推荐答案

您的API使用 form-data 作为输入,因此将 @Body 更改为 @Multipart类型.这将给您答复.在 onResponse()

Your API using form-data as input, So change @Body to @Multipart Type. This will give you a response. Add below snippet inside onResponse()

if (response.isSuccessful()) {

progressDialog.dismiss();

new AsyncTask<Void, Void, Void>() {
     boolean writtenToDisk = false;

        @Override
        protected Void doInBackground(Void... voids) {

            try {
                writtenToDisk = writeResponseBodyToDisk(AddressTrackingActivity.this,
                        response.body());
            } catch (IOException e) {
                Log.w(TAG, "Asynch Excep : ", e);
            }
            Log.d(TAG, "file download was a success? " + writtenToDisk);
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            if (writtenToDisk) {
                String pdfPath = Environment.getExternalStorageDirectory().toString()
                        + "/Door Tracker/" + fileName;
                Log.d(TAG, "file name : " + fileName);
                File file = new File(pdfPath);
                Uri bmpUri;
                if (Build.VERSION.SDK_INT < 24) {
                    bmpUri = Uri.fromFile(file);
                    Log.d(TAG, "bmpUri : " + bmpUri);
                } else {
                    bmpUri = FileProvider.getUriForFile(AddressTrackingActivity.this,
                            getApplicationContext().getPackageName() + ".provider", file);

                    Log.d(TAG, "bmpUri : " + bmpUri);
                }
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(bmpUri, "application/pdf");
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                try {
                    startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    Log.d(TAG, "ActivityNotFoundException : ", e);
                }
            }
        }
    }.execute();
} else {
    progressDialog.dismiss();
    Toast.makeText(AddressTrackingActivity.this, "Network error, Please retry", Toast.LENGTH_SHORT).show();
    Log.d(TAG, "server contact failed");
}

我认为这会对您有所帮助.

I think this will help you.

这篇关于使用翻新版2下载POST方法的PDF响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆