Считать текущее имя APN из кода [root]
Мне нужно иметь возможность прочитать текущее имя APN. Мое приложение является системным приложением (оно находится в /system/app), и у меня есть root-доступ.
Я пытаюсь получить имя APN, но это невозможно, потому что мне всегда предлагают:
No permission to write APN settings
Я также добавил следующие разрешения в манифесте Android
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
TARGET SDK > 18 (леденец на палочке)
Большое спасибо.
2 ответа
В Android 5.1 введены привилегии оператора ( https://source.android.com/devices/tech/config/uicc).
Чтобы изменить APN, вы должны подписать свое приложение той же подписью на SIM-карте. Если вы сделаете это, то можно изменить APN. Вам не нужно
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/>
в манифесте Android.
Например, вы можете подписать свое приложение с помощью Android Studio ( https://developer.android.com/studio/publish/app-signing.html).
Не для использования сторонними приложениями. Вы не можете прочитать настройки APN в API > 18
,
Для API <= 18
public class APNHelper {
private Context context;
public APNHelper(final Context context) {
this.context = context;
}
@SuppressWarnings("unchecked")
public List<APN> getMMSApns() {
final Cursor apnCursor = this.context.getContentResolver()
.query(Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI,
"current"), null, null, null, null);
if (apnCursor == null) {
return Collections.EMPTY_LIST;
} else {
final List<APN> results = new ArrayList<APN>();
if (apnCursor.moveToFirst()) {
do {
final String type = apnCursor.getString(apnCursor
.getColumnIndex(Telephony.Carriers.TYPE));
if (!TextUtils.isEmpty(type)
&& (type.equalsIgnoreCase("*") || type
.equalsIgnoreCase("mms"))) {
final String mmsc = apnCursor.getString(apnCursor
.getColumnIndex(Telephony.Carriers.MMSC));
final String mmsProxy = apnCursor.getString(apnCursor
.getColumnIndex(Telephony.Carriers.MMSPROXY));
final String port = apnCursor.getString(apnCursor
.getColumnIndex(Telephony.Carriers.MMSPORT));
final APN apn = new APN();
apn.MMSCenterUrl = mmsc;
apn.MMSProxy = mmsProxy;
apn.MMSPort = port;
results.add(apn);
Toast.makeText(context,
mmsc + " " + mmsProxy + " " + port,
Toast.LENGTH_LONG).show();
}
} while (apnCursor.moveToNext());
}
apnCursor.close();
return results;
}
}
}