Skip to content

Commit 352ac58

Browse files
authored
Handle exception when registering too many receivers in Crashlytics. (#2504)
1 parent 03aa092 commit 352ac58

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/BatteryStateTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ public void testNullIntent() {
5858
assertEquals(1, state.getBatteryVelocity());
5959
}
6060

61+
public void testTooManyReceivers() {
62+
Context mockContext = mock(Context.class);
63+
when(mockContext.registerReceiver(isNull(), any()))
64+
.thenThrow(new IllegalStateException("Too many receivers"));
65+
66+
BatteryState state = BatteryState.get(mockContext);
67+
68+
assertNull(state.getBatteryLevel());
69+
assertFalse(state.isPowerConnected());
70+
assertEquals(1, state.getBatteryVelocity());
71+
}
72+
6173
public void testEmptyIntent() {
6274
final Context mockContext = mock(Context.class);
6375
when(mockContext.registerReceiver(isNull(), any())).thenReturn(new Intent());

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/BatteryState.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import android.content.Intent;
1919
import android.content.IntentFilter;
2020
import android.os.BatteryManager;
21+
import com.google.firebase.crashlytics.internal.Logger;
2122

2223
/** A utility class representing the state of the battery. */
2324
class BatteryState {
@@ -66,11 +67,16 @@ public static BatteryState get(Context context) {
6667
boolean powerConnected = false;
6768
Float level = null;
6869

69-
final IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
70-
final Intent batteryStatusIntent = context.registerReceiver(null, ifilter);
71-
if (batteryStatusIntent != null) {
72-
powerConnected = isPowerConnected(batteryStatusIntent);
73-
level = getLevel(batteryStatusIntent);
70+
try {
71+
final IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
72+
final Intent batteryStatusIntent = context.registerReceiver(/*receiver=*/ null, ifilter);
73+
if (batteryStatusIntent != null) {
74+
powerConnected = isPowerConnected(batteryStatusIntent);
75+
level = getLevel(batteryStatusIntent);
76+
}
77+
} catch (IllegalStateException ex) {
78+
// This happens on some devices when the app registers too many receivers.
79+
Logger.getLogger().e("An error occurred getting battery state.", ex);
7480
}
7581

7682
return new BatteryState(level, powerConnected);

0 commit comments

Comments
 (0)