Commit 0a74e36f by tonihei Committed by Oliver Woodman

Gracefully handle revoked ACCESS_NETWORK_STATE permission.

This permission has normal access right and can't be revoked by the user.
However, an app can choose to revoke it when using ExoPlayer, e.g. if
no network is required and the app doesn't want to list this permission.

Support this use case by gracefully catching the exception in the relevant
places.

Issue:#6019
PiperOrigin-RevId: 253759332
parent af5eb5e5
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
renderer error. renderer error.
* Add support for auto-detecting UDP streams in `DefaultDataSource` * Add support for auto-detecting UDP streams in `DefaultDataSource`
([#6036](https://github.com/google/ExoPlayer/pull/6036)). ([#6036](https://github.com/google/ExoPlayer/pull/6036)).
* Gracefully handle revoked `ACCESS_NETWORK_STATE` permission
([#6019](https://github.com/google/ExoPlayer/issues/6019)).
### 2.10.2 ### ### 2.10.2 ###
......
...@@ -28,6 +28,7 @@ import android.os.Parcelable; ...@@ -28,6 +28,7 @@ import android.os.Parcelable;
import android.os.PowerManager; import android.os.PowerManager;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
...@@ -129,7 +130,7 @@ public final class Requirements implements Parcelable { ...@@ -129,7 +130,7 @@ public final class Requirements implements Parcelable {
ConnectivityManager connectivityManager = ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); NetworkInfo networkInfo = Assertions.checkNotNull(connectivityManager).getActiveNetworkInfo();
if (networkInfo == null if (networkInfo == null
|| !networkInfo.isConnected() || !networkInfo.isConnected()
|| !isInternetConnectivityValidated(connectivityManager)) { || !isInternetConnectivityValidated(connectivityManager)) {
......
...@@ -128,7 +128,8 @@ public final class RequirementsWatcher { ...@@ -128,7 +128,8 @@ public final class RequirementsWatcher {
@TargetApi(23) @TargetApi(23)
private void registerNetworkCallbackV23() { private void registerNetworkCallbackV23() {
ConnectivityManager connectivityManager = ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); Assertions.checkNotNull(
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkRequest request = NetworkRequest request =
new NetworkRequest.Builder() new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
......
...@@ -1728,7 +1728,12 @@ public final class Util { ...@@ -1728,7 +1728,12 @@ public final class Util {
if (connectivityManager == null) { if (connectivityManager == null) {
return C.NETWORK_TYPE_UNKNOWN; return C.NETWORK_TYPE_UNKNOWN;
} }
networkInfo = connectivityManager.getActiveNetworkInfo(); try {
networkInfo = connectivityManager.getActiveNetworkInfo();
} catch (SecurityException e) {
// Expected if permission was revoked.
return C.NETWORK_TYPE_UNKNOWN;
}
if (networkInfo == null || !networkInfo.isConnected()) { if (networkInfo == null || !networkInfo.isConnected()) {
return C.NETWORK_TYPE_OFFLINE; return C.NETWORK_TYPE_OFFLINE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment