2014-07-14 2 views
0

블루투스 장치를 검색해야하는 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 
+0

수신자의 onReceive()가 호출되는지 확인 하시겠습니까? –

+0

@Arash : 예, 호출되지 않으면 해당 영역의 모든 블루투스 장치가 표시되지만 희망하는 이름 형식 (HXMxxxxxx, x-number)을 가진 장치 만 표시됩니다 –

+0

아마도 문제가 초기화되는 것입니다 귀하의 버튼 안에 귀하의 대화 상자를 클릭하십시오 dialog.2의 두 인스턴스를 instaniate 수 있습니다 그래서 귀하의 대화 상자를 초기화 oncreate(). 어쩌면 도움이됩니다. –

답변

0

시도 :이 실행되면,이 로그 캣에 인쇄되는 것입니다

public void find(View view) { 
    if (bluetoothadapt.isDiscovering()) { 
     // the button is pressed when it discovers, so cancel the discovery 
     bluetoothadapt.cancelDiscovery(); 
    } 

    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); 
    ////////////////////////// 
} 

업데이트
documentation에서 :
검색 프로세스는 일반적으로 블루투스 이름을 검색하기 위해 각각의 새로운 장치의 페이지를 스캔 한 다음 약 12 ​​초 조회 스캔을 포함한다.
장치 검색은 매우 중요합니다.

검색 루틴이 완료 될 때까지 기다려야하며이 프로세스의 속도를 높일 방법이 없다고 가정합니다.

+0

고마워요. 그것은 효과가 있었다. 이제 버튼을 누를 때마다 인쇄됩니다. 그러나 코드에 여전히 결함이 있다고 생각합니다. 때로는 발견 된 장치를 표시하는 데 너무 많은 시간이 걸리고 때로는 그렇지 않습니다. 나는 그 (것)들을 즉시 보여주고 싶다. 이 연기가 왜 발생했는지 아십니까? –