2014-01-12 1 views
2

온라인에서 발견 된 앱은 보내기 버튼을 클릭 할 때, 텍스트 상자에 내용을 입력 한 후, 프린터가 실행되고 인쇄 과정 중간에 멈추는 경우를 제외하고 완벽하게 작동합니다 그러나 충돌하지 않습니다. 나는 잘못된 UUID를 사용하고 있는지 궁금 할뿐입니다. 실제로 그것이 무엇 인지도 모릅니다. 이 클래스는 앱을 실행하는 데 필요한 유일한 클래스이고, 나머지는 세 가지 블루투스 권한을 가진 XML입니다.블루투스 프린터에서 인쇄 할 Android 앱

package com.example.bluetoothprinter; 

import android.app.Activity; 
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.view.View; 
import android.widget.TextView; 
import android.widget.EditText; 
import android.widget.Button; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Set; 
import java.util.UUID; 

public class MainActivity extends Activity { 

// will show the statuses 
TextView myLabel; 

// will enable user to enter any text to be printed 
EditText myTextbox; 

// android built in classes for bluetooth operations 
BluetoothAdapter mBluetoothAdapter; 
BluetoothSocket mmSocket; 
BluetoothDevice mmDevice; 

OutputStream mmOutputStream; 
InputStream mmInputStream; 
Thread workerThread; 

byte[] readBuffer; 
int readBufferPosition; 
int counter; 
volatile boolean stopWorker; 

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

    try { 

     // we are goin to have three buttons for specific functions 
     Button openButton = (Button) findViewById(R.id.open); 
     Button sendButton = (Button) findViewById(R.id.send); 
     Button closeButton = (Button) findViewById(R.id.close); 

     myLabel = (TextView) findViewById(R.id.label); 
     myTextbox = (EditText) findViewById(R.id.entry); 

     // open bluetooth connection 
     openButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       try { 
        findBT(); 
        openBT(); 
       } catch (IOException ex) { 
       } 
      } 
     }); 

     // send data typed by the user to be printed 
     sendButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       try { 
        sendData(); 
       } catch (IOException ex) { 
       } 
      } 
     }); 

     // close bluetooth connection 
     closeButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       try { 
        closeBT(); 
       } catch (IOException ex) { 
       } 
      } 
     }); 

    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/* 
* This will find a bluetooth printer device 
*/ 
void findBT() { 

    try { 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

     if (mBluetoothAdapter == null) { 
      myLabel.setText("No bluetooth adapter available"); 
     } 

     if (!mBluetoothAdapter.isEnabled()) { 
      Intent enableBluetooth = new Intent(
        BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBluetooth, 0); 
     } 

     Set<BluetoothDevice> pairedDevices = mBluetoothAdapter 
       .getBondedDevices(); 
     if (pairedDevices.size() > 0) { 
      for (BluetoothDevice device : pairedDevices) { 

       // OJL411MY29I911JH is the name of the bluetooth printer device shown after scan 
       if (device.getName().equals("OJL411MY29I911JH")) { 
        mmDevice = device; 
        break; 
       } 
      } 
     } 
     myLabel.setText("Bluetooth Device Found"); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/* 
* Tries to open a connection to the bluetooth printer device 
*/ 
void openBT() throws IOException { 
    try { 
     // Standard SerialPortService ID 
     UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 
     mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 
     mmSocket.connect(); 
     mmOutputStream = mmSocket.getOutputStream(); 
     mmInputStream = mmSocket.getInputStream(); 

     beginListenForData(); 

     myLabel.setText("Bluetooth Opened"); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/* 
* After opening a connection to bluetooth printer device, 
* we have to listen and check if a data were sent to be printed. 
*/ 
void beginListenForData() { 
    try { 
     final Handler handler = new Handler(); 

     // This is the ASCII code for a newline character 
     final byte delimiter = 10; 

     stopWorker = false; 
     readBufferPosition = 0; 
     readBuffer = new byte[1024]; 

     workerThread = new Thread(new Runnable() { 
      public void run() { 
       while (!Thread.currentThread().isInterrupted() 
         && !stopWorker) { 

        try { 

         int bytesAvailable = mmInputStream.available(); 
         if (bytesAvailable > 0) { 
          byte[] packetBytes = new byte[bytesAvailable]; 
          mmInputStream.read(packetBytes); 
          for (int i = 0; i < bytesAvailable; i++) { 
           byte b = packetBytes[i]; 
           if (b == delimiter) { 
            byte[] encodedBytes = new byte[readBufferPosition]; 
            System.arraycopy(readBuffer, 0, 
              encodedBytes, 0, 
              encodedBytes.length); 
            final String data = new String(
              encodedBytes, "US-ASCII"); 
            readBufferPosition = 0; 

            handler.post(new Runnable() { 
             public void run() { 
              myLabel.setText(data); 
             } 
            }); 
           } else { 
            readBuffer[readBufferPosition++] = b; 
           } 
          } 
         } 

        } catch (IOException ex) { 
         stopWorker = true; 
        } 

       } 
      } 
     }); 

     workerThread.start(); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/* 
* This will send data to be printed by the bluetooth printer 
*/ 
void sendData() throws IOException { 
    try { 

     // the text typed by the user 
     String msg = myTextbox.getText().toString(); 
     msg += "\n"; 

     mmOutputStream.write(msg.getBytes()); 

     // tell the user data were sent 
     myLabel.setText("Data Sent"); 

    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/* 
* Close the connection to bluetooth printer. 
*/ 
void closeBT() throws IOException { 
    try { 
     stopWorker = true; 
     mmOutputStream.close(); 
     mmInputStream.close(); 
     mmSocket.close(); 
     myLabel.setText("Bluetooth Closed"); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 
+2

소스 코드는이 단계의 가이드로 제공됩니다. https://www.codeofaninja.com/2013/03/android-bluetooth-tutorial.html – Emkey

답변

2

sendData 함수의 끝에서 closeBT 함수를 실행하기위한 코드가 추가되었습니다. 당신이 연결을 닫지 않으면, 나는 그것이 보내는 과정에 걸려 있다고 생각합니다.

void sendData() throws IOException { 
try { 

    // the text typed by the user 
    String msg = myTextbox.getText().toString(); 
    msg += "\n"; 

    mmOutputStream.write(msg.getBytes()); 

    // tell the user data were sent 
    myLabel.setText("Data Sent"); 

} catch (NullPointerException e) { 
    e.printStackTrace(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
}