Set APN programmatically on Android
Asked Answered
R

3

9

In my Android application I would like get all the available APNs and check if the client APN is available. I would like to run my app using this client APN.

Is there a way to achieve this on Android?

Ransack answered 11/10, 2010 at 6:17 Comment(0)
D
7

This might not answer your question directly. Have a look at this . Though keep in mind that this code is for reference only and should not be used in your app.

To get defined APN:

Cursor c = getContentResolver().query(Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"), null, null, null, null);

And then refer to Telephony.Carriers for relevant columns.

Discount answered 11/10, 2010 at 7:29 Comment(6)
Ya i tried using this in my app and it throws this error: ` java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.`Prosaism
add required permission (developer.android.com/reference/android/…) to the manifestDiscount
When i tried adding it to the manifest it said only Native apps can add this permission.Prosaism
So I cleaned the build after editing the AndroidManifest.xml file, so now it doesn't display any syntax errors. However, when it makes this query again it shows this error: java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.Prosaism
ahhh this is great https://mcmap.net/q/89503/-read-apns-in-android-4-2 it looks like this can't be done. What is the alternative for all those application which uses mobile data to perform operations(like sending MMS) and can not get to know what is the default APN setting present in the device?Prosaism
I guess i should note that I am testing this on a Nexus 4 which is running Android v4.2.2.Prosaism
R
5

If you want to read the APN for Android 4.2 and more they are a change to do. I tested it, and it works.

In Android 4.1 and above use this:

Cursor c = getContentResolver().query(Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"), null, null, null, null);

And for Android 4.2 and more use this code:

private static final String[] APN_PROJECTION = {
     Telephony.Carriers.TYPE,            // 0
     Telephony.Carriers.MMSC,            // 1
     Telephony.Carriers.MMSPROXY,        // 2
     Telephony.Carriers.MMSPORT          // 3
 };

And this line:

final Cursor apnCursor =SqliteWrapper.query(context, this.context.getContentResolver(), Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), APN_PROJECTION, null, null, null);

The SQLiteWrapperClass is hidden (I found this class on the Internet).

import android.database.sqlite.SqliteWrapper;
Rumor answered 19/9, 2013 at 11:4 Comment(2)
Hello vincent091, Carriers.CONTENT_URI?Molech
Class c = Class.forName("android.database.sqlite.SqliteWrapper"); results in c.name = null. Looks like this method doesn't work.Ludovico
P
3

You will need the permission:

<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />

The code:

 private void addApn(Intent intent) {
        final String apn = intent.getStringExtra(APN_EXTRA_APN);
        final String name = intent.getStringExtra(APN_EXTRA_NAME);
        final String type = intent.getStringExtra(APN_EXTRA_TYPE);
        final String proxy = intent.getStringExtra(APN_EXTRA_PROXY);
        final int mnc = intent.getIntExtra(APN_EXTRA_MNC, 6);
        final int mcc = intent.getIntExtra(APN_EXTRA_MCC, 724);
        final String user = intent.getStringExtra(APN_EXTRA_USER);
        final String password = intent.getStringExtra(APN_EXTRA_PASSWORD);
        final String server = intent.getStringExtra(APN_EXTRA_SERVER);

        final ContentResolver cr = mContext.getContentResolver();
        ContentValues values = new ContentValues();
        values.put(Telephony.Carriers.APN, apn);
        values.put(Telephony.Carriers.NAME, name);
        values.put(Telephony.Carriers.TYPE, type);
        values.put(Telephony.Carriers.PROXY, proxy);
        values.put(Telephony.Carriers.MNC, mnc);
        values.put(Telephony.Carriers.MCC, mcc);
        values.put(Telephony.Carriers.USER, user);
        values.put(Telephony.Carriers.PASSWORD, password);
        values.put(Telephony.Carriers.SERVER, server);
        cr.insert(Telephony.Carriers.CONTENT_URI, values);
    }
Protolanguage answered 29/5, 2017 at 17:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.