Вопрос

Нам понадобится портативный принтер (Handheld, важно), который может подключиться к телефону Android через Bluetooth или WiFi.

Я знаю, в данный момент:

  • Никакой стандартной печати SDK доступен для Android на этот раз
  • Существует не официальный SDK IPRINT SDK. Отказ У кого-нибудь из вас пробовал через Wi-Fi или Bluetooth? Это работает?
  • Printershare. также утверждает, что Программно доступен. Отказ Для меня было бы нормально оплатить один раз взять на себя 5 долларов за его на телефон. У него много поддерживаемых форматов. Вы пробовали это с каким-либо портативным устройством? Я спросил их о списке поддерживаемых принтеров Bluetooth (поскольку у него есть пункт меню «Поиск BT принтера»), но они не ответили.

Что мне нужно знать выше, уже спросила:

  • Как вы печатаете из вашего приложения Android?
  • Какой принтер вы используете?
  • Запланируется ли в стандартном Android SDK, чтобы включить печать? Что такое дорожная карта? Это теперь доступно как бета или что-то?
  • Если мы как-то (я так не думаю) Создайте собственное решение для печати через Bluetooth, вы можете порекомендовать стандарты и протоколы для проверки и изучения?
Это было полезно?

Решение

Начиная с Android 4.4. Вы можете печатать документы с устройства на аппаратный принтер через WiFi.

Приложения для Android теперь могут распечатывать любой тип содержимого через Wi-Fi или облачных размещенных услуг, таких как Poogle Cloud Print. В приложениях с поддержкой печати пользователи могут обнаружить доступные принтеры, изменять размеры бумаги, выбирать определенные страницы для печати и печатать практически любой тип документа, изображения или файла.

Краткий пример того, как начать процесс печати:

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

где CustomPrintDocumentAdapter простирается PrintDocumentAdapter..

Доступна дополнительная информация на Разработчики Android.

Другие советы

Печать через Bluetooth на Android невозможно, насколько сейчас невозможно (согласно мнению моих знаний), так как Android не поддерживает Bluetooth «Профили», таких как BPP (основной профиль печати), HCRP (BASIC PROFTORMENT И т. Д., которые являются общими профилями, используемыми с печатью Bluetooth. Реф. это знать о печати профилей BT.

В настоящее время Android поддерживает OPP (Object Plass Profile), который используется для отправки файлов на Bluetooth.

Чтобы печатать профили Bluetooth, реализованные в стеке Bluetooth для Android, вы можете обратиться Sybase-Ianywhere - blue-sdk-for-android, который предоставляет SDK для добавления этой функциональности в существующую реализацию стека BT на Android.

Для печати WiFi на рынке есть много приложений, которые позволяют печатать различные документы и изображения с вашего телефона Android. Видеть Printershare. Для одного такого приложения. Для печати WiFi вы можете использовать любой принтер, который вы можете подключить через Ethernet (LAN).

Также проверьте принты, которые включены «Pook Cloud Print», что использует облако для печати на принтер, подключенном в любом месте в мире, который поддерживает этот протокол. Это вполне новый на рынке, но то, что определенно наберет тяги в ближайшие годы. Проверить Приложение Cloud Print здесь. Отказ и FAQ здесь.

Надеюсь, что это поможет взять несколько вопросов от вашего списка.

Извините, у меня нет знаний о печати с использованием устройств Bluetooth .. Но я провел некоторые исследования о печати, используя WiFi и разместил этот код в GitHub, вы можете обратиться к этому, если это необходимо .. Android-wifi-print - github

Это поток этого прототипа.

  1. Проверяет подключение.
  2. Если подключен в WiFi .. Хранив, что конфигурация WiFi.
  3. Теперь проверяя ли я информацию принтера (конфигурация WiFi в WiFi принтера) доступна или нет. Если доступно, я сканирую и получаю список Wi-Fi ScanResults и подключился к этому еще .. Это покажет список Wi-Fi и нажав на то, что пользователь подключится к принтеру и хранит эту настройку WiFi для будущих заданий на будущее.
  4. После завершения задания Print я подключаю к моему предыдущему подключению Wi-Fi или мобильной связи.
  5. Теперь возвращаясь на 2-й шаг.
  6. Если пользователь подключен к мобильным данным, я просто включаю WiFi и после 3-го шага.
  7. После завершения задания напечатайте, я просто отключаю WiFi. Так что, мы будем подключаться к мобильному соединению данных. (Это android по умолчанию).

Ниже класс позаботится обо всех рабочих местах печати в этом прототипе.

Printuty.class.cass.

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

    }

}

С помощью следующих ссылок я создал это.

Если вы хотите распечатать свой файл, просто позвоните распечатать файл)

Если вы хотите скачать файл и распечатать это, позвоните downloadandprint (fileurl, filename)

Единственная печать, которую я смог интегрировать, предназначен для Bixolon SPP-R200. У них есть достойный SDK и довольно легко найти. Я ищу 8 1/2 x 11 возможностей Bluetooth, но SDK для чего-то вроде это, кажется, довольно высокий заказ прямо сейчас

Star Micronics имеет SDK для печати Android через Bluetooth (а также WiFi / Ethernet и USB). Вы можете скачать это здесь: http://www.starmicronics.com/support/sdkdocumentation.aspx..

Как уже упоминалось выше, вы не можете печатать в настоящее время в этот момент вовремя, поэтому ваши опции являются конкретным API принтера, либо приложением 3-го вечеринка.

По моему опыту лучше всего использовать API, а не внешнее приложение. Самая большая причина заключается в том, что вы получаете полный контроль над поведением принтера. Легко реализовать, если API построен разумно. Использование приложения для 3-го вечеринка ограничивает, потому что вы не можете настроить ваши распечатки, как вы хотите.

Звезда SDK, я связал вас, чтобы иметь действительно хорошее приложение, которое позволяет вам проверить и настроить много функций принтера, чтобы увидеть их в действии. Каждая функция документирована в исходном коде. Команды и их параметры также доступны в самом приложении как быстрый на экране, которая удобна. Кроме того, это хорошо документировано.

Если вы выберете таким образом, вы можете отправить простой текст на принтер вместе с командами. Обрабатывает API преобразование данных в то, что может понять принтер.

Есть еще одна печатая SDK для Android под названием APF. Он основан на чашках, так до тысяч при поддержке принтеров. Интернет сайт: Isb-vietnam.com.

Zebra Technologies также предоставляет SDK для Android. Отказ Я попробовал и их SDK, так и бикслон (получил его, написав на Techsupp@bixolon.de). Оба работают нормально, но если вы предпочитаете использовать Страница Описание Язык Чтобы определить ваши документы, вы, вероятно, лучше с помощью принтера Zebra.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top