2017-12-09 1 views
0

내 작업은 내 앱에서 Bluetooth를 켜기 &으로 설정하고 페어링 된 장치를 검색하는 것입니다. 페어링 된 장치가 발견되면 해당 장치에 연결하십시오. 그렇지 않으면 근처에있는 사용 가능한 장치를 찾아 신호 강도와 함께 나열하십시오. N 초마다 신호 강도를 업데이트하십시오. 사용자가 특정 장치를 선택하면 연결이 설정되어야합니다.BroadcastReceiver의 onReceive 메서드가 절대 호출되지 않습니다.

package surendra.example.com.mybluetooth; 

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.content.SharedPreferences; 
import android.hardware.camera2.params.BlackLevelPattern; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.w3c.dom.Text; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Set; 

public class MainActivity extends AppCompatActivity { 

    protected static final int DISCOVERY_REQUEST = 1; 

    private BluetoothDevice device; 

    //Variable for text display 
    public TextView statusUpdate; 
    public TextView BTHostDetails; 
    public TextView BTDevicesAvailable; 

    //List of buttons 
    public Button turnONBT; 
    public Button turnOFFBT; 
    public Button scanBTDevices; 
    public Button seeRSSI; 
    public Button back; 

    ArrayAdapter<String> btArrayAdapter; 
    //BluetoothAdapter object that initializes the BT hardware on the device 
    private BluetoothAdapter mBluetoothAdapter; 

    //Broadcast the Bluetooth activities 
    BroadcastReceiver bluetoothState = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String prevStateExtra = BluetoothAdapter.EXTRA_PREVIOUS_STATE; 
      String stateExtra = BluetoothAdapter.EXTRA_STATE; 

      int state = intent.getIntExtra(stateExtra, -1); 
      int previousState = intent.getIntExtra(prevStateExtra, -1); 

      String toastText = ""; 

      switch (state) { 
       case(BluetoothAdapter.STATE_TURNING_ON) : { 
        //Already turned ON 
        toastText = "Turning ON Bluetooth"; 
        Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show(); 
        break; 
       } 
       case(BluetoothAdapter.STATE_ON): { 
        //Turned ON 
        toastText = "Bluetooth turned ON"; 
        Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show(); 
        setupUI(); 
        break; 
       } 
       case(BluetoothAdapter.STATE_TURNING_OFF) : { 
        //Already turned OFF 
        toastText = "Turning OFF Bluetooth"; 
        Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show(); 
        break; 
       } 
       case(BluetoothAdapter.STATE_OFF) : { 
        //Turned OFF 
        toastText = "Bluetooth turned OFF"; 
        Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show(); 
        setupUI(); 
        break; 
       } 
      } 
     } 
    }; 

    //Represents a remote BT device 
    private BluetoothDevice remoteDevice; 

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

     //Get default BT adapter 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

     setupUI(); 
    } //end onCreate method 

    //Method to setup UI 
    private void setupUI() { 
     //Get references of each button and text view from the UI 
     final TextView statusUpdate = (TextView) findViewById(R.id.statusUpdate); 
     final TextView BTHostDetails = (TextView) findViewById(R.id.BTHostDetails); 
     final Button turnONBT = (Button) findViewById(R.id.turnONBT); 
     final Button turnOFFBT = (Button) findViewById(R.id.turnOFFBT); 
     final Button scanBTDevices = (Button) findViewById(R.id.scanBTDevices); 
     final Button seeRSSI = (Button) findViewById(R.id.seeRSSI); 
     final Button back = (Button) findViewById(R.id.back); 

     //Set visibilities of each button 
     turnOFFBT.setVisibility(View.GONE); 
     seeRSSI.setVisibility(View.GONE); 
     back.setVisibility(View.GONE); 
     scanBTDevices.setVisibility(View.GONE); 
     BTHostDetails.setVisibility(View.GONE); 

     //Check if the BT adapter is enabled 
     if(mBluetoothAdapter.isEnabled()) { 

      //If the BT adapter is enabled, get the name & address of the device 
      String devName = mBluetoothAdapter.getName(); 
      String devAddr = mBluetoothAdapter.getAddress(); 

      String statusText = devName + " : " + devAddr; 
      BTHostDetails.setText(statusText); 

      //set the visibilities of the buttons based upon BT status 
      BTHostDetails.setVisibility(View.VISIBLE); 
      turnONBT.setVisibility(View.GONE); 
      turnOFFBT.setVisibility(View.VISIBLE); 
      seeRSSI.setVisibility(View.GONE); 
      back.setVisibility(View.VISIBLE); 
      scanBTDevices.setVisibility(View.VISIBLE); 
     } else { 
      String tmp = "Bluetooth turned OFF"; 
      statusUpdate.setText(tmp); 
     } 

     // We should keep on listening to the TURN ON BLUETOOTH button. 
     // When the button turn on bluetooth is clicked, we should proceed to turn Bluetooth ON 
     turnONBT.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       //This makes our device discoverable 
       String beDiscoverable = BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE; 

       //Intent is the pop up that we see when requesting for permission to use 
       //certain interface on the device just like permission for location access etc. 
       //Using the intent filter, we can filter the devices whose permissions are changed 
       //when the user updates on the intent 
       IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 

       //This registers a broadcast receiver 
       registerReceiver(bluetoothState, filter); 

       //If the intent changes from non-discoverable to discoverable, with the filter 
       // DISCOVERY_REQUEST, then start the activity. 
       startActivityForResult(new Intent(beDiscoverable), DISCOVERY_REQUEST); 

       //Change the buttons views 
       BTHostDetails.setVisibility(View.VISIBLE); 
       turnOFFBT.setVisibility(View.VISIBLE); 
       turnONBT.setVisibility(View.INVISIBLE); 
       scanBTDevices.setVisibility(View.VISIBLE); 
       seeRSSI.setVisibility(View.VISIBLE); 
       back.setVisibility(View.INVISIBLE); 

       String tmp = "Bluetooth turned ON"; 
       statusUpdate.setText(tmp); 
      } 
     }); 

     //scan devices 
     scanBTDevices.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       //start discovery of new devices 
       mBluetoothAdapter.startDiscovery(); 

       //see if this device is in a list of paired available devices 
       Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
       //Toast.makeText(MainActivity.this, "Debug text 0", Toast.LENGTH_SHORT).show(); 
       if(pairedDevices.size() > 0) { 
        //This means that there are paired devices. 
        // Get the name & address of each device. 
        for(BluetoothDevice device : pairedDevices) { 
         String devName = device.getName(); 
         String devAddr = device.getAddress(); 
        } 

        List<String> s = new ArrayList<String>(); 
        for(BluetoothDevice bt : pairedDevices) { 
         s.add(bt.getName()); 
        } 
       } 
       BroadcastReceiver discoveryResult = new BroadcastReceiver() { 

        @Override 
        public void onReceive(Context context, Intent intent) { 
         String action = intent.getAction(); 

         if(BluetoothDevice.ACTION_FOUND.equals(action)) { 

          //BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
          device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
          short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE); 
          String devName = device.getName(); 
          String devAddr = device.getAddress(); 

          String tmp = devName + " : " + devAddr + " - " + rssi; 
          statusUpdate.setText(tmp); 
         } 
        } 
       }; 
      } 
     }); 

     //Setup a listener for turning of Bluetooth i.e., for TURN OFF BLUETOOTH button 
     turnOFFBT.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       //Change the buttons views 
       BTHostDetails.setVisibility(View.INVISIBLE); 
       turnOFFBT.setVisibility(View.INVISIBLE); 
       turnONBT.setVisibility(View.VISIBLE); 
       scanBTDevices.setVisibility(View.INVISIBLE); 
       seeRSSI.setVisibility(View.INVISIBLE); 
       back.setVisibility(View.INVISIBLE); 

       String tmp = "Bluetooth turned OFF"; 
       statusUpdate.setText(tmp); 

       mBluetoothAdapter.disable(); 
      } 
     }); 

     //Back button activity 
     back.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       setupUI(); 
      } 
     }); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(requestCode == DISCOVERY_REQUEST) { 
      String tmp = "Discovery is in progress"; 
      Toast.makeText(MainActivity.this, tmp , Toast.LENGTH_SHORT).show(); 
      setupUI(); 
     } 
    } 
} 

디버깅시 BroadcastReceiver의 onReceive 메소드가 호출되지 않는다는 것을 발견했습니다. 그러나 Bluetooth가 활성화되어 있습니다. 내가 뭘 놓치고 있니?

추신 : 모든 BT 활동을 MainActivity 단독으로 제한하려고합니다.

+0

두 개의 'BroadcastReceivers'가 있습니다. 하나의'registerReceiver()'호출 만 있습니다. – CommonsWare

+0

자바 나 안드로이드 중 첫 번째 코드이기 때문에 이것이 내 스펙을 관리하는 방법을 말해 줄 수 있다면 정말 도움이 될 것입니다. 고맙습니다! –

답변

2

디버깅시 BroadcastReceiver의 onReceive 메서드가 호출되지 않는다는 것을 발견했습니다. 그러나 Bluetooth가 활성화되어 있습니다.

첫 번째로 블루투스가 사용 설정되어 있고 블루투스 상태가 변경되지 않는 경우 브로드 캐스트를 수신 할 필요가 없습니다. "로컬 Bluetooth 어댑터의 상태가 변경되었습니다"라는 메시지가 BluetoothAdapter.ACTION_STATE_CHANGEDis documented 브로드 캐스트됩니다. 변경 사항은 방송이 없음을 의미합니다.

두 번째로 turnONBT을 클릭하면 bluetoothStateBroadcastReceiver으로 등록합니다. 따라서 이전에 상태가 변경되면 브로드 캐스트를받을 수 없습니다.

셋째, 잘못된 동작으로 bluetoothState을 등록하십시오. BluetoothDevice.ACTION_FOUND에 등록하십시오. 이 작업은 Bluetooth 검색에 대한 것이며, the documentation에 설명되어 있습니다. Bluetooth 상태의 변경 작업은 BluetoothAdapter.ACTION_STATE_CHANGED입니다. 귀하의 discoveryResult은 발견을위한 것으로 보이며 결코 그 수신기를 등록하지 않는 것 같습니다. 이 같은

내가 자바 또는 안드로이드

에 하나하고 있어요 최초의 코드 나는 것 블루투스 자바 또는 안드로이드에서 첫 번째 프로젝트가 될 포함하는 것을 권장하지.

+0

언급 한 두 번째 사항에 대한 해결책을 말씀해 주시겠습니까? –

+0

@surendranath : 'onCreate()'와 같은 다른 지점에 등록하십시오. – CommonsWare

관련 문제