2011-10-23 42 views
3

有人知道是否有一種程序化的方式在設備上使用特定的APN,而不是默認設備?Android APN執法

謝謝。

回答

10

您可以使用uri content://telephony/carriers/preferapn以編程方式查詢和設置首選APN。要設置新的首選APN,您必須傳入現有APN條目的數據庫ID。 (:setPreferredApn(context, "Giffgaff");如)

public static final Uri APN_TABLE_URI = Uri.parse("content://telephony/carriers"); 
public static final Uri APN_PREFER_URI = Uri.parse("content://telephony/carriers/preferapn"); 

public static boolean setPreferredApn(Context context, String name) { 
    boolean changed = false; 
    String columns[] = new String[] { Carriers._ID, Carriers.NAME }; 
    String where = "name = ?"; 
    String wargs[] = new String[] {name}; 
    String sortOrder = null; 
    Cursor cur = context.getContentResolver().query(APN_TABLE_URI, columns, where, wargs, sortOrder); 
    if (cur != null) { 
     if (cur.moveToFirst()) { 
      ContentValues values = new ContentValues(1); 
      values.put("apn_id", cur.getLong(0)); 
      if (context.getContentResolver().update(APN_PREFER_URI, values, null, null) == 1) 
       changed = true; 
     } 
     cur.close(); 
    } 
    return changed; 
} 

我想我應該補充一點,你需要WRITE_APN_SETTINGS許可,並需要進口android.provider.Telephony和Android,如果你在APN的顯示名稱通過下面的函數可以做到這一點。 provider.Telephony.Carriers

更新4.0+

該工廠成爲了Android 4.0(ICS)的無法釋放。啓用WRITE_APN_SETTINGS權限不會允許您再設置APN。有關相關鏈接,請參閱this question。在API page它現在明確地聲明此權限不是爲了外部使用,並且在內部執行。

+0

感謝您的解決方案。這是否意味着在運行此代碼後,設備上的所有應用程序都將使用特定的APN? – Paz

+0

是的。這將設置設備首選APN。 – patthoyts

+0

感謝您的支持!你製作了哪個giffgaff應用程序? –

-1

我不認爲有一種方法,即使有一種方法,運營商可以用軟件更新將其清除。此外,對於美國的一些運營商,例如AT & T,使用特定的APN可提供特定的功能,例如獲取該用戶的用戶號碼(其唯一的ID,而不是電話號碼)。因此,強制執行此更改可能不是一個好主意,因爲它會影響手機上安裝的衆多其他應用程序。