基本的には上記リンク先でいける。
調べてて気になったことを以下に。
・端末(OSバージョン?)によって、ソース内コメントのテーブル定義より拡張されていることがある。GalaxySは'nwkname'というカラムがあるが、Xperia Arcにはなかった。
・またpreferapnによるAPN変更時は、ContentValuesのkeyを'apn_id'とする必要がある。(値は'_id'カラムのものを使用する)指定した条件が一意のものでないと、APNは切り替わらない。
SharedPrefernceにapn_idという使用中のAPN情報を持っているようだ。
com.android.providers.telephony.TelephonyProviderを読むと、もう少し細かい仕組みがわかった。(早くandroid.git.kernel.org復旧しないかな)
指定できるURIは5つある。
content://telephony/carriers/
=>URL_TELEPHONY
content://telephony/carriers/current
=>URL_CURRENT
content://telephony/carriers/#
=>URL_ID
content://telephony/carriers/restore
=>URL_RESTOREAPN
content://telephony/carriers/preferapn
=>URL_PREFERAPN
それぞれ、SQLクエリによって動作が異なる。
URL_TELEPHONY
=>条件通りのCRUDを行う。
URL_CURRENT
=>query()はcurrent列がNULLでないAPNを取得。insertは特殊で、current IS NOT NULLの行をNULL化してnumericが同一の行のcurrent列を1にする。delete/updateは特徴なし。
URL_ID
=>uriのgetLastPathSegmentなどを条件としてCRUDを行うようだけど、動作よくわからず。このUriに対してLastPath叩くと"carriers"が返ってくるし。便利な使い方でもあるんだろか。
URL_RESTOREAPN
=>delete()でのみ使用可能。preferapnの設定や追加したAPNを初期化する。
URL_PREFERAPN
=>query()は現在設定されているAPNを返す。insert/updateはvaluesで指定したapn_idを設定して、APNを切り替える。deleteはpreferredAPNを初期化する。
以下は、調べる時に使ったソースコード。検証用にログ出すだけのメソッド多め。APNクラスはsetter/getterが無駄に長いので省略。
package com.test.apn; import java.util.LinkedList; import java.util.List; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.util.Log; import com.test.apn.entity.APN; public class ApnManager { private static final String TAG = ApnManager.class.getName(); private static final Uri APN_TABLE_URI = Uri.parse("content://telephony/carriers/"); private static final Uri APN_PREFERRED_URI = Uri.parse("content://telephony/carriers/preferapn"); private static final Uri APN_CURRENT_URI = Uri.parse("content://telephony/carriers/current"); private static final Uri APN_ID_URI = Uri.parse("content://telephony/carriers/#"); private static final Uri APN_RESTORE_URI = Uri.parse("content://telephony/carriers/restore"); private Context mContext; public ApnManager(Context context) { mContext = context; } public List<APN> getApnList() { ContentResolver resolver = mContext.getContentResolver(); Cursor c = resolver.query(APN_TABLE_URI, null, null, null, null); printAllData(c); c.moveToFirst(); List<APN> apns = new LinkedList<APN>(); while (! c.isAfterLast()) { apns.add(createAPNEntity(c)); c.moveToNext(); } c.close(); return apns; } public APN getCurrentPreferredApn() { ContentResolver resolver = mContext.getContentResolver(); Cursor c = resolver.query(APN_PREFERRED_URI, null, null, null, null); printAllData(c); if (! c.moveToFirst()) { return null; } APN apn = createAPNEntity(c); c.close(); return apn; } public void restoreApn() { ContentResolver cr = mContext.getContentResolver(); int restoreCount = cr.delete(APN_RESTORE_URI, null, null); Log.d(TAG, "restore = " + restoreCount); } public APN getApn(long id) { ContentResolver resolver = mContext.getContentResolver(); Cursor c = resolver.query(APN_TABLE_URI, null, "_id="+id, null, null); if (! c.moveToFirst()) { return null; } APN apn = createAPNEntity(c); c.close(); return apn; } public void setDefaultApn(long id) { ContentResolver cr = mContext.getContentResolver(); ContentValues values = new ContentValues(); values.put("apn_id", id); int updateCount = cr.update(APN_PREFERRED_URI, values, null, null); Log.d(TAG, "update = " + updateCount); } public void getCurrentApn() { ContentResolver resolver = mContext.getContentResolver(); Cursor c = resolver.query(APN_CURRENT_URI, null, null, null, null); Log.d(TAG, "current => "); printAllData(c); c.moveToFirst(); List<APN> apns = new LinkedList<APN>(); while (! c.isAfterLast()) { apns.add(createAPNEntity(c)); c.moveToNext(); } c.close(); return; } public void getApnId() { ContentResolver resolver = mContext.getContentResolver(); Cursor c = resolver.query(APN_ID_URI, null, null, null, null); printAllData(c); c.moveToFirst(); List<APN> apns = new LinkedList<APN>(); while (! c.isAfterLast()) { apns.add(createAPNEntity(c)); c.moveToNext(); } c.close(); } private APN createAPNEntity(Cursor c) { APN apn = new APN(); apn.setId(c.getInt(c.getColumnIndex("_id"))); apn.setName(c.getString(c.getColumnIndex("name"))); apn.setNumeric(c.getString(c.getColumnIndex("numeric"))); apn.setMcc(c.getString(c.getColumnIndex("mcc"))); apn.setMnc(c.getString(c.getColumnIndex("mnc"))); apn.setApn(c.getString(c.getColumnIndex("apn"))); apn.setUser(c.getString(c.getColumnIndex("user"))); apn.setServer(c.getString(c.getColumnIndex("server"))); apn.setPassword(c.getString(c.getColumnIndex("password"))); apn.setProxy(c.getString(c.getColumnIndex("proxy"))); apn.setPort(c.getString(c.getColumnIndex("port"))); apn.setMmsproxy(c.getString(c.getColumnIndex("mmsproxy"))); apn.setMmsport(c.getString(c.getColumnIndex("mmsport"))); apn.setMmsc(c.getString(c.getColumnIndex("mmsc"))); apn.setType(c.getString(c.getColumnIndex("type"))); apn.setCurrent(c.getInt(c.getColumnIndex("current"))); return apn; } private void printAllData(Cursor c) { if (! c.moveToFirst()) { return; } StringBuilder columnLog = new StringBuilder(); String[] columns = c.getColumnNames(); for (String column : columns) { columnLog.append(column); columnLog.append(","); } Log.d(TAG, columnLog.toString()); int colSize = c.getColumnCount(); while (! c.isAfterLast()) { StringBuilder values = new StringBuilder(); for (int i = 0; i < colSize; i++) { values.append(c.getString(i)); values.append(","); } Log.d(TAG, values.toString()); c.moveToNext(); } return; } }
0 件のコメント:
コメントを投稿