Android печатает текст на принтере

Я разрабатываю приложение для ресторана, которое печатает чеки после того, как клиент покупает продукты. Я добавил экран конфигурации в приложение, которое менеджер использует для настройки принтеров. Менеджер может распечатать тестовую страницу, чтобы проверить, правильно ли он ввел ip и порт. Вот мой код, который печатает тестовую страницу:

private class PrintTask extends AsyncTask<Printer, Boolean, String> {

    @Override
    protected String doInBackground(Printer... params) {

        try {
            publishProgress(true);
            Socket sock = new Socket(params[0].getIp(), Integer.parseInt(params[0].getPort()));

            PrintWriter oStream = new PrintWriter(sock.getOutputStream());
            oStream.printf("--------------------------------\r\n");
            oStream.printf("***        TEST PRINT       ***\r\n");
            oStream.printf("You have configured your \n\r");
            oStream.printf(params[0].getName());
            oStream.printf("\r\nprinter successfully\n\r");
            oStream.printf("|           Thanks             |\r\n");
            oStream.printf("--------------------------------\r\n");
            oStream.close();
            sock.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        publishProgress(false);
        return "";
    }

    @Override
    protected void onProgressUpdate(Boolean... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
        if(!values[0]) {
            waitView.setVisibility(View.GONE);
        }
        else {
            waitView.setVisibility(View.VISIBLE);
        }
    }

}

Проблема в том, что если я печатаю на сетевом принтере (автономном принтере без подключения к ПК), он печатает текст правильно. Здесь я использую IP-адрес и порт по умолчанию 9100. Но когда я печатаю на общий принтер, подключенный к ПК, он не печатает. Любая идея, где я делаю неправильно...???


person Khawar Raza    schedule 17.06.2013    source источник
comment
не могли бы вы указать, какой принтер вы использовали? Я попробовал этот код на Brother HL-2135W, и он ничего не выводит.   -  person George    schedule 03.10.2013
comment
Это был какой-то принтер HP LaserJet. Вы добавили разрешение на доступ в Интернет в свой манифест?   -  person Khawar Raza    schedule 04.10.2013
comment
Я сделал. ‹использует-разрешение android:name=android.permission.INTERNET /›   -  person George    schedule 04.10.2013
comment
Проблема в том, что приложение подключается к принтеру, потому что индикатор принтера мигает, указывая на некоторую передачу данных, но оно просто не печатает. Ни мусора, ни пустой страницы :(   -  person George    schedule 04.10.2013
comment
Можете ли вы проверить, что методы oStream.close(); носок.закрыть(); вызываются? Потому что я предполагаю, что принтер печатает, когда сокеты закрываются.   -  person Khawar Raza    schedule 04.10.2013
comment
я использую logcat, и он печатает, закрывая сокет и все такое, но принтер все равно не печатает :(   -  person George    schedule 04.10.2013
comment
Он должен распечататься, если все идет правильно. Вот приложение Play Store для принтеров Brother. play.google.com/store/apps/details? id=com.brother.mfc.brprint Декомпилируйте apk и попробуйте узнать, как они печатаются?   -  person Khawar Raza    schedule 07.10.2013
comment
@KhawarRaza Не могли бы вы ответить на мой вопрос stackoverflow.com/questions/29094911/   -  person VVB    schedule 17.03.2015


Ответы (1)


Из того, что вы описываете, похоже, что на этом автономном принтере работает какая-то «служба текстовой печати» на вашем данном порту. Похоже, все, что вы отправляете на этот порт, будет напечатано в виде текста.

Принимая во внимание, что когда у вас есть «Общий» принтер на вашем компьютере с Windows, он реализуется с помощью службы Windows Printer или чего-то в этом роде. Это уже не просто сокет/порт, где вы можете писать текст ASCII.

person Dimitry K    schedule 30.08.2013
comment
Я так думаю. Любая идея, как отправить печать на такой общий принтер? - person Khawar Raza; 02.09.2013
comment
Похоже, единственный правильный способ печати с Android — использовать службу Cloud Print. Вам нужно будет сделать свой принтер доступным через Google Cloud Print [ссылка]howtogeek.com/165778/ (он будет привязан к вашей учетной записи Google), а позже вы сможете использовать [Google Print Cloud API]developers.google.com/cloud-print для печати. - person Dimitry K; 02.09.2013
comment
Или другим более простым вариантом было бы просто написать простую серверную программу, которая будет работать на компьютере с Windows (тот, у которого есть общий принтер), и будет прослушивать текстовые команды и соответственно отправлять их на принтер. Таким образом, ваш код на устройствах Android остается прежним, и только сторона Windows становится более сложной. - person Dimitry K; 02.09.2013
comment
Да, на самом деле мой сервер имеет тот же набор функций, что и мое приложение для Android, и они делают то же самое, используя какую-то точечную сеть, но клиент хочет печатать локально, а не сначала отправлять запрос на сервер, а затем обратно на локальный принтер. - person Khawar Raza; 02.09.2013
comment
@DimitryK Не могли бы вы ответить на мой вопрос stackoverflow.com/questions/29094911/ - person VVB; 17.03.2015