I want to receive a String from the Bluetooth server which is pc I have a java code for it but when ever I run my Android client Activity it shows me this exception
Activity com.waseem.mobileclient.bluetoot_app.MainActivity has leaked IntentReceiver com.waseem.mobileclient.bluetoot_app.MainActivity$1@410480f0 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.waseem.mobileclient.bluetoot_app.MainActivity has leaked IntentReceiver com.waseem.mobileclient.bluetoot_app.MainActivity$1@410480f0 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:792)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:593)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1111)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1098)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1092)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:365)
at com.waseem.mobileclient.bluetoot_app.MainActivity.onCreate(MainActivity.java:68)
at android.app.Activity.performCreate(Activity.java:5008)
I am unregistering in onPause() why I am getting this exception please help me out It has stuck me for a long time.
here is the client code
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (myBluetoothAdapter == null) {
Log.e(TAG, "No Bluetooth Adapter available. Exiting...");
this.finish();
}
IntentFilter intent_filter=new IntentFilter(MESSAGE_RECEIVED_INTENT);
broad_receiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MESSAGE_RECEIVED_INTENT)) {
showInformation(intent.getExtras().getString("Message"), 5000);
getVibrator().vibrate(500);
}
else {
showInformation("Message unable to receive", 5000);
getVibrator().vibrate(500);
}
}
};
this.registerReceiver(broad_receiver,intent_filter);
Button start_server = (Button)findViewById(R.id.button_start);
start_server.setOnClickListener(this);
Button stop_server = (Button)findViewById(R.id.button_stop);
stop_server.setOnClickListener(this);
}
@Override
protected void onPause() {
this.unregisterReceiver(this.broad_receiver);
super.onPause();
server.cancel();
restoreBTDeviceName();
}
@Override
public void onClick(View v) {
Button btn = (Button) v;
if (btn.getId() == R.id.button_start) {
if (!myBluetoothAdapter.getName().startsWith(PREFIX))
myBluetoothAdapter.setName(PREFIX );
if (myBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
requestBTDiscoverable();
server = new AcceptThread();
server.start();
btn.setEnabled(false);
((Button) this.findViewById(R.id.button_stop)).setEnabled(true);
}
} else if (btn.getId() == R.id.button_stop) {
server.cancel();
btn.setEnabled(false);
((Button) this.findViewById(R.id.button_start)).setEnabled(true);
restoreBTDeviceName();
}
}
/**
* Launches Discoverable Bluetooth Intent.
*/
public void requestBTDiscoverable() {
Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivityForResult(i, REQUEST);
int result = 0;
this.onActivityResult(REQUEST, result, i);
Log.i(TAG, "Bluetooth discoverability enabled");
}
/**
* Obtains the Vibrator service.
*
* @return Vibrator Object.
*/
private Vibrator getVibrator() {
return (Vibrator) getSystemService(VIBRATOR_SERVICE);
}
/**
* Removes the prefix from the device name if the prefix is present.
*/
private void restoreBTDeviceName() {
if (myBluetoothAdapter.getName().startsWith(PREFIX))
myBluetoothAdapter.setName(myBluetoothAdapter.getName().substring(PREFIX.length()));
}
/**
* Shows a information dialog.
*
* @param message String resource used to define the message.
* @param duration Dialog's TTL.
*/
private void showInformation(String message, long duration) {
final Dialog mDialog = new Dialog(this);
TextView txt = new TextView(this);
txt.setText(message);
mDialog.setContentView(txt);
mDialog.setTitle("Information");
mDialog.show();
(new Handler()).postDelayed(new Runnable() {
public void run() {
mDialog.dismiss();
}
},duration); // Close dialog after delay
}
/**
* ************************************* AcceptThread *************************************
*/
class AcceptThread extends Thread {
/**
* Tag that will appear in the log.
*/
private final String ACCEPT_TAG = AcceptThread.class.getName();
/**
* The bluetooth server socket.
*/
private final BluetoothServerSocket mServerSocket;
public AcceptThread() {
BluetoothServerSocket tmp = null;
try {
tmp = myBluetoothAdapter.listenUsingRfcommWithServiceRecord(ACCEPT_TAG, UUID.fromString(defaultUUID));
} catch (IOException e) {
e.printStackTrace();
}
mServerSocket = tmp;
}
public void run() {
BluetoothSocket socket = null;
while (true) {
try {
Log.i(ACCEPT_TAG, "Listening for a connection...");
socket = mServerSocket.accept();
Log.i(ACCEPT_TAG, "Connected to " + socket.getRemoteDevice().getName());
} catch (IOException e) {
break;
}
// If a connection was accepted
if (socket != null) {
// Do work to manage the connection (in a separate thread)
try {
// Read the incoming string.
String buffer;
DataInputStream in = new DataInputStream(socket.getInputStream());
buffer = in.readUTF();
Intent i = new Intent(MESSAGE_RECEIVED_INTENT);
i.putExtra("Message", String.format("%sn From: %s", buffer, socket.getRemoteDevice().getName()));
getBaseContext().sendBroadcast(i);
} catch (IOException e) {
Log.e(ACCEPT_TAG, "Error obtaining InputStream from socket");
e.printStackTrace();
}
try {
mServerSocket.close();
} catch (IOException e) {
}
break;
}
}
}
/**
* Will cancel the listening socket, and cause the thread to finish
*/
public void cancel() {
try {
mServerSocket.close();
} catch (IOException e) {
}
}
}
The first line of LogCat says:
Are you missing a call to unregisterReceiver()?
It simply means that you need to check the API documentation of BroadcastReceiver for help, which says:
Note: If registering a receiver in your
Activity.onResume()implementation, you should unregister it inActivity.onPause(). (You won't receive intents when paused, and this will cut down on unnecessary system overhead). Do not unregister inActivity.onSaveInstanceState(), because this won't be called if the user moves back in the history stack.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With