我是在Android中以编程方式设置APN。当我运行代码时,我将获得Security Exception :android.permission.WRITE_APN_SETTINGS
。如果我在清单中提到了此权限,我会收到仅此这些权限的系统应用程序的错误。 您能帮我解决这个问题吗?参考链接
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);
来自Android Pie(API 28)您可以通过DevicePolicyManager配置APN,但是您需要按照Addoverrideapn文档中所述的设备库来配置APN
如何为测试提供设备旁边https://source.android.com/devices/tech/admin/testing-setup
在您的情况下,它可能不可行
尝试此
窗口 ->首选项 -> Android->棉绒错误检查。
从列表中查找 preectedpermission ,并将严重性设置为错误(例如信息)。这样您的项目仍将编译。
来源:仅授予System App的权限,在清单
这是Android 4.2的回归
此时(API 23)我能够阅读" APN"&未经许可的"类型"属性,可能是我急需的其他一些,但不是"当前"!