Подтвердить что ты не робот

Bluetooth и WIFI для Android

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

То, что я знаю в настоящее время:

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

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

  • Как вы печатаете из своего приложения для Android?
  • Какой принтер вы используете?
  • Планируется ли в стандартном SDK Android включить печать? Какова дорожная карта? Доступен ли он сейчас как Бета или что-то еще?
  • Если мы каким-то образом (я так не думаю), создайте собственное решение для печати через bluetooth, можете ли вы рекомендовать стандарты и протоколы для проверки и изучения?
4b9b3361

Ответ 1

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

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

Краткий пример запуска процесса печати:

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

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

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

Ответ 2

Печать через Bluetooth на Android пока не представляется возможным (по моим сведениям), поскольку Android не поддерживает Bluetooth "Профили", такие как BPP (профиль базовой печати), HCRP (Hardcopy Replacement Profile), BIP (Basic Imaging Profile) и т.д., Которые являются общими профилями, используемыми при печати Bluetooth. Ссылка this, чтобы узнать о печати профилей BT.

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

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

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

Также проверьте, включены ли "Виртуальный принтер Google", который использует облако для печати на принтере, подключенном в любой точке мира, который поддерживает этот протокол. Это совершенно новое явление на рынке, но что-то, что определенно получит тягу в ближайшие годы. Ознакомьтесь с Приложение для облачного печати. и faq здесь.

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

Ответ 3

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

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

  • проверяет подключение.
  • Если подключено в WiFi, я сохраняю эту конфигурацию WiFi.
  • Теперь проверяется, есть ли у меня уже информация о принтере (настройка WiFi WiFi-принтера) или нет. Если это возможно, я сканирую и получаю список параметров ScanResults WiFi и подключаюсь к этому другому. Он отображает список WiFi и нажимает на это, пользователь подключится к принтеру и сохранит конфигурацию WiFi для будущих заданий на печать.
  • После завершения задания на печать я подключаюсь к моему предыдущему соединению Wi-Fi или мобильной связи.
  • Теперь вернемся к второму шагу.
  • Если пользователь подключен к мобильным данным, я просто включаю WiFi и следую за третьим шагом.
  • После завершения задания на печать я просто отключу WiFi. так что мы будем подключены к мобильному подключению данных. (Это андроид по умолчанию).

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

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

    }

}

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

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

Если вы хотите загрузить файл и распечатать его, вызов downloadAndPrint (fileUrl, имя_файла)

Ответ 4

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

Ответ 5

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

Как уже упоминалось выше, вы не можете печатать изначально в этот момент времени, чтобы ваши параметры были либо конкретным API-интерфейсом принтера, либо сторонним устройством печати. ​​

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

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

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

Ответ 6

Существует еще одна версия SDK для Android под названием APF. Он основан на CUPS, поэтому поддерживается до тысячи принтеров. Веб-сайт: isb-vietnam.com

Ответ 7

Zebra Technologies также предоставляет SDK для Android. Я попробовал как их SDK, так и Bixolon (получил его, написав на [email protected]). Оба работают нормально, но если вы предпочитаете использовать язык описания страниц, чтобы определить свои документы, вам, вероятно, лучше использовать принтер Zebra.