블루투스 장치를 검색해야하는 Android 앱을 구현하려고했습니다 (장치 이름 조건이 있음). 검색 버튼을 누르면 검색이 진행되는 동안 진행 상태 대화 상자가 표시되어야합니다. 처음에는 진행 대화 상자가 없어도 응용 프로그램이 작동했지만 지금은 버튼을 누르면 가끔씩 실행됩니다. 대화 상자가 표시되고 발견 된 장치가 표시되지만 다른 시간에는 대화 상자가 사라지고 결과가 표시되지 않습니다. 결과는 그 이후에 오랜 시간 표시됩니다). 내 코드는 다음과 같습니다.블루투스 장치 검색을위한 안드로이드 진행 대화 상자
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ConnectionScreen extends ActionBarActivity {
//Declaration of components
private static final String TAG = "ConnectionScreen";
public static final String BROADCAST = "PACKAGE_NAME.android.action.broadcast";
private static final int REQUEST_ENABLE_BT = 1;
private Button buttonSearch;
private CheckBox checkBoxAutoConnect;
private ListView listOfDevices;
private TextView statusId;
private TextView statusConnection;
private BluetoothAdapter bluetoothadapt;
private Set<BluetoothDevice> pairedDevices;
private ArrayAdapter<String> deviceAdapter;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connection_screen);
linkViewToResources();
listOfDevices.setAdapter(deviceAdapter);
bluetoothadapt = BluetoothAdapter.getDefaultAdapter();
if (bluetoothadapt == null) {
statusConnection.setText("Not supported");
Toast.makeText(getApplicationContext(), "Your device does not support Bluetooth", Toast.LENGTH_LONG).show();
buttonSearch.setEnabled(false);
} else {
buttonSearch.setEnabled(true);
}
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(bReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
}
private void linkViewToResources() {
buttonSearch = (Button) findViewById(R.id.searchButton);
buttonSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
find(view);
}
});
checkBoxAutoConnect = (CheckBox) findViewById(R.id.checkBoxAutoconnect);
listOfDevices = (ListView) findViewById(R.id.listOfDevices);
deviceAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
}
final BroadcastReceiver bReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
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);
// add the name and the MAC address of the object to the arrayAdapter
// get paired devices
if (device.getName().startsWith("HXM") && device.getName().length() == 9) {
deviceAdapter.add(device.getName() + "\n" + device.getAddress());
//deviceAdapter.notifyDataSetChanged();
}
}
if(dialog != null && dialog.isShowing()){
dialog.dismiss();
}
}
};
public void find(View view) {
if (bluetoothadapt.isDiscovering()) {
// the button is pressed when it discovers, so cancel the discovery
bluetoothadapt.cancelDiscovery();
}
else {
dialog = new ProgressDialog(ConnectionScreen.this);
this.dialog.setMessage("Searching");
this.dialog.show();
deviceAdapter.clear();
bluetoothadapt.startDiscovery();
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
sendBroadcast(enableBtIntent);
//new ProgressTask().execute(null, null, null);
//////////////////////////
}
}
@Override
protected void onPause() {
super.onPause();
try {
if (bReceiver != null) {
unregisterReceiver(bReceiver);
}
} catch (IllegalArgumentException e) {
Log.e(TAG, e.getMessage(), e);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.connection_screen, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
아무도 어떻게 해결할 수 있습니까? 감사합니다. .
업데이트 : 검사 도중 문제가 발견 한
그리고 또 다른 문제는 검색 버튼입니다 : 내가 처음 그것을 누를 때, 그것을 실행,하지만 난 그것을 두 번 누를 때, 그것은 실행되지 않습니다, 등등. 실행되지 않으면 logcat에 아무 것도 표시되지 않습니다. (그냥 취소, 당신은 발견 시작할 때와는 코드가 루틴을 발견 다시 시작하지 않는 장치를 검색) 코드를 변경
07-14 10:34:58.466 22020-22020/com.yast D/ProgressBar﹕ setProgress = 0
07-14 10:34:58.466 22020-22020/com.yast D/ProgressBar﹕ setProgress = 0, fromUser = false
07-14 10:34:58.466 22020-22020/com.yast D/ProgressBar﹕ mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000
07-14 10:34:58.496 22020-22020/com.yast W/ResourceType﹕ Failure getting entry for 0x010802c9 (t=7 e=713) in package 0 (error -75)
07-14 10:34:59.527 22020-22020/com.yast E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
07-14 10:34:59.527 22020-22020/com.yast E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
07-14 10:34:59.777 22020-22020/com.yast E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
07-14 10:34:59.777 22020-22020/com.yast E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
수신자의 onReceive()가 호출되는지 확인 하시겠습니까? –
@Arash : 예, 호출되지 않으면 해당 영역의 모든 블루투스 장치가 표시되지만 희망하는 이름 형식 (HXMxxxxxx, x-number)을 가진 장치 만 표시됩니다 –
아마도 문제가 초기화되는 것입니다 귀하의 버튼 안에 귀하의 대화 상자를 클릭하십시오 dialog.2의 두 인스턴스를 instaniate 수 있습니다 그래서 귀하의 대화 상자를 초기화 oncreate(). 어쩌면 도움이됩니다. –