2011-08-22 9 views
16

다음 코드를 사용하여 블루투스를 통해 청구서를 인쇄하려합니다. 처음 앱을 실행할 때 인쇄가 시작되지만 다시 인쇄하지 않을 때 다시 시도합니다.안드로이드에서 블루투스 프린터 문제

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

를 모든 것이 순조롭게 진행 :

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

이봐, 나는 그것이 인쇄에 사용할 수없는 이유 .. 너무 대답을 찾고 있어요 일부 텍스트 .. 나는 내 프린터에 대한 datecs DPP - 350을 사용 .. 어떤 솔루션? –

+0

전체 코드를 업로드 할 수 있습니까? – Lucifer

+0

@ user905628 타사 도구를 사용하여 Android 프린터에서 블루투스 프린터에 액세스하고 있습니까? 거의 모든 SO 링크는 안드로이드가 기본적으로 BPP (블루투스 프린터 프로파일)를 지원하지 않으며 제 3 자 SDK (거의 모든 것이 상업적으로 허가 됨)를 사용해야한다고 주장합니다. 하지만 제 3 자 라이브러리를 사용하지 않는 것 같습니다. 어떤 블루투스 프로파일을 사용하고 있습니까? – Krishnabhadra

답변

30

여기 로이드

device_list.xml 블루 투스 프린터의 작동 perfectely 코드

<?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> 

기기 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

매우 감사합니다. 감사합니다. –

+1

당신은 환영합니다 –

+0

어떻게 문자 너비를 설정할 수 있습니까 ??/ –

0

방금 ​​전에 추가 //mBTSocket.close();

그럼 그냥 주석 처리했습니다!

+0

나는 위의 코드를 사용하고 그 첫 번째 시간에만 인쇄 얻을 같은 문제가 생겼어. 그리고 소켓 연결을 닫고 여전히 문제가 해결되지 .. 그래서 만약 내가 어떤 아이디어가있다 도와주세요. –

+0

@ Kingslayer이 주석을 제거하려면 ? – CoronaPintu

+0

@KinjalShah 만약 당신이 해결했으면 같은 문제를 얻었습니다. pls 도움 – CoronaPintu

관련 문제