2011-08-22 19 views
16

Sto provando a stampare la fattura tramite Bluetooth utilizzando il seguente codice, quando eseguo l'app, la prima volta che viene stampata, ma quando riprovo non viene stampata.Problema della stampante Bluetooth in Android

package com.sel.bluetooth; 

import java.io.OutputStream; 
import java.lang.reflect.Method; 

import android.app.Activity; 
import android.app.Dialog; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.Toast; 

public class BluetoothPrint extends Activity { 

    BluetoothAdapter mBTAdapter; 
    BluetoothSocket mBTSocket = null; 
    Dialog dialogProgress; 
    String BILL, TRANS_ID; 
    String PRINTER_MAC_ID; 
    final String ERROR_MESSAGE = "There has been an error in printing the bill."; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     try { 

      // BILL = getIntent().getStringExtra("TO_PRINT"); 
      // TRANS_ID = getIntent().getStringExtra("TRANS_ID"); 

      // PRINTER_MAC_ID = getIntent().getStringExtra("MAC_ID"); 
      PRINTER_MAC_ID = "00:1F:B7:02:8F:44"; 
      //PRINTER_MAC_ID = "00:12:F3:0D:A3:E6"; 
      // TRANS_ID="12345678"; 
      BILL = "\nSale Slip No: 12345678" + "   " + "04-08-2011\n"; 
      BILL = BILL + "----------------------------------------"; 
      BILL = BILL + "\n\n"; 
      BILL = BILL + "Total Qty:" + "  " + "2.0\n"; 
      BILL = BILL + "Total Value:" + "  " + "17625.0\n"; 
      BILL = BILL + "-----------------------------------------"; 

      mBTAdapter = BluetoothAdapter.getDefaultAdapter(); 
      dialogProgress = new Dialog(BluetoothPrint.this); 

      try { 
       if (mBTAdapter.isDiscovering()) 
        mBTAdapter.cancelDiscovery(); 
       else 
        mBTAdapter.startDiscovery(); 
      } catch (Exception e) { 
       Log.e("Class ", "My Exe ", e); 
      } 
      System.out.println("BT Searching status :" 
        + mBTAdapter.isDiscovering()); 
      if (mBTAdapter == null) { 
       Toast.makeText(this, "Device has no bluetooth capability", 
         Toast.LENGTH_LONG).show(); 
       finish(); 
      } else { 
       if (!mBTAdapter.isEnabled()) { 
        Intent i = new Intent(
          BluetoothAdapter.ACTION_REQUEST_ENABLE); 
        startActivityForResult(i, 0); 
       } 

       // Register the BroadcastReceiver 
       IntentFilter filter = new IntentFilter(
         BluetoothDevice.ACTION_FOUND); 
       registerReceiver(mReceiver, filter); // Don't forget to 
                 // unregister during 
                 // onDestroy 
       dialogProgress.setTitle("Finding printer..."); 
       dialogProgress 
         .setOnDismissListener(new DialogInterface.OnDismissListener() { 
          public void onDismiss(DialogInterface dialog) { 
           dialog.dismiss(); 
           setResult(RESULT_CANCELED); 
           finish(); 
          } 
         }); 
       dialogProgress.show(); 

      } 

     } catch (Exception e) { 
      Log.e("Class ", "My Exe ", e); 
     } 
    } 

    public void printBillToDevice(final String address) { 
     new Thread(new Runnable() { 

      public void run() { 
       runOnUiThread(new Runnable() { 

        public void run() { 
         dialogProgress.setTitle("Connecting..."); 
         dialogProgress.show(); 
        } 

       }); 

       mBTAdapter.cancelDiscovery(); 

       try { 
        System.out 
          .println("**************************#****connecting"); 
        BluetoothDevice mdevice = mBTAdapter 
          .getRemoteDevice(address); 
        Method m = mdevice.getClass().getMethod(
          "createRfcommSocket", new Class[] { int.class }); 
        mBTSocket = (BluetoothSocket) m.invoke(mdevice, 1); 

        mBTSocket.connect(); 
        OutputStream os = mBTSocket.getOutputStream(); 
        os.flush(); 

        os.write(BILL.getBytes()); 
        System.out.println(BILL); 


        //mBTSocket.close(); 
        setResult(RESULT_OK); 
        finish(); 
       } catch (Exception e) { 
        Log.e("Class ", "My Exe ", e); 
        //Toast.makeText(BluetoothPrint.this, ERROR_MESSAGE,   Toast.LENGTH_SHORT).show(); 
        e.printStackTrace(); 
        setResult(RESULT_CANCELED); 
        finish(); 

       } 

       runOnUiThread(new Runnable() { 

        public void run() { 
         try { 
          dialogProgress.dismiss(); 
         } catch (Exception e) { 
          Log.e("Class ", "My Exe ", e); 
         } 
        } 

       }); 

      } 

     }).start(); 
    } 

    @Override 
    protected void onDestroy() { 
     Log.i("Dest ", "Checking Ddest"); 
     super.onDestroy(); 
     try { 
      if(dialogProgress != null) 
       dialogProgress.dismiss(); 
      if (mBTAdapter != null) 
       mBTAdapter.cancelDiscovery(); 
      this.unregisterReceiver(mReceiver); 
     } catch (Exception e) { 
      Log.e("Class ", "My Exe ", e); 
     } 
    } 

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 

      try { 
       String action = intent.getAction(); 
       // When discovery finds a device 
       if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
        // Get the BluetoothDevice object from the Intent 
        BluetoothDevice device = intent 
          .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        System.out.println("***" + device.getName() + " : " 
          + device.getAddress()); 

        if (device.getAddress().equalsIgnoreCase(PRINTER_MAC_ID)) { 
         mBTAdapter.cancelDiscovery(); 
         dialogProgress.dismiss(); 
         Toast.makeText(BluetoothPrint.this, 
           device.getName() + " Printing data", 
           Toast.LENGTH_LONG).show(); 
         printBillToDevice(PRINTER_MAC_ID); 
         Toast.makeText(BluetoothPrint.this, 
           device.getName() + " found", Toast.LENGTH_LONG) 
           .show(); 
        } 
       } 
      } catch (Exception e) { 
       Log.e("Class ", "My Exe ", e); 
       //Toast.makeText(BluetoothPrint.this, ERROR_MESSAGE,      Toast.LENGTH_SHORT).show(); 

      } 
     } 
    }; 

    @Override 
    public void onBackPressed() { 
     try { 
      if (mBTAdapter != null) 
       mBTAdapter.cancelDiscovery(); 
      this.unregisterReceiver(mReceiver); 
     } catch (Exception e) { 
      Log.e("Class ", "My Exe ", e); 
     } 
     setResult(RESULT_CANCELED); 
     finish(); 
    } 

} 
+0

Ehi, sto cercando la risposta troppo .. il motivo per cui non può essere utilizzato per la stampa un po 'di testo .. utilizzo i datec DPP-350 per le mie stampanti .. qualche soluzione? –

+0

puoi caricare il codice completo per favore? – Lucifer

+0

@ user905628 Stai utilizzando uno strumento di terze parti per accedere alla stampante bluetooth in Android? Quasi tutti i collegamenti SO affermano che Android non supporta BPP (profilo stampante Bluetooth) in modo nativo e che è necessario utilizzare sdk di terze parti (quasi tutte con licenza commerciale). Ma sembra che tu non stia usando nessuna libreria di terze parti. Quale profilo bluetooth stai usando? – Krishnabhadra

risposta

30

Ecco il codice perfectely lavorare per stampante blue-tooth in android

device_list.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView android:id="@+id/title_paired_devices" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" 
    android:text="My Text" android:visibility="gone" 
    android:background="#666" android:textColor="#fff" 
    android:paddingLeft="5dip" /> 
    <ListView android:id="@+id/paired_devices" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" 
    android:stackFromBottom="true" android:layout_weight="1" /> 
    </LinearLayout> 

device_name.xml

<?xml version="1.0" encoding="utf-8"?> 
    <TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="wrap_content" 
    android:textSize="18sp" android:padding="5dip" /> 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <TextView android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:text="@string/hello" /> 
     <Button android:text="Scan" android:id="@+id/Scan" 
     android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
     <Button android:text="Print" android:id="@+id/mPrint" 
     android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
     <Button android:text="Dissable" android:id="@+id/dis" 
     android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
     </LinearLayout> 

Dispositivo ListActivity.java

package com.sel.code; 

    import java.util.Set; 
      import android.app.Activity; 
      import android.bluetooth.BluetoothAdapter; 
      import android.bluetooth.BluetoothDevice; 
      import android.content.Intent; 
      import android.os.Bundle; 
      import android.util.Log; 
      import android.view.View; 
      import android.view.Window; 
      import android.widget.AdapterView; 
      import android.widget.ArrayAdapter; 
      import android.widget.ListView; 
      import android.widget.TextView; 
      import android.widget.AdapterView.OnItemClickListener; 

    public class DeviceListActivity extends Activity 
    { 
    protected static final String TAG = "TAG"; 
    private BluetoothAdapter mBluetoothAdapter; 
    private ArrayAdapter<String> mPairedDevicesArrayAdapter; 

    @Override 
    protected void onCreate(Bundle mSavedInstanceState) 
    { 
     super.onCreate(mSavedInstanceState); 
     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
     setContentView(R.layout.device_list); 

     setResult(Activity.RESULT_CANCELED); 
     mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 

     ListView mPairedListView = (ListView) findViewById(R.id.paired_devices); 
     mPairedListView.setAdapter(mPairedDevicesArrayAdapter); 
     mPairedListView.setOnItemClickListener(mDeviceClickListener); 

     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     Set<BluetoothDevice> mPairedDevices = mBluetoothAdapter.getBondedDevices(); 

     if (mPairedDevices.size() > 0) 
     { 
      findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); 
      for (BluetoothDevice mDevice : mPairedDevices) 
      { 
       mPairedDevicesArrayAdapter.add(mDevice.getName() + "\n" + mDevice.getAddress()); 
      } 
     } 
     else 
     { 
      String mNoDevices = "None Paired";//getResources().getText(R.string.none_paired).toString(); 
      mPairedDevicesArrayAdapter.add(mNoDevices); 
     } 
    } 

    @Override 
    protected void onDestroy() 
    { 
     super.onDestroy(); 
     if (mBluetoothAdapter != null) 
     { 
      mBluetoothAdapter.cancelDiscovery(); 
     } 
    } 

    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> mAdapterView, View mView, int mPosition, long mLong) 
     { 
      mBluetoothAdapter.cancelDiscovery(); 
      String mDeviceInfo = ((TextView) mView).getText().toString(); 
      String mDeviceAddress = mDeviceInfo.substring(mDeviceInfo.length() - 17); 
      Log.v(TAG, "Device_Address " + mDeviceAddress); 

      Bundle mBundle = new Bundle(); 
      mBundle.putString("DeviceAddress", mDeviceAddress); 
      Intent mBackIntent = new Intent(); 
      mBackIntent.putExtras(mBundle); 
      setResult(Activity.RESULT_OK, mBackIntent); 
      finish(); 
     } 
    }; 

    } 

Main.java

 package com.sel.code; 

     import java.io.IOException; 
     import java.io.OutputStream; 
     import java.nio.ByteBuffer; 
     import java.util.Set; 
     import java.util.UUID; 

     import android.app.Activity; 
     import android.app.ProgressDialog; 
     import android.bluetooth.BluetoothAdapter; 
     import android.bluetooth.BluetoothDevice; 
     import android.bluetooth.BluetoothSocket; 
     import android.content.Intent; 
     import android.os.Bundle; 
     import android.os.Handler; 
     import android.os.Message; 
     import android.util.Log; 
     import android.view.View; 
     import android.view.Window; 
     import android.view.WindowManager; 
     import android.widget.Button; 
     import android.widget.Toast; 

     public class Main extends Activity implements Runnable { 
      protected static final String TAG = "TAG"; 
      private static final int REQUEST_CONNECT_DEVICE = 1; 
      private static final int REQUEST_ENABLE_BT = 2; 
      Button mScan, mPrint, mDisc; 
      BluetoothAdapter mBluetoothAdapter; 
      private UUID applicationUUID = UUID 
        .fromString("00001101-0000-1000-8000-00805F9B34FB"); 
      private ProgressDialog mBluetoothConnectProgressDialog; 
      private BluetoothSocket mBluetoothSocket; 
      BluetoothDevice mBluetoothDevice; 

      @Override 
      public void onCreate(Bundle mSavedInstanceState) { 
       super.onCreate(mSavedInstanceState); 
       requestWindowFeature(Window.FEATURE_NO_TITLE); 
       getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
         WindowManager.LayoutParams.FLAG_FULLSCREEN); 
       setContentView(R.layout.main); 
       mScan = (Button) findViewById(R.id.Scan); 
       mScan.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View mView) { 
         mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
         if (mBluetoothAdapter == null) { 
          Toast.makeText(Main.this, "Message1", 2000).show(); 
         } else { 
          if (!mBluetoothAdapter.isEnabled()) { 
           Intent enableBtIntent = new Intent(
             BluetoothAdapter.ACTION_REQUEST_ENABLE); 
           startActivityForResult(enableBtIntent, 
             REQUEST_ENABLE_BT); 
          } else { 
           ListPairedDevices(); 
           Intent connectIntent = new Intent(Main.this, 
             DeviceListActivity.class); 
           startActivityForResult(connectIntent, 
             REQUEST_CONNECT_DEVICE); 
          } 
         } 
        } 
       }); 

       mPrint = (Button) findViewById(R.id.mPrint); 
       mPrint.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View mView) { 
         Thread t = new Thread() { 
          public void run() { 
           try { 
            OutputStream os = mBluetoothSocket 
              .getOutputStream(); 
            String BILL = ""; 

            BILL = "\nInvoice No: ABCDEF28060000005" + " " 
              + "04-08-2011\n"; 
            BILL = BILL 
              + "-----------------------------------------"; 
            BILL = BILL + "\n\n"; 
            BILL = BILL + "Total Qty:" + "  " + "2.0\n"; 
            BILL = BILL + "Total Value:" + "  " 
              + "17625.0\n"; 
            BILL = BILL 
              + "-----------------------------------------\n"; 
            os.write(BILL.getBytes()); 
             //This is printer specific code you can comment ==== > Start 

            // Setting height 
            int gs = 29; 
            os.write(intToByteArray(gs)); 
            int h = 104; 
            os.write(intToByteArray(h)); 
            int n = 162; 
            os.write(intToByteArray(n)); 

            // Setting Width 
            int gs_width = 29; 
            os.write(intToByteArray(gs_width)); 
            int w = 119; 
            os.write(intToByteArray(w)); 
            int n_width = 2; 
            os.write(intToByteArray(n_width)); 

            // Print BarCode 
            int gs1 = 29; 
            os.write(intToByteArray(gs1)); 
            int k = 107; 
            os.write(intToByteArray(k)); 
            int m = 73; 
            os.write(intToByteArray(m)); 

            String barCodeVal = "ASDFC028060000005";// "HELLO12345678912345012"; 
            System.out.println("Barcode Length : " 
              + barCodeVal.length()); 
            int n1 = barCodeVal.length(); 
            os.write(intToByteArray(n1)); 

            for (int i = 0; i < barCodeVal.length(); i++) { 
             os.write((barCodeVal.charAt(i) + "").getBytes()); 
            } 
     //printer specific code you can comment ==== > End 
           } catch (Exception e) { 
            Log.e("Main", "Exe ", e); 
           } 
          } 
         }; 
         t.start(); 
        } 
       }); 

       mDisc = (Button) findViewById(R.id.dis); 
       mDisc.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View mView) { 
         if (mBluetoothAdapter != null) 
          mBluetoothAdapter.disable(); 
        } 
       }); 

      }// onCreate 

      @Override 
      protected void onDestroy() { 
       // TODO Auto-generated method stub 
       super.onDestroy(); 
       try { 
        if (mBluetoothSocket != null) 
         mBluetoothSocket.close(); 
       } catch (Exception e) { 
        Log.e("Tag", "Exe ", e); 
       } 
      } 

      @Override 
      public void onBackPressed() { 
       try { 
        if (mBluetoothSocket != null) 
         mBluetoothSocket.close(); 
       } catch (Exception e) { 
        Log.e("Tag", "Exe ", e); 
       } 
       setResult(RESULT_CANCELED); 
       finish(); 
      } 

      public void onActivityResult(int mRequestCode, int mResultCode, 
        Intent mDataIntent) { 
       super.onActivityResult(mRequestCode, mResultCode, mDataIntent); 

       switch (mRequestCode) { 
       case REQUEST_CONNECT_DEVICE: 
        if (mResultCode == Activity.RESULT_OK) { 
         Bundle mExtra = mDataIntent.getExtras(); 
         String mDeviceAddress = mExtra.getString("DeviceAddress"); 
         Log.v(TAG, "Coming incoming address " + mDeviceAddress); 
         mBluetoothDevice = mBluetoothAdapter 
           .getRemoteDevice(mDeviceAddress); 
         mBluetoothConnectProgressDialog = ProgressDialog.show(this, 
           "Connecting...", mBluetoothDevice.getName() + " : " 
             + mBluetoothDevice.getAddress(), true, false); 
         Thread mBlutoothConnectThread = new Thread(this); 
         mBlutoothConnectThread.start(); 
         // pairToDevice(mBluetoothDevice); This method is replaced by 
         // progress dialog with thread 
        } 
        break; 

       case REQUEST_ENABLE_BT: 
        if (mResultCode == Activity.RESULT_OK) { 
         ListPairedDevices(); 
         Intent connectIntent = new Intent(Main.this, 
           DeviceListActivity.class); 
         startActivityForResult(connectIntent, REQUEST_CONNECT_DEVICE); 
        } else { 
         Toast.makeText(Main.this, "Message", 2000).show(); 
        } 
        break; 
       } 
      } 

      private void ListPairedDevices() { 
       Set<BluetoothDevice> mPairedDevices = mBluetoothAdapter 
         .getBondedDevices(); 
       if (mPairedDevices.size() > 0) { 
        for (BluetoothDevice mDevice : mPairedDevices) { 
         Log.v(TAG, "PairedDevices: " + mDevice.getName() + " " 
           + mDevice.getAddress()); 
        } 
       } 
      } 

      public void run() { 
       try { 
        mBluetoothSocket = mBluetoothDevice 
          .createRfcommSocketToServiceRecord(applicationUUID); 
        mBluetoothAdapter.cancelDiscovery(); 
        mBluetoothSocket.connect(); 
        mHandler.sendEmptyMessage(0); 
       } catch (IOException eConnectException) { 
        Log.d(TAG, "CouldNotConnectToSocket", eConnectException); 
        closeSocket(mBluetoothSocket); 
        return; 
       } 
      } 

      private void closeSocket(BluetoothSocket nOpenSocket) { 
       try { 
        nOpenSocket.close(); 
        Log.d(TAG, "SocketClosed"); 
       } catch (IOException ex) { 
        Log.d(TAG, "CouldNotCloseSocket"); 
       } 
      } 

      private Handler mHandler = new Handler() { 
       @Override 
       public void handleMessage(Message msg) { 
        mBluetoothConnectProgressDialog.dismiss(); 
        Toast.makeText(Main.this, "DeviceConnected", 5000).show(); 
       } 
      }; 

      public static byte intToByteArray(int value) { 
       byte[] b = ByteBuffer.allocate(4).putInt(value).array(); 

       for (int k = 0; k < b.length; k++) { 
        System.out.println("Selva [" + k + "] = " + "0x" 
          + UnicodeFormatter.byteToHex(b[k])); 
       } 

       return b[3]; 
      } 

      public byte[] sel(int val) { 
       ByteBuffer buffer = ByteBuffer.allocate(2); 
       buffer.putInt(val); 
       buffer.flip(); 
       return buffer.array(); 
      } 

     } 

UnicodeFormatter.java

package com.sel.code; 

    import java.io.*; 

    public class UnicodeFormatter { 

     static public String byteToHex(byte b) { 
       // Returns hex String representation of byte b 
       char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
         'a', 'b', 'c', 'd', 'e', 'f' }; 
       char[] array = { hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f] }; 
       return new String(array); 
     } 

     static public String charToHex(char c) { 
       // Returns hex String representation of char c 
       byte hi = (byte) (c >>> 8); 
       byte lo = (byte) (c & 0xff); 
       return byteToHex(hi) + byteToHex(lo); 
     } 

    } // class 
+1

usato molto grazie grazie –

+1

sei il benvenuto –

+0

come impostare la larghezza del charactor ??/ –

0

ho appena commentata //mBTSocket.close();

Poi, poco prima, aggiungere:

if (mBTAdapter != null) 
    mBTAdapter.cancelDiscovery(); 

e tutto va bene!

+0

sto usando il codice sopra e ho lo stesso problema che è stato stampato solo la prima volta..e sto chiudendo la connessione socket il problema non è risolto .. quindi per favore aiutatemi se avete qualche idea .. –

+0

@Kingslayer dove decommentare questo ? – CoronaPintu

+0

@KinjalShah sto ricevendo lo stesso problema se avessi risolto allora pls aiuto – CoronaPintu

Problemi correlati