2017-12-22 7 views
1

私はアンドロイドとJSONをレトロフィットで使用したことが初めてです。私は私のプロジェクトで改造2を使用しています。 これはポストAPIの1つで、レスポンスとしてpdfを提供します。ポストメソッドのPDFレスポンスを使用してPDFレスポンスをダウンロードする2

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

私はこの機能を実行するために以下のコードを使用しました。私は応答メソッドを使用して、その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) { 

        } 
      }); 
     } 

私はポストマンから得た応答である:

click here

writeResponseBodyToDisk()関数:

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; 
    } 
} 

誰か、ソリューションを助けてください。これにはエラーが含まれている可能性があるので、私はそれが新しいです。ありがとうございます。

File mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "AddressTrackingReport "+ timeStamp + ".pdf"); 

fileName = mediaFile.getName(); 

ただ、デバッグおよびファイル名が正しいか確認してください:

+0

レスポンスボディはどのように見えるでしょうか?あなた自身の応答タイプ 'Call 'を定義する必要があると思います –

+0

あなたはランタイム許可を与えていますか? – ABDevelopers

+0

@ABDevelopers、私は外部から許可を与えました –

答えて

1

form-dataを入力として使用しているので、@Bodyから@Multipartタイプに変更してください。これはあなたに応答を与えるでしょう。次のスニペットを内側に追加してください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"); 
} 

私はこれが役に立ちます。

1
String fileName = ""; 
boolean writtenToDisk = writeResponseBodyToDisk(response.body(),fileName); 
    if(writtenToDisk){ 
    String pdfPath = Environment.getExternalStorageDirectory().toString() + "/Door Tracker/"+fileName; 
    File file = new File(pdfPath); 
    Uri bmpUri; 
    if (Build.VERSION.SDK_INT < 24) { 
     bmpUri = Uri.fromFile(file); 
    } else { 
      bmpUri = FileProvider.getUriForFile(this,getApplicationContext().getPackageName() + ".provider", file); 
    } 

     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) { 

     } 
    } 

だけメソッドwriteResponseBodyToDiskからファイル名を取得します。

+0

このソリューションは、空のボディを含むファイルを提供します。私はそのpdfに '応答'を変換することができます。 –

+0

サーバーからの応答データを確認し、response.bodyのログを投稿し、ファイル名が正しいことを確認してください。サーバーのデータがこのコードよりも適切な場合は、 – ABDevelopers

関連する問題