내가 ststus을 듣고 다음 사용 가능한 블루투스 장치와 페어링 할 API 레벨에 대한이 응용 프로그램을 설계하고
을 기다립니다은 나는 다음과 같은 방법에 의해 있음을했을 :
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if(btAdapter.isDiscovering()){
btAdapter.cancelDiscovery();
}
if(!listAdapter.getItem(i).contains("Paired")){
try {
BluetoothDevice selectedDevice = devices.get(i);
pairDevice(selectedDevice);
Intent intent=new Intent(getBaseContext(),ConnectedBtActivity.class);
intent.putExtra("MAC",selectedDevice.getAddress());
startActivity(intent);
}
catch (Exception e){}
}
else{
BluetoothDevice selectedDevice = devices.get(i);
Intent intent=new Intent(getBaseContext(),ConnectedBtActivity.class);
intent.putExtra("MAC",selectedDevice.getAddress());
startActivity(intent);
}
}
});
private void pairDevice(BluetoothDevice device) {
try {
Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
} catch (Exception e) {
Toast.makeText(getBaseContext(),"Exception: "+e.getMessage(),Toast.LENGTH_LONG).show();
}
}
여기서 listView는 사용 가능한 모든 장치를 포함하며 listAdapter는 사용 가능한 장치 이름을 포함하고있는 ArrayAdapter이며 쌍 장치의 경우 장치 이름과 함께 "(쌍으로 표시)"를 포함합니다. 기기가 이미 페어링되어 있고 페어링되지 않은 경우 페어링 프로세스를 시작하면 새 작업을 열려고하는 것을 분명히 알 수 있습니다. 이제 문제는 pairDevice()가 다중 스레드 프로세스이므로 페어링이 완료 될 때까지 기다리지 않는다는 것입니다. 새로운 활동이 열리면 페어링이 완료되었는지 여부를 청취하고 싶습니다. 또한 ACTION_BOND_STATE_CHANGED 방송에 등록하고, 본딩 공정의 결과를 확인하기 위해 추가 필드를 확인하실 수 있습니다
public class MyBluetoothScanActivity extends AppCompatActivity{
Button bt,bt_count;
ListView listView;
BluetoothAdapter btAdapter;
Set<BluetoothDevice> devicesArray;
public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
IntentFilter filter;
BroadcastReceiver receiver;
ArrayAdapter<String> listAdapter;
ArrayList<String> pairedDevices;
ArrayList<BluetoothDevice> devices;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_bluetooth_scan);
bt=(Button) findViewById(R.id.bT_scan2);
bt.setTransformationMethod(null);
bt_count=(Button) findViewById(R.id.bt_count);
bt_count.setTransformationMethod(null);
bt_count.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getBaseContext(),"Count: "+count,Toast.LENGTH_SHORT).show();
}
});
listView=(ListView) findViewById(R.id.listViewscan);
btAdapter = BluetoothAdapter.getDefaultAdapter();
filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
if(!btAdapter.isEnabled()){
turnOnBT();
}
init();
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
newScan();
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if(btAdapter.isDiscovering()){
btAdapter.cancelDiscovery();
}
if(!listAdapter.getItem(i).contains("Paired")){
try {
BluetoothDevice selectedDevice = devices.get(i);
pairDevice(selectedDevice);
Intent intent=new Intent(getBaseContext(),ConnectedBtActivity.class);
intent.putExtra("MAC",selectedDevice.getAddress());
startActivity(intent);
}
catch (Exception e){}
}
else{
BluetoothDevice selectedDevice = devices.get(i);
Intent intent=new Intent(getBaseContext(),ConnectedBtActivity.class);
intent.putExtra("MAC",selectedDevice.getAddress());
startActivity(intent);
}
}
});
}
private void newScan(){
btAdapter.cancelDiscovery();
Toast.makeText(getBaseContext(),"New Scan Start",Toast.LENGTH_SHORT).show();
listAdapter= new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1,0);
listView.setAdapter(listAdapter);
devices = new ArrayList<BluetoothDevice>();
btAdapter.startDiscovery();
}
private void getPairedDevices() {
devicesArray = btAdapter.getBondedDevices();
if(devicesArray.size()>0){
for(BluetoothDevice device:devicesArray){
pairedDevices.add(device.getName());
}
}
}
void turnOnBT(){
Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
}
void init(){
receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(getBaseContext(),"new br: "+action,Toast.LENGTH_LONG).show();
if(BluetoothDevice.ACTION_FOUND.equals(action)){
pairedDevices=new ArrayList<String>();
getPairedDevices();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(getBaseContext(),"Dev: "+device.getName(),Toast.LENGTH_LONG).show();
devices.add(device);
String s = "";
for(int a = 0; a < pairedDevices.size(); a++){
if(device.getName().equals(pairedDevices.get(a))){
//append
s = "(Paired)";
break;
}
}
listAdapter.add(device.getName()+" "+s+" "+"\n"+device.getAddress());
}
else if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){
if(btAdapter.getState() == btAdapter.STATE_OFF){
turnOnBT();
}
}
}
};
registerReceiver(receiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
registerReceiver(receiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(receiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(receiver, filter);
}
private void pairDevice(BluetoothDevice device) {
try {
Method m = device.getClass().getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
} catch (Exception e) {
Toast.makeText(getBaseContext(),"Exception: "+e.getMessage(),Toast.LENGTH_LONG).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
Toast.makeText(getBaseContext(),"Un registration",Toast.LENGTH_SHORT).show();
unregisterReceiver(receiver);
}
catch (Exception e){}
}
}
"ACTION_BOND_STATE_CHANGED"와 (과) 아무 것도 없습니다. –
공식 문서를 기반으로 API 레벨 5부터이 방송 조치가 있으므로 시도해보십시오. ** android.bluetooth.device.action.BOND_STATE_CHANGED **를 수신하는 BroadcastReceiver 구성 요소를 만드는 경우 작동합니다. ** – hertigaah