[英]The method onReceive in BroadcastReceiver is never called
我的任務是從應用程序打開和關閉藍牙,然后搜索任何已配對的設備。 如果找到任何配對的設備,請連接到該設備; 否則,發現附近的可用設備並列出它們以及其信號強度; 每N秒更新一次這些信號強度。 當用戶選擇特定設備時,應建立連接。
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方法。 但是,啟用了藍牙。 我想念什么?
PS:我想將所有BT活動限制在MainActivity中。
在調試時,我發現從不調用BroadcastReceiver的onReceive方法。 但是,啟用了藍牙。
首先,如果啟用了藍牙,並且沒有任何改變藍牙的狀態,那么我不會收到任何廣播。 該BluetoothAdapter.ACTION_STATE_CHANGED
廣播被記錄發送時“本地藍牙適配器的狀態已經改變了。” 沒有變化就意味着沒有廣播。
其次,僅當用戶單擊turnONBT
,才將bluetoothState
注冊為BroadcastReceiver
。 因此,如果在此之前有狀態更改,您將不會收到廣播。
第三,您為錯誤的操作注冊了bluetoothState
。 您正在為BluetoothDevice.ACTION_FOUND
注冊它。 該操作用於發現藍牙,如文檔中所述 。 更改藍牙狀態的操作為BluetoothAdapter.ACTION_STATE_CHANGED
。 您的discoveryResult
似乎是為了發現,您似乎從未注冊過該接收者。
因為這是我用Java或Android執行的第一個代碼
我不建議將涉及藍牙的任何內容作為Java或Android中的第一個項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.