在here发布的更改之后,getNetworkType方法从Android和更高版本开始就被弃用了。
当尝试在R编译的应用程序中使用此方法时,会导致抛出以下异常:
java.lang.SecurityException: getDataNetworkTypeForSubscriber: uid 10225 does not have android.permission.READ_PHONE_STATE.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2285)
at android.os.Parcel.createException(Parcel.java:2269)
at android.os.Parcel.readException(Parcel.java:2252)
at android.os.Parcel.readException(Parcel.java:2194)
at com.android.internal.telephony.ITelephony$Stub$Proxy.getNetworkTypeForSubscriber(ITelephony.java:7565)
at android.telephony.TelephonyManager.getNetworkType(TelephonyManager.java:2964)
at android.telephony.TelephonyManager.getNetworkType(TelephonyManager.java:2928)
at com.ironsource.environment.ConnectivityService.getCellularNetworkType(ConnectivityService.java:197)
at com.ironsource.sdk.service.DeviceData.updateWithConnectionInfo(DeviceData.java:98)
at com.ironsource.sdk.service.DeviceData.fetchMutableData(DeviceData.java:54)
at com.ironsource.sdk.service.TokenService.collectDataFromDevice(TokenService.java:120)
at com.ironsource.sdk.service.TokenService.getRawToken(TokenService.java:177)
at com.ironsource.sdk.service.TokenService.getToken(TokenService.java:166)
at com.ironsource.sdk.IronSourceNetwork.getToken(IronSourceNetwork.java:183)这很好,根据文档,这是意料之中的。如果我将应用程序编译到Android R之前的任何版本,则不会显示异常。
此异常表示我需要请求android.permission.READ_PHONE_STATE权限。
我想知道是否有一种方法可以使用任何其他不需要此权限的API来获取网络类型(因为此权限级别是危险的,我不希望向用户索要它)。
发布于 2021-02-04 13:22:35
获取READ_PHONE_STATE忽略getDataNetworkTypeForSubscriber崩溃的运行时权限
@Override
protected void onStart() {
super.onStart();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
int res = checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE);
if (res != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{android.Manifest.permission.READ_PHONE_STATE}, 123);
}
}
}
private final static int REQUEST_CODE_ASK_PERMISSIONS = 1002;
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(), "READ_PHONE_STATE Denied", Toast.LENGTH_SHORT)
.show();
} else {
}
stepAfterSplash();
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}发布于 2020-07-12 15:50:20
你仍然可以使用getDataNetworkType();这个方法不一定需要READ_PHONE_STATE,就像他的文档中所说的那样,但是“调用的应用程序具有运营商特权”就足够了。
https://developer.android.com/reference/android/telephony/TelephonyManager#getDataNetworkType()
据我所知,获得这些特权可能很棘手/真的很难,你可以考虑获得运营商特权并使用这种方法,这也是getNetworkType()的建议替代方法。
发布于 2020-11-01 21:58:20
通过这种方式,该方法在您的活动中必然需要READ_PHONE_STATE,而不仅仅是清单>>>
// Check if the READ_PHONE_STATE permission is already available.
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_PHONE_STATE)) {
//here >> use getNetworkType() method
// like this example
mStationInfo.set_networkType(mTelephonyManager.getNetworkType());
}
else {}https://stackoverflow.com/questions/62692649
复制相似问题