Прочитать текущее имя 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 (леденец)

Большое спасибо.


person Aldridge1991    schedule 20.05.2016    source источник
comment
Возможно, разрешения во время выполнения? Какова ваша цель SDK?   -  person 1615903    schedule 20.05.2016


Ответы (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)

person pringi    schedule 12.05.2017
comment
Как получить подпись SIM-карты? Будет ли он у перевозчика? Можете ли вы указать мне дополнительную информацию о подписи SIM-карты? Я хочу узнать, что еще я могу сделать, если получу доступ к подписи SIM-карты.. спасибо - person Ram Ramesh; 13.02.2018
comment
Карта подписывается Перевозчиком. Он не предоставит его никому за пределами перевозчика, поскольку это подпись высокой степени защиты. - person pringi; 16.02.2018
comment
Спасибо. Я получил apk, подписанный оператором. Теперь я должен уметь читать, писать APN? К чему еще у меня есть доступ с подписанной картой? - person Ram Ramesh; 17.02.2018

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;
        }
    }
}
person Sohail Zahid    schedule 20.05.2016
comment
Я не могу понять, как это возможно. Даже как системное приложение и с привилегиями root? - person Aldridge1991; 20.05.2016
comment
вы can читали настройку APN в API ‹ 19 и cannot читали в большом или затем API › 18. что вы действительно не понимаете? - person Sohail Zahid; 20.05.2016
comment
Почему это происходит - person Aldridge1991; 20.05.2016
comment
@ Aldridge1991 Aldridge1991 Поскольку БД может содержать корпоративные пароли, мы должны защитить ее. Использование того же разрешения, что и запись в БД, поскольку чтение потенциально может быть столь же разрушительным, как и запись. Исходный ответ 2]" title="чтение apns в android 4 2%5d">stackoverflow.com/questions/13453640/read-apns-in-android-4-2] - person Sohail Zahid; 20.05.2016