Reputation: 800
I am setting up an APN programmatically in Android. when I run the code I am getting Security Exception :android.permission.WRITE_APN_SETTINGS
. if I mentioned this permission in manifest, I'm getting error like these permission only SYSTEM APPS.
can you please help me for sort out this problem.
reference link
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);
Upvotes: 4
Views: 8070
Reputation: 177
From android Pie (Api 28) You can configure APNs through DevicePolicyManager, but you need to provision your app as DeviceOwner as described in the documentation of addOverrideApn
How to provision DeviceOwner for test https://source.android.com/devices/tech/admin/testing-setup
It may not be viable in your case
Upvotes: 1
Reputation: 1
This is a regression from Android 4.2 see this https://stackoverflow.com/a/13454563/5146667
At this time (API 23) i'm able to read "apn" & "type" attributes without permission, may some others, but not "current" which i badly need !
Upvotes: 0
Reputation: 1873
try this
Window -> Preferences -> Android -> Lint Error Checking.
Find ProtectedPermission from the list and set the severity to something other than error(info for example). This way your project will still compile.
Source : Permission is only granted to system app, in Manifest
Upvotes: 0