㈠ android怎麼實現自動接聽和掛斷電話功能
android 實現來電自動接聽和自動掛斷的方法:
第一步:准備應用環境需要的系統包和aidl文件。
(1)在應用中創建包:android.telephony
將android系統框架下的\framework\telephony\java\android\telephony目錄中的NeighboringCellInfo.aidl文件復制到上面創建的包(android.telephony )中;
(2)在應用中創建包:com.android.internal.telephony
將android系統框架下的\framework\telephony\java\com\android\internal\telephony目錄中的ITelephony.aidl文件復制到上面創建的包(com.android.internal.telephony )中。
第二步:創建一個獲取ITelephony的方法
PhoneUtils.java
package com.zhouzijing.android.demo;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.telephony.TelephonyManager;
public class PhoneUtils {
/**
* 根據傳入的TelephonyManager來取得系統的ITelephony實例.
* @param telephony
* @return 系統的ITelephony實例
* @throws Exception
*/
public static ITelephony getITelephony(TelephonyManager telephony) throws Exception {
Method getITelephonyMethod = telephony.getClass().getDeclaredMethod("getITelephony");
getITelephonyMethod.setAccessible(true);//私有化函數也能使用
return (ITelephony)getITelephonyMethod.invoke(telephony);
}
}
第三步:創建電話廣播攔截器
MyPhoneBroadcastReceiver.java
package com.zhouzijing.android.demo;
import com.android.internal.telephony.ITelephony;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
public class MyPhoneBroadcastReceiver extends BroadcastReceiver {
private final static String TAG = MyPhone.TAG;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "[Broadcast]"+action);
//呼入電話
if(action.equals(MyPhone.B_PHONE_STATE)){
Log.i(TAG, "[Broadcast]PHONE_STATE");
doReceivePhone(context,intent);
}
}
/**
* 處理電話廣播.
* @param context
* @param intent
*/
public void doReceivePhone(Context context, Intent intent) {
String phoneNumber = intent.getStringExtra(
TelephonyManager.EXTRA_INCOMING_NUMBER);
TelephonyManager telephony = (TelephonyManager)context.getSystemService(
Context.TELEPHONY_SERVICE);
int state = telephony.getCallState();
switch(state){
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG, "[Broadcast]等待接電話="+phoneNumber);
try {
ITelephony iTelephony = PhoneUtils.getITelephony(telephony);
iTelephony.answerRingingCall();//自動接通電話
//iTelephony.endCall();//自動掛斷電話
} catch (Exception e) {
Log.e(TAG, "[Broadcast]Exception="+e.getMessage(), e);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG, "[Broadcast]電話掛斷="+phoneNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG, "[Broadcast]通話中="+phoneNumber);
break;
}
}
}
第四部:注冊電話廣播攔截器
MyPhone.java
package com.zhouzijing.android.demo;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
public class MyPhone extends Activity {
public final static String TAG = "MyPhone";
public final static String B_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED;
private MyPhoneBroadcastReceiver mBroadcastReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_phone);
}
//按鈕1-注冊廣播
public void registerThis(View v) {
Log.i(TAG, "registerThis");
mBroadcastReceiver = new MyPhoneBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(B_PHONE_STATE);
intentFilter.setPriority(Integer.MAX_VALUE);
registerReceiver(mBroadcastReceiver, intentFilter);
}
//按鈕2-撤銷廣播
public void unregisterThis(View v) {
Log.i(TAG, "unregisterThis");
unregisterReceiver(mBroadcastReceiver);
}
}
第5步:在AndroidManifest.xml配置許可權
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
其中:
iTelephony.answerRingingCall();//自動接通電話
必須有許可權 android.permission.MODIFY_PHONE_STATE
iTelephony.endCall();//自動掛斷電話
必須有許可權 android.permission.CALL_PHONE。
㈡ android framework的opt/telephony是什麼進程
本文代碼以MTK平台Android 6.0為分析對象,與Google原生AOSP有些許差異,請讀者知悉。
PhoneApp(包名com.android.phone)主要代碼位於
packages/services/Telephony/
frameworks/opt/telephony/
frameworks/base/telephony/
com.android.phone進程是persistent的,在開機過程中被ActivityManagerService自動啟動,下圖為該進程啟動將要涉及到的類(以GSMPhone為例),圖中類之間的關系表達可能不太准確,僅供參考。
㈢ android開發 itelephony有什麼方法
android4.0之後應用程序無法再獲得Home鍵消息,這樣是對滴,但如果想自己寫Launcher就得對Home鍵相關的一些消息進行處理了。Home消息是在androidframwork中處理的,我們找到Home鍵處理相關的代碼(不想細看的可以直接看最後)frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中的PhoneWindowManager.函數中有以下內容//,soapplications//canneverbreakit,althoughifkeyguardison,wedolet//ithandleit,//timeout.if(keyCode==KeyEvent.KEYCODE_HOME){//Ifwehavereleasedthehomekey,anddidn'tdoanythingelse//whileitwaspressed,thenitistimetogohome!if(mHomePressed&&!down){mHomePressed=false;if(!canceled){//Ifanincomingcallisringing,HOMEistotallydisabled.//(,//.)booleanincomingRinging=false;try{ITelephonytelephonyService=getTelephonyService();if(telephonyService!=null){incomingRinging=telephonyService.isRinging();//是否正好有電話打進來}}catch(RemoteExceptionex){Log.w(TAG,"()",ex);}if(incomingRinging){Log.i(TAG,"IgnoringHOME;there'saringingincomingcall.");//來電中的時候可以看到列印個消息就完了}else{launchHomeFromHotKey();//可以看到這里有launchHome,應該是這里通知了Launcher程序,繼續往下看}}else{Log.i(TAG,"IgnoringHOME;eventcanceled.");}return-1;}//Ifasystemwindowhasfocus,thenitdoesn'tmakesense//.//這一段沒有看的很明白,不過很明顯沒有對Home鍵處理,只是判斷了一些情況然後返回了WindowManager.LayoutParamsattrs=win!=null?win.getAttrs():null;if(attrs!=null){finalinttype=attrs.type;if(type==WindowManager.LayoutParams.TYPE_KEYGUARD||type==WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG){//the"app"iskeyguard,sogiveitthekeyreturn0;}finalinttypeCount=WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;for(inti=0;ilaunchhomeactionwasdetected.Taketheappropriateaction*.*/voidlaunchHomeFromHotKey(){if(mKeyguardMediator.isShowingAndNotHidden()){//don'tlaunchhomeifkeyguardshowing//這個keyguard不知道是什麼東東,反正它啟動了就不響應Home鍵,系統已經處理了,跟Launcher沒關系}elseif(!mHideLockScreen&&mKeyguardMediator.isInputRestricted()){//wheninkeyguardrestrictedmode,mustfirstverifyunlock//.verifyUnlock(newOnKeyguardExitResult(){(booleansuccess){if(success){try{ActivityManagerNative.getDefault().stopAppSwitches();//關閉這個東東}catch(RemoteExceptione){}sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);//關閉這個東東startDockOrHome();//啟動Dock或者Home很明顯這三個函數都很重要一個一個去看看}}});}else{//nokeyguardstufftoworryabout,justlaunchhome!//這里跟上面是一樣處理的try{ActivityManagerNative.getDefault().stopAppSwitches();}catch(RemoteExceptione){}sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);startDockOrHome();}}進入sendCloseSystemWindows,startDockOrHome兩個函數看看voidsendCloseSystemWindows(){sendCloseSystemWindows(mContext,null);}voidsendCloseSystemWindows(Stringreason){sendCloseSystemWindows(mContext,reason);}(Contextcontext,Stringreason){if(ActivityManagerNative.isSystemReady()){try{ActivityManagerNative.getDefault().closeSystemDialogs(reason);//又是調用這個了}catch(RemoteExceptione){}}}voidstartDockOrHome(){Intentdock=createHomeDockIntent();if(dock!=null){try{mContext.startActivity(dock);//啟動HomeDock這個Dock好像是自定義的主界面,這里就不管了return;}catch(ActivityNotFoundExceptione){}}mContext.startActivity(mHomeIntent);//啟動HomeIntent(其實就是發一個Intent消息到主界面)}我們再看看mHomeIntent是怎麼定義的IntentmHomeIntent;mHomeIntent=newIntent(Intent.ACTION_MAIN,null);mHomeIntent.addCategory(Intent.CATEGORY_HOME);mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);Launcher中接受Intent的地方在Launcher2\Launcher2\src\com\android\launcher2\launcher.javaprotectedvoidonNewIntent(Intentintent){}函數中這里就不分析了,先試試能不能接受到再說。nnd搞了半天Launcher根本沒接受Home鍵,按Home鍵時farmwork直接給Launcher調到最前面來了。
㈣ android開發怎麼監控來電並監聽
實現如下廣播,並且在AndroidManifest中進行注冊
public class PhoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("action"+intent.getAction());
//如果是去電
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
String phoneNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.d(TAG, "call OUT:" + phoneNumber);
}else{
//查了下android文檔,貌似沒有專門用於接收來電的action,所以,非去電即來電.
//如果我們想要監聽電話的撥打狀況,需要這么幾步 :
* 第一:獲取電話服務管理器TelephonyManager manager = this.getSystemService(TELEPHONY_SERVICE);
* 第二:通過TelephonyManager注冊我們要監聽的電話狀態改變事件。manager.listen(new MyPhoneStateListener(),
* PhoneStateListener.LISTEN_CALL_STATE);這里的PhoneStateListener.LISTEN_CALL_STATE就是我們想要
* 監聽的狀態改變事件,初次之外,還有很多其他事件哦。
* 第三步:通過extends PhoneStateListener來定製自己的規則。將其對象傳遞給第二步作為參數。
* 第四步:這一步很重要,那就是給應用添加許可權。android.permission.READ_PHONE_STATE
TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
//設置一個監聽器
}
}
PhoneStateListener listener=new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
//注意,方法必須寫在super方法後面,否則incomingNumber無法獲取到值。
super.onCallStateChanged(state, incomingNumber);
switch(state){
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("掛斷");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("接聽");
break;
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("響鈴:來電號碼"+incomingNumber);
//輸出來電號碼
break;
}
}
㈤ android中怎麼實現,來電的自動接聽,並且使
android 實現來電自動接聽和自動掛斷的方法:
第一步:准備應用環境需要的系統包和aidl文件。
(1)在應用中創建包:android.telephony
將android系統框架下的\framework\telephony\java\android\telephony目錄中的NeighboringCellInfo.aidl文件復制到上面創建的包(android.telephony )中;
(2)在應用中創建包:com.android.internal.telephony
將android系統框架下的\framework\telephony\java\com\android\internal\telephony目錄中的ITelephony.aidl文件復制到上面創建的包(com.android.internal.telephony )中。
第二步:創建一個獲取ITelephony的方法
PhoneUtils.java
package com.zhouzijing.android.demo;
㈥ android.telephony.telephonymanager怎麼反射調用
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
/**
* 返回電話狀態
*
* CALL_STATE_IDLE 無任何狀態時
* CALL_STATE_OFFHOOK 接起電話時
* CALL_STATE_RINGING 電話進來時
*/
tm.getCallState();
//返回當前移動終端的位置
CellLocation location=tm.getCellLocation();
//請求位置更新,如果更新將產生廣播,接收對象為注冊LISTEN_CELL_LOCATION的對象,需要的permission名稱為ACCESS_COARSE_LOCATION。
location.requestLocationUpdate();
㈦ 如何導入com.android.internal.telephony
果你要定製一個Android系統,你想用你自己的Launcher(Home)作主界面來替換Android自己的Home,而且不希望用戶安裝的Launcher來替換掉你的Launcher. 我們可以通過修改Framework來實現這樣的功能。 這里以Android2.1的源代碼為例來實際說明。 1)首先了解一下Android的啟動過程。 Android系統的啟動先從Zygote開始啟動,然後......(中間的過程就不說了).....一直到了SystemServer(framework)這個地方,看到這段代碼: /** * This method is called from Zygote to initialize the system. This will cause the native * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back * up into init2() to start the Android services. */ native public static void init1(String[] args); public static void main(String[] args) { if (SamplingProfilerIntegration.isEnabled()) { SamplingProfilerIntegration.start(); timer = new Timer(); timer.schele(new TimerTask() { @Override public void run() { SamplingProfilerIntegration.writeSnapshot("system_server"); } }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); } // The system server has to run all of the time, so it needs to be // as efficient as possible with its memory usage. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); System.loadLibrary("android_servers"); init1(args); } public static final void init2() { Log.i(TAG, "Entered the Android system server!"); Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start(); } } 從SystemServer的main函數開始啟動各種服務。 首先啟動init1,然後啟動init2. 從上面的注釋可以看到:init1這個方法時被Zygote調用來初始化系統的,init1會啟動native的服務如SurfaceFlinger,AudioFlinger等等,這些工作做完以後會回調init2來啟動Android的service。 這里我們主要來關注init2的過程。 init2中啟動ServerThread線程, ServerThread中啟動了一系列的服務,比如這些: ActivityManagerService EntropyService PowerManagerService TelephonyRegistry PackageManagerService AccountManagerService BatteryService HardwareService Watchdog SensorService BluetoothService StatusBarService ClipboardService InputMethodManagerService NetStatService ConnectivityService AccessibilityManagerService NotificationManagerService MountService DeviceStorageMonitorService LocationManagerService SearchManagerService FallbackCheckinService WallpaperManagerService AudioService BackupManagerService AppWidgetService 這些大大小小的服務起來以後,開始 ((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady() 在systemReady後開始開始啟動Launcher。 在尋找Launcher的時候是根據HOME的filter(在Manifest中定義的<category android:name="android.intent.category.HOME" />)來過濾。 然後根據filter出來的HOME來啟動,如果只有一個HOME,則啟動這個HOME,如果用戶自己裝了HOME,那就會彈出來一個列表供用戶選擇。 我們現在希望從這里彈出我們自己定製的Launcher,同時也不希望彈出選擇HOME的界面,我們不希望用戶修改我們的home,比如我們的home上放了好多廣告,以及強制安裝的程序,不希望用戶把它幹掉。 我們可以通過這樣來實現: 2) 定義一個私有的filter選項,然後用這個選項來過濾HOME. 一般情況下我們使用Manifest中定義的<category android:name="android.intent.category.HOME"來過濾的,我們現在增加一個私有的HOME_FIRST過濾。 在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加兩行代碼 //lixinso:添加CATEGORY_HOME_FIRST @SdkConstant(SdkConstantType.INTENT_CATEGORY) public static final String CATEGORY_HOME_FIRST = "android.intent.category.HOME_FIRST"; 3)修改和CATEGORY_HOME相關的所有的地方,都改成HOME_FIRST,主要是framework中的這幾個地方: frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中 //intent.addCategory(Intent.CATEGORY_HOME); 改成intent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso: //if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST frameworks/base/services/java/com/android/server/am/HistoryRecorder.java中 // _intent.hasCategory(Intent.CATEGORY_HOME) && 改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST frameworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中 //mHomeIntent.addCategory(Intent.CATEGORY_HOME); 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso frameworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中 //new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0); 改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中 //mHomeIntent.addCategory(Intent.CATEGORY_HOME); 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中 //ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0); 改成 ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso 4) 寫一個自己的Launcher. 可以參考android sample中的Launcher,或者android源代碼中的 /packages/apps/Launcher 來寫。 在Launcher中標記其是不是Launcher的最關鍵的代碼時Manifest中的filter:android:name="android.intent.category.HOME" 現在我們定義了自己的filter,那麼,我們在我們自己寫的Launcher中將Manifest改為: <application android:process="android.process.acore3" android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".FirstAppActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME_FIRST" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.MONKEY" /> </intent-filter> </activity> </application> 然後將編譯好的apk放到/out/target/proct/generic/system/app目錄下。 5)將Android自帶的Launcher刪除掉,包括源代碼(packages/apps/Launcher)和apk(/out/target/proct/generic/system/app/Launcher.apk)。 6) 做完這些工作,就可以重新編譯Android了,我們可以編譯修改過的幾個相關的包。 如果之前編譯過了Android源碼,可以用mmm命令來編譯部分的改動。 這里需要這樣編譯: $ . build/envsetup.sh $ mmm frameworks/base $ mmm frameworks/base/services/java $ mmm frameworks/policies/base/mid $ mmm frameworks/policies/base/phone 7) 編譯完成後重新生成img文件。 $ make snod 8) 現在可以啟動Android模擬器來看效果了。 首先設置環境變數: $ export ANDROID_PRODUCT_OUT= ./out/target/proct/generic 然後切換到 $ cd ./out/host/linux-x86/bin 運行 $ ./emulator 這樣我們啟動的模擬器裡面用的image就是我們剛才編譯好的自己定製的東西了。 從模擬器上可以看到啟動的Launcher是我們自己的Launcher,不會出現默認的Launcher了,也不會出現選擇界面。 9)我們再驗證一下,如果用戶裝上了一個其他的Launcher(Home)會怎麼樣。 從網上找一個一般的Launcher或者自己寫一個一般的Launcher裝上去,重新啟動,不會出現選擇界面。 按HOME鍵也不會出來兩個HOME來選擇。
㈧ android 手機啟動時,telephony 相關的都做了哪些事情
先看一段注釋:
/* Once created UiccController registers with RIL for "on" and "unsol_sim_status_changed"
* notifications. When such notification arrives UiccController will call
* getIccCardStatus (GET_SIM_STATUS). Based on the response of GET_SIM_STATUS
* request appropriate tree of uicc objects will be created.
*
* Following is class diagram for uicc classes:
*
* UiccController
* #
* |
* UiccCard
* # #
* | ------------------
* UiccCardApplication CatService
* # #
* | |
* IccRecords IccFileHandler
* ^ ^ ^ ^ ^ ^ ^ ^
* SIMRecords---- | | | | | | ---SIMFileHandler
* RuimRecords----- | | | | ----RuimFileHandler
* IsimUiccRecords--- | | -----UsimFileHandler
* | ------CsimFileHandler
* ----IsimFileHandler
*
* Legend: # stands for Composition
* ^ stands for Generalization
*/
這是UiccController.java文件開頭對UiccController的注釋,意思很明顯UiccController是對Android SIM卡管理的控制器。
下面是SIM卡初始化序列圖:
UiccController的初始化是在phone進程啟動的時候,PhoneFactory調用makeDefaultPhone()創建默認的Phone,然後走MTK雙卡流程中,調用MTKPhoneFactory.makeDefaultPhone()創建的,
{
for (int l2 = 0; l2 < PhoneConstants.GEMINI_SIM_NUM; l2++)
if (j1 == l2)
ai[l2] = j;
else
ai[l2] = 1;
I = new RIL(context, ai[0], l, 0);
J = new RIL(context, ai[1], l, 1);
}
UiccController.make(context, I, 0);
UiccController.make(context, J, 1);
GSMPhone agsmphone[] = new GSMPhone[PhoneConstants.GEMINI_SIM_NUM];
上面是反編譯MTK的static_gemini_intermediates庫看到的,在RIL創建完成時,使用UiccController.make()初始化:
public static UiccController make(Context c, CommandsInterface ci, int simId) {
synchronized (mLock) {
if (FeatureOption.MTK_GEMINI_SUPPORT) {
if(mInstance[simId] != null) {
throw new RuntimeException("UiccController.make() should only be called once");
}
mInstance[simId] = new UiccController(c, ci, simId);
return mInstance[simId];
} else {
if (mInstance[0] != null) {
throw new RuntimeException("UiccController.make() should only be called once");
}
mInstance[0] = new UiccController(c, ci);
return mInstance[0];
}
}
}
UiccController的創建使用了單例模式,使用時調用getInstance()獲取,
public static UiccController getInstance(int simId) {
synchronized (mLock) {
if (FeatureOption.MTK_GEMINI_SUPPORT) {
if(mInstance[simId] == null) {
throw new RuntimeException(
"UiccController.getInstance can't be called before make()");
}
return mInstance[simId];
} else {
if (mInstance[0] == null) {
throw new RuntimeException(
"UiccController.getInstance can't be called before make()");
}
return mInstance[0];
}
}
}
private UiccController(Context c, CommandsInterface ci, int simId) {
if (DBG) log("Creating UiccController simId " + simId);
mContext = c;
mCi = ci;
mSimId = simId;
mCi.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null);
// TODO remove this once modem correctly notifies the unsols
mCi.registerForOn(this, EVENT_ICC_STATUS_CHANGED, null);
mCi.registerForVirtualSimOn(this, EVENT_VIRTUAL_SIM_ON, null);
mCi.registerForVirtualSimOff(this, EVENT_VIRTUAL_SIM_OFF, null);
mCi.registerForSimMissing(this, EVENT_SIM_MISSING, null);
mCi.registerForSimRecovery(this, EVENT_SIM_RECOVERY, null);
mCi.registerForSimPlugOut(this, EVENT_SIM_PLUG_OUT, null);
mCi.registerForSimPlugIn(this, EVENT_SIM_PLUG_IN, null);
mCi.registerForInvalidSimDetected(this, EVENT_INVALID_SIM_DETECTED, null);
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.ACTION_SHUTDOWN_IPO");
filter.addAction(GeminiPhone.EVENT_INITIALIZATION_FRAMEWORK_DONE);
filter.addAction(TelephonyIntents.ACTION_SIM_INFO_UPDATE);
filter.addAction(ACTION_RESET_MODEM);
mContext.registerReceiver(mIntentReceiver, filter);
}
㈨ com.android.providers.telephony是什麼程序、
是android開發中的一個工具包,提供一些必要的服務,例如:
Android系統採用SQLite資料庫方式存儲所有接收到的簡訊,簡訊的SQLite資料庫文件位於:
/data/data/com.android.providers.telephony/databases/mmssms.db
備份Android簡訊資料庫到SD卡上,可以使用adb工具連接手機,然後使用如下命令
busybox cp /data/data/com.android.providers.telephony/databases/mmssms.db /sdcard
如果busybox cp命令不行,還可以使用cat命令:
cat /data/data/com.android.providers.telephony/databases/mmssms.db > /sdcard/mmssms.db
㈩ 深入理解android telephony原理剖析與最佳實踐 是android 什麼版本de
卷1主要講的一些Android世界的由來和一些學習底層庫所需掌握的知識,然後講了音頻Audiolinger和圖像Surfacelinger,和一些其他的服務,對應用層和框架層開發意義不大。卷2主要講的是框架層Framework的知識,對系統開發有幫助。卷3主要講和UI相關的,對應用幫助最大就是這本書了,裡面也講了很多系統開發相關的知識。