【问题标题】:Set APN programmatically on Android在 Android 上以编程方式设置 APN
【发布时间】:2017-05-30 01:37:12
【问题描述】:

在我的 Android 应用程序中,我想获取所有可用的 APN 并检查客户端 APN 是否可用。我想使用这个客户端 APN 运行我的应用程序。

有没有办法在 Android 上实现这一点?

【问题讨论】:

    标签: android


    【解决方案1】:

    这可能无法直接回答您的问题。看看this。但请记住,此代码仅供参考,不应在您的应用中使用。

    要获得定义的 APN:

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

    然后参考Telephony.Carriers相关栏目。

    【讨论】:

    • 是的,我尝试在我的应用程序中使用它并抛出此错误:`java.lang.SecurityException:没有写入 APN 设置的权限:用户 10099 和当前进程都没有 android.permission.WRITE_APN_SETTINGS。`
    • 向清单添加所需的权限 (developer.android.com/reference/android/…)
    • 当我尝试将其添加到清单时,它说只有本机应用程序可以添加此权限。
    • 所以我在编辑 AndroidManifest.xml 文件后清理了构建,所以现在它不会显示任何语法错误。但是,当它再次进行此查询时,会显示此错误:java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.
    • 啊这太棒了stackoverflow.com/questions/13453640/read-apns-in-android-4-2 看起来这无法完成。对于所有使用移动数据执行操作(如发送彩信)并且无法了解设备中存在的默认 APN 设置的应用程序,有什么替代方案?
    【解决方案2】:

    如果您想阅读适用于 Android 4.2 及更多版本的 APN,则需要进行更改。我测试了它,它可以工作。

    在 Android 4.1 及更高版本中使用:

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

    对于 Android 4.2 及更高版本,请使用以下代码:

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

    还有这一行:

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

    SQLiteWrapperClass 是隐藏的(我在网上找到了这个类)。

    import android.database.sqlite.SqliteWrapper;
    

    【讨论】:

    • 你好 vincent091,Carriers.CONTENT_URI?
    • 类 c = Class.forName("android.database.sqlite.SqliteWrapper");结果 c.name = null。这个方法好像不行。
    【解决方案3】:

    您将需要许可:

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

    代码:

     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);
        }
    

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多