17

こちらに投稿された変更に従って、getNetworkType メソッドは Android R 以降で非推奨になりました。

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 を使用してネットワーク タイプを取得する方法があるかどうかを知りたいと思いました (この許可のレベルは危険であり、ユーザーに要求したくないため)。

4

5 に答える 5

2

getDataNetworkTypeForSubscriberのクラッシュを無視するために、READ_PHONE_STATE のランタイム許可を取得します

 @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);
        }
    }
于 2021-02-04T05:22:34.913 に答える
0

私の友人はあなたと同じ問題を抱えていますが、これまでのところ一時的な修正があり、30ではなくcompileSdkVersion 29とtargetSdkVersion 29および私のbuildToolsVersion 28.0.3を使用しており、アプリは正常にロードされています。

この問題は私がサードパーティのライブラリに起因するため、エラーを修正するまで私だけで修正することはできませんが、この一時的な解決策で今のところかなりうまくいっていると思います.

于 2020-07-07T01:00:24.683 に答える