2016-06-30 5 views
-1

Ich habe Probleme, den richtigen Code zum Senden zu erhalten. Übermitteln Sie ein mehrteiliges Formular mit einer PDF-Datei zum google cloud print (der Grund, warum ich nicht die integrierte Absicht in Android verwende) Sie können nicht automatisch einen Drucker wählen, der manuell ausgeführt werden muss, wenn die Absicht verwendet wird.)Android Google CloudPrint PDF-Druckauftrag über URL-API senden

Ich habe Volley verwendet, um es einzureichen, aber ich habe gelesen, es ist nicht gut mit großen Dateien? mit Hilfe der API

final RequestQueue queue =  Volley1.getInstance(this).getRequestQueue(); 
      String url3 = "https://www.google.com/cloudprint/submit"; 
      final VolleyMultipartRequest multipartRequest = new  VolleyMultipartRequest(Request.Method.POST, url3 ,new    Response.Listener<NetworkResponse>() { 

        @Override 
        public void onResponse(NetworkResponse response) { 
          String resultResponse = new    String(response.data); 
          Log.d("responseis",resultResponse); 
        } 
      }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
          error.printStackTrace(); 
        } 
      }){ 
        @Override 
        protected Map<String, String> getParams() { 

          Map<String, String> params = new HashMap<>(); 
          // the POST parameters: 
          params.put("redirect_uri", "xxxxx"); 
          params.put("printerid","xxxxxx"); 
          params.put("title", "result1.pdf"); 
          params.put("contentType", "application/pdf"); 
          params.put("ticket", "{\"print\":{},\"version\":\"1.0\"}"); 
          params.put("hl", "en"); 
          return params; 
        } 
        @Override 
        public Map getHeaders() throws AuthFailureError { 
          Map headers = new HashMap(); 
          headers.put("Authorization", "OAuth"+" "+res); 
          headers.put("Content-Type", "multipart/form-data; boundary=__1466595844361__"); 
          //headers.put("Content-Type","application/x-www-form-urlencoded"); 
          //Logger.debugE(Constants.accesstoken, headers.toString()); 
          return headers; 
        } 
        @Override 
        protected Map<String, DataPart> getByteData() { 
          Map<String, DataPart> params = new HashMap<>(); 
          //String yourFilePath =  Environment.getExternalStorageDirectory().getAbsolutePath()+ "/PDFs/result1.pdf"; 
          String yourFilePath=Environment.getExternalStorageDirectory().getAbsolutePath()+ "/PDFs/result1.pdf"; 
          File dir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS), "PDF_reader"); 

          File text = new File(dir + File.separator + "test_r.pdf"); 
          String input = text.getAbsolutePath(); 
          byte[] data = new byte[(int) input.length()]; 
          try { 
            //convert file into array of bytes 
            data = FileUtils.readFileToByteArray(text); 

          }catch(Exception e){ 
            e.printStackTrace(); 
          } 

          params.put("content", new DataPart("result1.pdf",data , "application/pdf")); 
          return params; 
        } 
      }; 
queue.add(multipartrequest); 
+0

Entschuldigung, dies kann kein "minimales Beispiel" sein, um das Problem zu zeigen. Wir sind nicht hier, um den relevanten Code in Hunderten von Zeilen zu finden. – Eiko

Antwort

0

Nach viel Versuch und Irrtum endete ich mit OKHTTP Bibliothek und ich war erfolgreich in der Lage, einen Druckauftrag zu Google Cloud Print zu unterbreiten. Es war ein bisschen schwierig, das mehrteilige Formular mit der PDF-Datei zu erhalten, aber die richtige Arbeitsanforderung ist unten. Offensichtlich werden das Token und die Drucker-ID in anderen Anfragen abgerufen und müssen manuell hinzugefügt werden.

public void run() throws Exception { 

//File directory 
File dir = Environment.getExternalStorageDirectory(); 
File file = new File(dir, "PDFs/result1.pdf"); 
if(file.canRead()){ 
    Log.d("file", "can read"); 
}else {Log.d("file","cant read");}; 


// Final request body 
RequestBody requestBody = new MultipartBody.Builder() 
     .setType(MultipartBody.FORM) 
     .addFormDataPart("content","result1.pdf",RequestBody.create(MediaType.parse("application/pdf"), file)) 
     .build(); 

//URL Parameters 
HttpUrl url = new HttpUrl.Builder() 
     .scheme("https") 
     .host("www.google.com") 
     .addPathSegments("cloudprint/submit") 
     .addQueryParameter("printerid", "82d70sde-694b-3385-f263-164cb04320c3") 
     .build(); 

Request request = new Request.Builder() 
     .header("Authorization", "OAuth ya29.Cl0jAxDuQni_Dskz6Y2r-wRaJVMxEw8fy5hPNfAm02pDLnZc9HX-RfHpmMoS0OL-Wv_SKxBtYIwRK9jVpJDwl7Qs-RFt02Qc5Yoid4w1kV8b4vBIpcleIQ8lBEto") 
     .url(url) 
     .post(requestBody) 
     .build(); 

client.newCall(request) 
     .enqueue(new Callback() { 
      @Override 
      public void onFailure(final Call call, IOException e) { 
       // Error 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         // For the example, you can show an error dialog or a toast 
         // on the main UI thread 
        } 
       }); 
      } 

      @Override 
      public void onResponse(Call call, final Response response) throws IOException { 
       String res = response.body().string(); 

       // Do something with the response 
      } 
     }); 
}