Считать текущее имя 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).

WRITE_APN_SETTINGS

Не для использования сторонними приложениями. Вы не можете прочитать настройки 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;
        }
    }
}
Другие вопросы по тегам