通过Usb Communication android在打印机上打印文本

时间:2015-05-28 06:26:19

标签: android

我正在开发应用程序,它打印用户在安装了Android设备和OTG线缆的打印机上定义的文本。当我运行应用程序并单击打印按钮时,打印机省略打印声音然后什么也不做,我收到的响应是

Log.i("Info", "Bulk transfer started");
Log.i("Info", ??);
Log.i("Info", "Amount of data transferred : " + 5);
Log.i("Info", "Interface released");
Log.i("Info", "Usb connection closed");
Log.i("Info", "Brodcast reciever unregistered");

请帮助我,我错在这里是源代码。

activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/usbDevice"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/buttonPrint"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Print" />
</LinearLayout>

xml / device_filter

<resources>
     <usb-device vendor-id="65535" product-id="7176" />
</resources>

MainActivity

package com.example.hp.printviausb;

import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbRequest;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Iterator;

public class MainActivity extends ActionBarActivity
    {
        private UsbManager mUsbManager;
        private UsbDevice mDevice;
        private UsbDeviceConnection mConnection;
        private UsbInterface mInterface;
        private UsbEndpoint mEndPoint;
        private PendingIntent mPermissionIntent;
        private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
        private static Boolean forceCLaim = true;

        HashMap<String, UsbDevice> mDeviceList;
        Iterator<UsbDevice> mDeviceIterator;

        int protocol;

        @Override
        protected void onCreate(Bundle savedInstanceState)
            {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
                mDeviceList = mUsbManager.getDeviceList();
                mDeviceIterator = mDeviceList.values().iterator();

                Button print = (Button) findViewById(R.id.buttonPrint);

                Toast.makeText(this, "Device List Size: " + String.valueOf(mDeviceList.size()), Toast.LENGTH_SHORT).show();
                TextView textView = (TextView) findViewById(R.id.usbDevice);
                String usbDevice = "";
                // This is just testing what devices are connected
                while (mDeviceIterator.hasNext())
                    {
                        UsbDevice usbDevice1 = mDeviceIterator.next();
                        usbDevice += "\n" + "DeviceID: " + usbDevice1.getDeviceId() + "\n" + "DeviceName: " + usbDevice1.getDeviceName() + "\n" + "DeviceClass: " + usbDevice1.getDeviceClass() + " - "
                                + translateDeviceClass(usbDevice1.getDeviceClass()) + "\n" + "DeviceSubClass: " + usbDevice1.getDeviceSubclass() + "\n" + "VendorID: " + usbDevice1.getVendorId() + "\n" + "ProductID: " + usbDevice1.getProductId()
                                + "\n";

                        protocol = usbDevice1.getDeviceProtocol();

                        int interfaceCount = usbDevice1.getInterfaceCount();
                        Toast.makeText(this, "INTERFACE COUNT: " + String.valueOf(interfaceCount), Toast.LENGTH_SHORT).show();

                        mDevice = usbDevice1;

                        if (mDevice == null)
                            {
                                Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show();
                            }
                        else
                            {
                                // Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show();
                            }
                        textView.setText(usbDevice);
                    }

                if (mDevice == null)
                    {
                        Toast.makeText(this, "mDevice is null", Toast.LENGTH_SHORT).show();
                    }
                else
                    {
                        // Toast.makeText(this, "mDevice is not null", Toast.LENGTH_SHORT).show();
                    }

                print.setOnClickListener(new View.OnClickListener()
                    {
                        @Override
                        public void onClick(View view)
                            {
                                mPermissionIntent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(ACTION_USB_PERMISSION), 0);
                                IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
                                registerReceiver(mUsbReceiver, filter);
                                if (mDevice != null)
                                    mUsbManager.requestPermission(mDevice, mPermissionIntent);
                                // else
                                // Toast.makeText(this, "USB ", Toast.LENGTH_SHORT).show();

                                // print(mConnection, mInterface);
                            }
                    });
            }

        private String translateDeviceClass(int deviceClass)
            {
                switch (deviceClass)
                    {
                    case UsbConstants.USB_CLASS_APP_SPEC:
                        return "Application specific USB class";
                    case UsbConstants.USB_CLASS_AUDIO:
                        return "USB class for audio devices";
                    case UsbConstants.USB_CLASS_CDC_DATA:
                        return "USB class for CDC devices (communications device class)";
                    case UsbConstants.USB_CLASS_COMM:
                        return "USB class for communication devices";
                    case UsbConstants.USB_CLASS_CONTENT_SEC:
                        return "USB class for content security devices";
                    case UsbConstants.USB_CLASS_CSCID:
                        return "USB class for content smart card devices";
                    case UsbConstants.USB_CLASS_HID:
                        return "USB class for human interface devices (for example, mice and keyboards)";
                    case UsbConstants.USB_CLASS_HUB:
                        return "USB class for USB hubs";
                    case UsbConstants.USB_CLASS_MASS_STORAGE:
                        return "USB class for mass storage devices";
                    case UsbConstants.USB_CLASS_MISC:
                        return "USB class for wireless miscellaneous devices";
                    case UsbConstants.USB_CLASS_PER_INTERFACE:
                        return "USB class indicating that the class is determined on a per-interface basis";
                    case UsbConstants.USB_CLASS_PHYSICA:
                        return "USB class for physical devices";
                    case UsbConstants.USB_CLASS_PRINTER:
                        return "USB class for printers";
                    case UsbConstants.USB_CLASS_STILL_IMAGE:
                        return "USB class for still image devices (digital cameras)";
                    case UsbConstants.USB_CLASS_VENDOR_SPEC:
                        return "Vendor specific USB class";
                    case UsbConstants.USB_CLASS_VIDEO:
                        return "USB class for video devices";
                    case UsbConstants.USB_CLASS_WIRELESS_CONTROLLER:
                        return "USB class for wireless controller devices";
                    default:
                        return "Unknown USB class!";
                    }
            }

        // Broadcast receiver to obtain permission from user for connection
        private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver()
            {

                public void onReceive(Context context, Intent intent)
                    {
                        String action = intent.getAction();
                        if (ACTION_USB_PERMISSION.equals(action))
                            {
                                synchronized (this)
                                    {
                                        UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                                        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false))
                                            {
                                                if (device != null)
                                                    {
                                                        // call method to set up device communication
                                                        mInterface = device.getInterface(0);
                                                        mEndPoint = mInterface.getEndpoint(0);
                                                        mConnection = mUsbManager.openDevice(device);

                                                        startPrinting(device);

                                                        // setup();
                                                    }
                                            }
                                        else
                                            {
                                                // Log.d("SUB", "permission denied for device " + device);
                                                Toast.makeText(context, "PERMISSION DENIED FOR THIS DEVICE", Toast.LENGTH_SHORT).show();
                                            }
                                    }
                            }
                    }
            };

        public void startPrinting(final UsbDevice printerDevice)
            {
                Handler handler = new Handler();
                handler.post(new Runnable()
                    {
                        UsbDeviceConnection conn;
                        UsbInterface usbInterface;

                        @Override
                        public void run()
                            {
                                try
                                    {
                                        Log.i("Info", "Bulk transfer started");
                                        // usbInterface = printerDevice.getInterface(0);

                                        for (int i = 0; i < printerDevice.getInterfaceCount(); i++)
                                            {
                                                usbInterface = printerDevice.getInterface(i);

                                                if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER)
                                                    {
                                                        // usbInterface = mDevice;
                                                    }
                                            }

                                        UsbEndpoint endPoint = usbInterface.getEndpoint(0);
                                        conn = mUsbManager.openDevice(mDevice);
                                        conn.claimInterface(usbInterface, true);

                                        String myStringData = "TEXT";
                                        myStringData += "\n";
                                        byte[] array = myStringData.getBytes();
                                        ByteBuffer output_buffer = ByteBuffer.allocate(array.length);
                                        UsbRequest request = new UsbRequest();
                                        request.initialize(conn, endPoint);
                                        request.queue(output_buffer, array.length);
                                        if (conn.requestWait() == request)
                                            {
                                                Log.i("Info", output_buffer.getChar(0) + "");
                                                Message m = new Message();
                                                m.obj = output_buffer.array();
                                                output_buffer.clear();
                                            }
                                        else
                                            {
                                                Log.i("Info", "No request recieved");
                                            }
                                        int transfered = conn.bulkTransfer(endPoint, myStringData.getBytes(), myStringData.getBytes().length, 5000);
                                        Log.i("Info", "Amount of data transferred : " + transfered);

                                    }
                                catch (Exception e)
                                    {
                                        Log.e("Exception", "Unable to transfer bulk data");
                                        e.printStackTrace();
                                    }
                                finally
                                    {
                                        try
                                            {
                                                conn.releaseInterface(usbInterface);
                                                Log.i("Info", "Interface released");
                                                conn.close();
                                                Log.i("Info", "Usb connection closed");
                                                unregisterReceiver(mUsbReceiver);
                                                Log.i("Info", "Brodcast reciever unregistered");
                                            }
                                        catch (Exception e)
                                            {
                                                Log.e("Exception", "Unable to release resources because : " + e.getMessage());
                                                e.printStackTrace();
                                            }
                                    }

                            }
                    });
            }

    }

Manifest_file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hp.printviausb">

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.usb.host" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />

                <meta-data
                    android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                    android:resource="@xml/device_filter" />
            </intent-filter>
        </activity>
    </application>

</manifest>

0 个答案:

没有答案