Impresión Bluetooth y WIFI para Android

Necesitaríamos una impresora portátil (handheld, es importante) que puede conectarse al teléfono androide vía bluetooth o wifi.

Lo que sé actualmente:

  • No hay SDK de impresión estándar disponible para Android esta vez
  • Hay un SDK no oficial llamado iPrint SDK . ¿Alguno de ustedes lo intentó a través de wifi o bluetooth? ¿Funciona?
  • Printershare también afirma estar programáticamente disponible . Sería aceptable para que pague la tarifa una vez $ 5 para ella por el teléfono. Tiene muchos formatos soportados. ¿Lo has probado con algún dispositivo portátil? Les pregunté acerca de la lista de impresoras compatibles con bluetooth (ya que tiene un elemento de menú "buscar impresora BT"), pero no respondió.

Lo que necesito saber sobre lo ya preguntado:

  • ¿Cómo se imprime desde su aplicación Android?
  • ¿Qué tipo de impresora utiliza?
  • ¿Está previsto en el SDK androide estándar incluir la impresión? ¿Cuál es la hoja de ruta? ¿Está disponible ahora como Beta o algo así?
  • Si de alguna manera (no lo creo) construir su propia solución para la impresión a través de bluetooth, puede recomendar normas y protocolos para comprobar y aprender?

A partir de Android 4.4 puede imprimir documentos desde un dispositivo a una impresora de hardware a través de wifi.

Las aplicaciones de Android ahora pueden imprimir cualquier tipo de contenido a través de Wi-Fi o servicios alojados en la nube, como Google Cloud Print. En las aplicaciones habilitadas para impresión, los usuarios pueden descubrir las impresoras disponibles, cambiar el tamaño del papel, elegir páginas específicas para imprimir e imprimir casi cualquier tipo de documento, imagen o archivo.

Un breve ejemplo de cómo iniciar el proceso de impresión:

private void doPrint() { PrintManager printManager = (PrintManager) getActivity().getSystemService(Context.PRINT_SERVICE); printManager.print("My document", new CustomPrintDocumentAdapter(getActivity()), null); } 

Donde CustomPrintDocumentAdapter extends PrintDocumentAdapter .

Más información está disponible en desarrolladores de Android .

La impresión a través de Bluetooth en Android no es posible a partir de ahora (según mi conocimiento), ya que Android no admite perfiles Bluetooth, como BPP (perfil de impresión básico), HCRP (perfil de reemplazo impreso), BIP (Basic Imaging Profile) Etc, que son los perfiles comunes utilizados con la impresión Bluetooth. Árbitro. Esto para saber sobre la impresión de perfiles BT.

Actualmente, Android es compatible con OPP (Object Push Profile) que se utiliza para enviar archivos a través de Bluetooth.

Para que los perfiles de bluetooth de impresión se implementen dentro de Bluetooth Stack para Android, puede consultar Sybase-iAnywhere-Blue-SDK-para-Android , que proporciona un SDK para agregar esta funcionalidad a la implementación de pila BT existente en Android.

Para la impresión Wifi, hay muchas aplicaciones en el mercado que le permite imprimir varios documentos e imágenes de su teléfono Android. Consulte PrinterShare para una de estas aplicaciones. Para la impresión Wifi, puede utilizar cualquier impresora que pueda conectarse a través de ethernet (LAN).

También comprueba las impresoras habilitadas para "Google Cloud Print", que utiliza la nube para imprimir en una impresora conectada en cualquier parte del mundo, que admita este protocolo. Esto es bastante nuevo en el mercado, pero algo que definitivamente ganará tracción en los próximos años. Echa un vistazo a la aplicación de impresión en la nube aquí . Y faq aquí .

Espero que esto ayude a sacar algunas preguntas de su lista.

La única impresión que he podido integrar es para el Bixolon SPP-R200. Tienen un SDK decente disponible y es bastante fácil de encontrar. Estoy buscando 8 1/2 x 11 capacidades de bluetooth, pero un sdk para algo así parece ser una orden muy alto en este momento

Lo siento, no tengo conocimiento sobre la impresión con dispositivos bluetooth .. Pero, hice algunas investigaciones sobre la impresión utilizando wifi y publicado ese código en GitHub, puede referirse a que si es necesario .. Android-wifi-impresión – GitHub

Este es el flujo de ese prototipo.

  1. Comprueba la conectividad.
  2. Si está conectado en WiFi .. estoy almacenando esa configuración de WiFi.
  3. Ahora comprobar si ya tengo la información de la impresora (configuración WiFi de la impresora WiFi) está disponible o no. Si está disponible, voy a escanear y obtener la lista de WiFi ScanResults y se conecta a ese otro .. Va a mostrar la lista de WiFi y haciendo clic en que, el usuario se conectará a la impresora y almacena esa configuración WiFi para futuros trabajos de impresión.
  4. Cuando termine el trabajo de impresión, me estoy conectando a mi anterior conexión de datos WiFi o móvil.
  5. Ahora vamos al segundo paso.
  6. Si el usuario está conectado en datos móviles, sólo estoy habilitando WiFi y después del tercer paso.
  7. Después de que el trabajo de impresión termine, sólo estoy desactivando WiFi. De modo que, estaremos conectados de nuevo a la conexión de datos móvil. (Eso es Android predeterminado).

Debajo de clase se encargará de todos los trabajos de impresión en ese prototipo.

PrintUtility.class

 public class PrintUtility implements Observer { private static final int TIME_OUT = 10000; private static final int CONNECTION_TIME_OUT = 5000; private Activity mActivity; private Fragment mFragment = null; private WifiConfiguration mPrinterConfiguration; private WifiConfiguration mOldWifiConfiguration; private WifiManager mWifiManager; private WifiScanner mWifiScanner; private List<ScanResult> mScanResults = new ArrayList<ScanResult>(); private PrintManager mPrintManager; private List<PrintJob> mPrintJobs; private PrintJob mCurrentPrintJob; private File pdfFile; private String externalStorageDirectory; private Handler mPrintStartHandler = new Handler(); private Handler mPrintCompleteHandler = new Handler(); private Handler mWifiConnectHandler = new Handler(); private String connectionInfo; private boolean isMobileDataConnection = false; private PrintCompleteService mPrintCompleteService; // Observer pattern private Observable mObservable; public PrintUtility(Activity mActivity, WifiManager mWifiManager, WifiScanner mWifiScanner) { this.mActivity = mActivity; this.mWifiManager = mWifiManager; this.mWifiScanner = mWifiScanner; mPrintCompleteService = (PrintCompleteService) mActivity; mObservable = ObservableSingleton.getInstance(); mObservable.attach(this); } public PrintUtility(Activity mActivity, Fragment mFragment, WifiManager mWifiManager, WifiScanner mWifiScanner) { this.mActivity = mActivity; this.mFragment = mFragment; this.mWifiManager = mWifiManager; this.mWifiScanner = mWifiScanner; mPrintCompleteService = (PrintCompleteService) mFragment; mObservable = ObservableSingleton.getInstance(); mObservable.attach(this); } public void downloadAndPrint(String fileUrl, final String fileName) { new FileDownloader(mActivity, fileUrl, fileName) { @Override protected void onPostExecute(Boolean result) { if (!result) { mObservable.notifyObserver(true); } else { // print flow will come here. try { externalStorageDirectory = Environment.getExternalStorageDirectory().toString(); File folder = new File(externalStorageDirectory, Constants.CONTROLLER_PDF_FOLDER); pdfFile = new File(folder, fileName); } catch (Exception e) { mObservable.notifyObserver(true); e.printStackTrace(); } print(pdfFile); } } }.execute(""); } public void print(final File pdfFile) { this.pdfFile = pdfFile; // check connectivity info -> mobile or wifi. connectionInfo = Util.connectionInfo(mActivity); if (connectionInfo.equalsIgnoreCase(Constants.CONTROLLER_MOBILE)) { // follow mobile flow. isMobileDataConnection = true; if (mWifiManager.isWifiEnabled() == false) { mWifiManager.setWifiEnabled(true); } mWifiManager.startScan(); setScanResults(mWifiScanner.getScanResults()); printerConfiguration(); } else if (connectionInfo.equalsIgnoreCase(Constants.CONTROLLER_WIFI)) { // follow wifi flow.. // this will get current wifiInfo and store it in shared preference. Util.storeCurrentWiFiConfiguration(mActivity); printerConfiguration(); } else { mObservable.notifyObserver(true); } } private void printerConfiguration() { // check printer detail is available or not. mPrinterConfiguration = Util.getWifiConfiguration(mActivity, Constants.CONTROLLER_PRINTER); if (mPrinterConfiguration == null) { // printer configuration is not available. // display list of wifi available in an activity showWifiListActivity(Constants.REQUEST_CODE_PRINTER); } else { // get list of wifi available. if printer configuration available then connect it. // else.. show list of available wifi nearby. boolean isPrinterAvailable = false; // scans nearby wifi.. mWifiManager.startScan(); setScanResults(mWifiScanner.getScanResults()); // checks this wifi in scan result list.. for (int i = 0; i < mScanResults.size(); i++) { if (mPrinterConfiguration.SSID.equals("\"" + mScanResults.get(i).SSID + "\"")) { isPrinterAvailable = true; break; } } if (isPrinterAvailable) { // connect to printer wifi and show print settings dialog and continue with print flow. connectToWifi(mPrinterConfiguration); // prints document. doPrint(); } else { showWifiListActivity(Constants.REQUEST_CODE_PRINTER); } } } private void showWifiListActivity(int requestCode) { Intent iWifi = new Intent(mActivity, WifiListActivity.class); mActivity.startActivityForResult(iWifi, requestCode); } private void connectToWifi(WifiConfiguration mWifiConfiguration) { mWifiManager.enableNetwork(mWifiConfiguration.networkId, true); } public void doPrint() { try { // it is taking some time to connect to printer.. so i used handler.. and waiting for its status. mPrintStartHandler.postDelayed(new Runnable() { @Override public void run() { mPrintStartHandler.postDelayed(this, TIME_OUT); if (mPrinterConfiguration.status == WifiConfiguration.Status.CURRENT) { if (mWifiManager.getConnectionInfo().getSupplicantState() == SupplicantState.COMPLETED) { if (Util.computePDFPageCount(pdfFile) > 0) { printDocument(pdfFile); } else { AlertDialog.Builder alert = new AlertDialog.Builder(mActivity); alert.setMessage("Can't print, Page count is zero."); alert.setNeutralButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { dialog.dismiss(); switchConnection(); } }); alert.show(); } } mPrintStartHandler.removeCallbacksAndMessages(null); } else { Toast.makeText(mActivity, "Failed to connect to printer!.", Toast.LENGTH_LONG).show(); switchConnection(); mPrintStartHandler.removeCallbacksAndMessages(null); } } }, TIME_OUT); } catch (Exception e) { e.printStackTrace(); Toast.makeText(mActivity, "Failed to connect to printer!.", Toast.LENGTH_LONG).show(); switchConnection(); } } @TargetApi(Build.VERSION_CODES.KITKAT) public void printDocument(File pdfFile) { mPrintManager = (PrintManager) mActivity.getSystemService(Context.PRINT_SERVICE); String jobName = mActivity.getResources().getString(R.string.app_name) + " Document"; mCurrentPrintJob = mPrintManager.print(jobName, new PrintServicesAdapter(mActivity, mFragment, pdfFile), null); } @TargetApi(Build.VERSION_CODES.KITKAT) public void completePrintJob() { mPrintJobs = mPrintManager.getPrintJobs(); mPrintCompleteHandler.postDelayed(new Runnable() { @Override public void run() { mPrintCompleteHandler.postDelayed(this, CONNECTION_TIME_OUT); if (mCurrentPrintJob.getInfo().getState() == PrintJobInfo.STATE_COMPLETED) { // remove that PrintJob from PrintManager. for (int i = 0; i < mPrintJobs.size(); i++) { if (mPrintJobs.get(i).getId() == mCurrentPrintJob.getId()) { mPrintJobs.remove(i); } } // switching back to previous connection.. switchConnection(); // stops handler.. mPrintCompleteHandler.removeCallbacksAndMessages(null); } else if (mCurrentPrintJob.getInfo().getState() == PrintJobInfo.STATE_FAILED) { switchConnection(); Toast.makeText(mActivity, "Print Failed!", Toast.LENGTH_LONG).show(); mPrintCompleteHandler.removeCallbacksAndMessages(null); } else if (mCurrentPrintJob.getInfo().getState() == PrintJobInfo.STATE_CANCELED) { switchConnection(); Toast.makeText(mActivity, "Print Cancelled!", Toast.LENGTH_LONG).show(); mPrintCompleteHandler.removeCallbacksAndMessages(null); } } }, CONNECTION_TIME_OUT); } public void switchConnection() { try { if (!isMobileDataConnection) { mOldWifiConfiguration = Util.getWifiConfiguration(mActivity, Constants.CONTROLLER_WIFI); // get list of wifi available. if wifi configuration available then connect it. // else.. show list of available wifi nearby. boolean isWifiAvailable = false; // scans nearby wifi. mWifiManager.startScan(); setScanResults(mWifiScanner.getScanResults()); // checks this wifi in scan result list. for (int i = 0; i < mScanResults.size(); i++) { if (mOldWifiConfiguration.SSID.equals("\"" + mScanResults.get(i).SSID + "\"")) { isWifiAvailable = true; break; } } if (isWifiAvailable) { // connect to printer wifi and show print settings dialog and continue with print flow. connectToWifi(mOldWifiConfiguration); mWifiConnectHandler.postDelayed(new Runnable() { @Override public void run() { mWifiConnectHandler.postDelayed(this, TIME_OUT); if (mOldWifiConfiguration.status == WifiConfiguration.Status.CURRENT) { if (mWifiManager.getConnectionInfo().getSupplicantState() == SupplicantState.COMPLETED) { try { mObservable.notifyObserver(true); } catch (Exception e) { e.printStackTrace(); } mWifiConnectHandler.removeCallbacksAndMessages(null); } } } }, TIME_OUT); } else { showWifiListActivity(Constants.REQUEST_CODE_WIFI); } } else { mWifiManager.setWifiEnabled(false); mObservable.notifyObserver(true); } } catch (Exception e) { mObservable.notifyObserver(true); e.printStackTrace(); } } public void getPrinterConfigAndPrint() { mPrinterConfiguration = Util.getWifiConfiguration(mActivity, Constants.CONTROLLER_PRINTER); doPrint(); } public void setScanResults(List<ScanResult> scanResults) { this.mScanResults = scanResults; } public void onPrintCancelled() { switchConnection(); } @Override public void update() { mObservable.detach(this); } @Override public void updateObserver(boolean bool) { } @Override public void updateObserverProgress(int percentage) { } } 

Con la ayuda de los siguientes enlaces he creado esto.

  • Enlace para el aprendizaje Trabajo de impresión
  • Enlace para aprender Configuración y conmutación WiFi

Si usted desea imprimir su archivo apenas llama la impresión (archivo)

Si desea descargar un archivo e imprimirlo, llame a downloadAndPrint (fileUrl, fileName)

Star Micronics tiene un SDK para la impresión de Android a través de Bluetooth (así como wifi / ethernet y USB). Puede descargarlo aquí: http://www.starmicronics.com/support/SDKDocumentation.aspx .

Como se mencionó anteriormente, no se puede imprimir de forma nativa en este momento para que sus opciones sean una API de impresora específica o una aplicación de impresión de terceros.

En mi experiencia, lo mejor es utilizar una API y no una aplicación externa. La razón principal es que obtendrá un control total sobre el comportamiento de la impresora. Es fácil de implementar si la API se construye de forma inteligente. El uso de una aplicación de terceros es una limitación porque no puede personalizar sus impresiones de la forma que desee.

El Star SDK al que te he vinculado tiene una muy buena aplicación de ejemplo que te permite probar y personalizar muchas funciones de la impresora para verlas en acción. Cada función está documentada en el código fuente. Los comandos y sus parámetros también están disponibles en la propia aplicación como una rápida referencia en pantalla que es conveniente. Por encima de todo eso, está bien documentado.

Si elige esta opción, puede enviar texto sin formato a la impresora junto con comandos. La API maneja la conversión de los datos en lo que la impresora puede entender.

Hay otro SDK de impresión para Android llamado APF. Se basa en CUPS hasta miles de impresoras soportadas. Sitio web: isb-vietnam.com

Zebra Technologies también proporciona un SDK para Android . He intentado su SDK y Bixolon (conseguido él escribiendo a techsupp@bixolon.de). Ambos funcionan bien, pero si prefiere usar un lenguaje de descripción de página para definir sus documentos es mejor que utilice una impresora Zebra.

  • Datos de enlace descendente de la ruta de Android vía WiFi y datos de enlace ascendente a través de la red móvil
  • Forzar Android a utilizar la red Wifi sin Internet
  • Instalación / Acceso a Certs para VPN / WIFI mediante programación en Android
  • Comprobación de Wi-Fi activado o no en Android
  • Compruebe la disponibilidad de la red wifi oculta
  • Detección de redes WiFi abiertas
  • Cómo obtener la dirección MAC en Android 6.0
  • Problemas con el script wifi de Android
  • Hotspot multiplexado en Android
  • Cómo obtener el estándar wifi
  • Construir una configuración Wifi desde un ScanResult o: Interpretar la cadena 'capabilities' de ScanResult
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.