当前位置: 首页 > 知识库问答 >
问题:

在Android中以编程方式设置APN

宇文灿
2023-03-14

我在Android中以编程方式设置APN。当我运行代码时,我得到安全异常:android.permission.WRITE_APN_SETTINGS。如果我在清单中提到这个权限,我得到的错误就像这些权限只有SYSTEM APPS。你能帮我解决这个问题吗?参考链接

public int insertAPN(String name){      

    //Set the URIs and variables
    int id = -1;
    boolean existing = false;
    final Uri APN_TABLE_URI = Uri.parse("content://telephony/carriers");
    final Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");

    //Check if the specified APN is already in the APN table, if so skip the insertion                      
    Cursor parser = getContentResolver().query(APN_TABLE_URI, null, null, null, null);
    parser.moveToLast();            
    while (parser.isBeforeFirst() == false){
        int index = parser.getColumnIndex("name");
        String n = parser.getString(index);   
        if (n.equals(name)){
            existing = true;   
            Toast.makeText(getApplicationContext(), "APN already configured.",Toast.LENGTH_SHORT).show();
            break;
        }            
        parser.moveToPrevious();
    }       

    //if the entry doesn't already exist, insert it into the APN table      
    if (!existing){         

           //Initialize the Content Resolver and Content Provider
           ContentResolver resolver = this.getContentResolver();
           ContentValues values = new ContentValues();

           //Capture all the existing field values excluding name
           Cursor apu = getContentResolver().query(PREFERRED_APN_URI, null, null, null, null);
           apu.moveToFirst();                   
           int index;       

           index = apu.getColumnIndex("apn");
           String apn = apu.getString(index);               
           index = apu.getColumnIndex("type");
           String type = apu.getString(index);              
           index = apu.getColumnIndex("proxy");
           String proxy = apu.getString(index);             
           index = apu.getColumnIndex("port");
           String port = apu.getString(index);               
           index = apu.getColumnIndex("user");
           String user = apu.getString(index);              
           index = apu.getColumnIndex("password");
           String password = apu.getString(index);              
           index = apu.getColumnIndex("server");
           String server = apu.getString(index);                
           index = apu.getColumnIndex("mmsc");
           String mmsc = apu.getString(index);             
           index = apu.getColumnIndex("mmsproxy");
           String mmsproxy = apu.getString(index);              
           index = apu.getColumnIndex("mmsport");
           String mmsport = apu.getString(index);               
           index = apu.getColumnIndex("mcc");
           String mcc = apu.getString(index);               
           index = apu.getColumnIndex("mnc");
           String mnc = apu.getString(index);               
           index = apu.getColumnIndex("numeric");
           String numeric = apu.getString(index);

           //Assign them to the ContentValue object
           values.put("name", name); //the method parameter
           values.put("apn", apn);                 
           values.put("type", type);
           values.put("proxy", proxy);
           values.put("port", port);
           values.put("user", user);
           values.put("password", password);
           values.put("server", server);
           values.put("mmsc", mmsc);
           values.put("mmsproxy", mmsproxy);
           values.put("mmsport", mmsport);             
           values.put("mcc", mcc);
           values.put("mnc", mnc);
           values.put("numeric", numeric);             

           //Actual insertion into table
           Cursor c = null;
           try{
               Uri newRow = resolver.insert(APN_TABLE_URI, values);

               if(newRow != null){
                   c = resolver.query(newRow, null, null, null, null);
                    int idindex = c.getColumnIndex("_id");
                    c.moveToFirst();
                    id = c.getShort(idindex);                       
               }
           }
           catch(SQLException e){}
           if(c !=null ) c.close();          
    }

    return id;
}

//Takes the ID of the new record generated in InsertAPN and sets that particular record the default preferred APN configuration
public boolean setPreferredAPN(int id){

    //If the id is -1, that means the record was found in the APN table before insertion, thus, no action required
    if (id == -1){
        return false;
    }

    Uri.parse("content://telephony/carriers");
    final Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");

    boolean res = false;
    ContentResolver resolver = this.getContentResolver();
    ContentValues values = new ContentValues();

    values.put("apn_id", id); 
    try{
        resolver.update(PREFERRED_APN_URI, values, null, null);
        Cursor c = resolver.query(PREFERRED_APN_URI, new String[]{"name", "apn"}, "_id="+id, null, null);
        if(c != null){
            res = true;
            c.close();
        }
    }
    catch (SQLException e){}
     return res;
}

int identity = insertAPN("tmobile"); 
setPreferredAPN(identity);

共有3个答案

松阳泽
2023-03-14

这是从Android 4.2回归看到这https://stackoverflow.com/a/13454563/5146667

现在(API 23)我能读“apn”

习海
2023-03-14

试试这个

窗口-

从列表中找到受保护的权限,并将严重性设置为错误以外的东西(例如信息)。这样你的项目仍然可以编译。

来源:在清单中,权限仅授予系统应用程序

何辰沛
2023-03-14

在android Pie(Api 28)中,您可以通过DevicePolicyManager配置APN,但您需要按照addOverrideApn文档中的描述,将应用程序设置为DeviceOwner

如何为测试提供DeviceOwnerhttps://source.android.com/devices/tech/admin/testing-setup

在你的情况下,这可能不可行

 类似资料:
  • 问题内容: 有没有一种方法可以通过编程设置属性?似乎没有方法。 明确地说,我不是在谈论视图/窗口小部件样式!我在谈论以下内容: 问题答案: setTypeface是属性textStyle。 正如 Shankar V 添加的那样,要保留以前设置的字体属性,可以使用:

  • 如何以编程方式设置属性?

  • 问题内容: 我遇到以下问题:我实现了一个在一个案例中包含和的。在这种情况下,图像约为屏幕宽度的50%。所以我想居中。不幸的是,我发现居中的唯一方式是,使用上。 这是我的xml: 但是我需要以编程方式进行设置。有人知道我该如何实现这一目标或以其他方式知道吗?我在Google上找到的所有内容都不适用于此帖子。 谢谢! 问题答案: 做这样的事情: 更新: 另一种方法:

  • 问题内容: 我看到了一些示例代码,它们将相同的OnClick事件分配给Android中的所有按钮(即使它们执行的动作完全不同)。如何用Swift做 Android示例: 注意:我不想以编程方式创建按钮。 问题答案: 在iOS上,您没有设置监听器;你添加一个目标(物体)和行动(方法签名,在iOS的说法“选择”)将(这是一个子类): 在这种情况下,第一个参数是目标对象。该操作是一个选择器(方法签名),

  • 问题内容: 如何确保从hibernate.cfg.xml加载所有属性,然后以编程方式添加其他属性?我看到了以下代码片段,但它看起来像是全新的配置,而不是现有配置的补充。 问题答案: 您显示的代码段是您所需要的。只需使用您现有的配置,而不是创建一个新的配置即可。 如果不是您实例化配置(例如,spring),则需要扩展创建它的类。

  • 我正在编辑以使问题更简单,希望这有助于获得准确的答案。 假设我有以下形状: 如何从一个活动类中以编程方式设置颜色?