首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得icc认证?

如何获得icc认证?
EN

Stack Overflow用户
提问于 2018-10-02 20:04:22
回答 1查看 1.1K关注 0票数 0

我在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作为第一个参数,TelephonyManager.AUTHTYPE_EAP_AKA作为第二个参数时。

然后是第三个论点。必须对字符串进行编码Base64。我在TelephonyProvider中找到了这一行代码:String base64Challenge = Base64.encodeToString(byteParam, Base64.NO_WRAP);,其中byteParam是来自另一个方法的输入字节,该方法是其他数千种方法的前面。如果我将"“作为第三个参数传递给getIccAuthentication方法,我将再次获得securityException (显然是错误的param),但它使我缺乏getIccSimChallengeResponse。我害怕它可能是无限循环的方法,但也许有人有任何想法或帮助我突破这一点?

我的示例代码:

代码语言:javascript
复制
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");
    }
}


}
EN

回答 1

Stack Overflow用户

发布于 2018-10-02 20:13:37

从医生那里:

需要权限: READ_PRIVILEGED_PHONE_STATE或调用应用程序具有承载权限(请参阅hasCarrierPrivileges())。

第一个要求您安装为特权系统应用程序(需要root或拥有系统证书)。第二种要求你的UID是载波的,没有它,任何参数组合都不能工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52615613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档