Java 如何获得icc认证?

Java 如何获得icc认证?,java,android,permissions,carrier,mobile-data,Java,Android,Permissions,Carrier,Mobile Data,我在telephonyManager类中发现了一些有趣的方法,比如关闭/打开移动数据,但当尝试使用它们时,它显然会引发安全异常(“无运营商特权”)。我用谷歌搜索了一下,但没有找到任何有用的解决办法。 由于这是运营商权限,我认为可以通过telephonyManager.getIccAuthentication(int-appType,int-authType,String-data)获得其权限,但我在输入参数方面遇到了问题,因为我无法确定应该传递什么才能使其工作 从文档到第一个参数将传递Telep

我在telephonyManager类中发现了一些有趣的方法,比如关闭/打开移动数据,但当尝试使用它们时,它显然会引发安全异常(“无运营商特权”)。我用谷歌搜索了一下,但没有找到任何有用的解决办法。 由于这是运营商权限,我认为可以通过
telephonyManager.getIccAuthentication(int-appType,int-authType,String-data)
获得其权限,但我在输入参数方面遇到了问题,因为我无法确定应该传递什么才能使其工作

从文档到第一个参数将传递
TelephonyManager.APPTYPE_SIM
或/和
TelephonyManager.APPTYPE_USIM
,这取决于它在使用
setDataEnabled(boolean)
时是否有重大意义。 如果我将
TelephonyManager.APPTYPE_SIM
作为第一个参数传递,我认为我应该将
TelephonyManager.AUTHTYPE_EAP_SIM
作为第二个参数传递(如果我错了请纠正我),反之亦然,当
TelephonyManager.APPTYPE_USIM
作为第一个so
TelephonyManager.AUTHTYPE_EAP_AKA
作为第二个参数时

还有第三个论点。必须将Base64编码为字符串。我在TelephonyProvider中找到以下代码行:
String base64Challenge=Base64.encodeToString(byteParam,Base64.NO_WRAP)其中byteParam是另一个方法的输入字节,该方法前面有数千个其他方法。如果我将“”作为第三个参数传递给getIccAuthentication方法,我会再次得到securityException(显然是错误的参数),但它会导致缺少
getIccSimChallengeResponse
。我担心它可能是无限循环的方法,但也许有人有任何想法或帮助我打破这一点

我的示例代码:

public class MainActivity extends AppCompatActivity {


private static final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button = (Button) findViewById(R.id.buttonPanel);
    button.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onClick(View view) {
            try {
                Process p = Runtime.getRuntime().exec("su");
                tel();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });

}

@RequiresApi(api = Build.VERSION_CODES.O)
private void tel(){
//        String base64Challenge = Base64.encodeToString(, 
Base64.NO_WRAP);
    TelephonyManager telephonyManager = (TelephonyManager)
            getSystemService(Context.TELEPHONY_SERVICE);
    boolean isCarrier = telephonyManager.hasCarrierPrivileges();
    String authentication = 
telephonyManager.getIccAuthentication(TelephonyManager.APPTYPE_SIM, 
TelephonyManager.AUTHTYPE_EAP_SIM, "");
    Log.v(TAG, authentication);
    if (isCarrier) {
        Log.v(TAG, "privs granted");
        telephonyManager.setDataEnabled(false);
    } else {
        Log.v(TAG, "no privilegies");
    }
}


}
从文档中:

需要权限:读取\u特权\u电话\u状态或呼叫 应用程序具有运营商权限(请参阅hasCarrierPrivileges()


其中第一个要求您作为特权系统应用程序安装(需要root或拥有系统证书)。第二个要求您的UID是承运人的。没有这些,任何参数组合都无法工作。

请添加一些代码块。好的,我有根设备,只需执行“su”命令即可请求根权限。但还有什么?该应用程序不需要root,它需要安装在系统私有应用程序目录中(卸载它,将apk推到正确位置,重新启动设备)。然后,只要请求READ_privilized_PHONE_STATE权限,它就可以调用该函数。但是,这可能还不够,因为第三个参数似乎是base64密码,可以通过设备中的物理SIM卡进行验证。好的,谢谢您的解释。所以我需要的就是生成一个由sim卡验证的base64密码是吗?此密码是常量还是为每个设备生成的密码不同?不确定。我猜可能是特定于设备或电信帐户的,SIM卡会使用安装时下载的数据进行验证。常数太容易被破解