services printer print google android printing google-cloud-print

android - printer - google cloud print api



Usando la API de Google Cloud Print con Android (3)

Al observar el método SubmitJob del código de muestra de Python , parece que solo los tipos de PDF deben codificarse en Base64.

Estoy trabajando en una aplicación de Android que necesita imprimir en una impresora. Decidí usar Google Cloud Print, ya que parecía fácil de configurar. Inicialmente, seguí los pasos que se encuentran here para integrarme en Android. Esto funciona, ya que se imprimirá en mi impresora deseada. Sin embargo, este proceso es un poco complicado para el usuario. En mi caso, el proceso es el siguiente:

  1. El usuario selecciona el botón de impresión que he mostrado junto a cierta información.
  2. Se muestra un cuadro de diálogo con una vista previa de lo que se imprimirá. Hay un botón en la barra de acción que dice "Imprimir". Esto comienza el proceso.
  3. Se muestra una nueva actividad que muestra una lista de impresoras que están conectadas a la cuenta de Google de ese usuario. El usuario debe seleccionar uno.
  4. Se muestra una nueva página con una descripción del trabajo de impresión.
  5. El usuario tiene que seleccionar "Imprimir" en la esquina superior derecha.
  6. Se inicia el trabajo de impresión y la impresora imprime la imagen.

Desafortunadamente, mi cliente no quiere este proceso. Quieren que el usuario haga clic en "Imprimir" en el paso dos y luego imprima la imagen (pasos 1, 2 y 6). Por lo tanto, no puedo usar la Intención proporcionada por Google, debo usar la API real. Esto requiere que obtenga un token de autenticación de Google, obtenga la impresora deseada y envíe un trabajo de impresión de esa manera. Yo hago lo siguiente:

  1. Utilice los servicios de Google Play para recuperar un token de OAuth para la cuenta de Gmail de los usuarios.
  2. Obtenga una lista de impresoras mediante la llamada a la API / search.
  3. Envíe un trabajo de impresión utilizando la llamada a la API / submit.

Tengo los dos primeros terminados. Estoy teniendo problemas con la impresión real de la imagen. En lugar de imprimir la imagen, se imprimen los datos de bytes de la imagen (codificación Base64). Aquí hay un código de cómo estoy enviando la solicitud:

ContentResolver contentResolver = context.getContentResolver(); try { InputStream is = contentResolver.openInputStream(uri); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int n = is.read(buffer); while (n >= 0) { baos.write(buffer, 0, n); n = is.read(buffer); } is.close(); baos.flush(); content = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); } catch (FileNotFoundException e) { Log.d(TAG, "File not found: " + uri.toString(), e); } catch (IOException e) { e.printStackTrace(); }

Este código recupera la imagen (la variable "uri" es el URI de ese archivo) y la convierte en una cadena codificada en Base64. Este es el mismo método utilizado en PrintDialogActivity que se proporciona en la página de Google Cloud Print (vinculado a más arriba). Lo siguiente es cómo envío eso:

Por lo que puedo decir, así es como se supone que debe ser. Recibo una respuesta de {"éxito": verdadero} al imprimir. Pero, como dije anteriormente, imprime la cadena de datos Base64 real. Cualquier ayuda sería apreciada.

EDITAR: Usando lo que dice powerje a continuación, logré arreglar esto. En lugar de usar el código anterior, usé lo siguiente:

public void submitPrintJobWithFile(String printerId, String title, String token, String filePath, String contentType){ File file = new File(filePath); // Method that gets the correct headers List<Header> headers = getHeaders(contentType, token); // Method that gets the correct post parameters String url = CLOUDPRINT_URL + PATH_SUBMIT; List<NameValuePair> postParams = getParams(title, contentType); String params = "access_token=" + token + "&cookies=false" + "&printerid=" + printerId; url += params; response = sendMultipartData(url, file, postParams, headers); } private String sendMultipartData(String url, File file, List<NameValuePair> fields, List<Header> headers){ HttpPost post = new HttpPost(url); MultipartEntity entity = new MultipartEntity(); for(NameValuePair pair : fields){ String name = pair.getName(); String value = pair.getValue(); try{ entity.addPart(name, new StringBody(value)); }catch (UnsupportedEncodingException e){ Log.d(TAG, "Error turning pair (name=" + name + ", value=" + value + ") into StringBody."); } entity.addPart("content", new FileBody(file)); post.setEntity(entity); // Finish HttpClient request here... }


Parece que necesitas usar codificación multiparte, ejemplo aquí:

http://blog.tacticalnuclearstrike.com/2010/01/using-multipartentity-in-android-applications/

TLC:

Los archivos necesarios son apache-mime4j , httpclient, httpcore y httpmime . Todos son proyectos de código abierto construidos por la fundación Apache .

Descargue los 4 archivos y agréguelos a su proyecto, entonces debería poder usar el siguiente código para publicar cadenas y archivos en las páginas.

HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.tumblr.com/api/write"); try { MultipartEntity entity = new MultipartEntity(); entity.addPart("type", new StringBody("photo")); entity.addPart("data", new FileBody(image)); httppost.setEntity(entity); HttpResponse response = httpclient.execute(httppost); } catch (ClientProtocolException e) { } catch (IOException e) { }

La variable de imagen en este caso es un archivo que contiene una imagen capturada por la cámara en el teléfono.


Respondiendo la pregunta con un poco de actualización. A partir de octubre de 2013, en 4.4 y en la biblioteca de asistencia, hay métodos integrados para manejar la impresión. Consulte la siguiente documentación para saber cómo hacerlo correctamente: