當前位置:首頁 » 安卓系統 » telephonyandroid

telephonyandroid

發布時間: 2022-07-11 12:55:45

『壹』 怎麼分析android telephony問題

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

『貳』 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。

『叄』 ITelephony.aidl 在android studio中的使用

aidl文件的包名必須和aidl目錄下java的包名一致。

先看下你的ITelephony.aidl文件的包名是不是com.android.internal.telephony;


aidl文件放在aidl目錄下, 和java目錄同級


最後要手動的build ---- make這個mole 成功後, 才會生成Java文件,生成的文件位於build/generated/source/aidl那邊, 你的工程目錄里是看不到的, 不過可以使用了。

『肆』 深入理解android telephony原理剖析與最佳實踐 是android 什麼版本de

卷1主要講的一些Android世界的由來和一些學習底層庫所需掌握的知識,然後講了音頻Audiolinger和圖像Surfacelinger,和一些其他的服務,對應用層和框架層開發意義不大。卷2主要講的是框架層Framework的知識,對系統開發有幫助。卷3主要講和UI相關的,對應用幫助最大就是這本書了,裡面也講了很多系統開發相關的知識。

『伍』 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

『陸』 如何導入com.android.internal.telephony

android的系統資料庫在調用的時候都封裝了 咱們只需要寫where的condition,表結構和標明對咱們都是不透明的 這就對深入了解帶來了很多麻煩,即使有源碼查看起來也很費勁。
android使用的是sqlite資料庫,一般都是每個模塊都有一個.db文件,咱們可以將系統里的.db文件拷出來在使用android tool中的sqlite3命令來操作和測試資料庫。

首先啟動模擬器或將手機連接電腦

使用find命令將系統中所有的db文件找出來
adb shell find / -name '*.db' -type f
/mnt/sdcard/openfeint/webui/manifest.db
/mnt/sdcard/dbms/DBMS.db
/data/system/accounts.db
/data/data/com.android.vending/databases/assets14.db
/data/data/com.android.vending/databases/suggestions.db
/data/data/com.android.vending/databases/webviewCache.db
/data/data/com.android.vending/databases/webview.db
/data/data/com.android.vending/databases/billing4.db
/data/data/com.android.providers.userdictionary/databases/user_dict.db
/data/data/com.android.providers.telephony/databases/mmssms.db
/data/data/com.android.providers.telephony/databases/telephony.db
/data/data/com.android.providers.settings/databases/settings.db
/data/data/com.android.providers.media/databases/internal.db
/data/data/com.android.providers.media/databases/external-bd717cb2.db
/data/data/com.android.providers.media/databases/external-5c2507fe.db
/data/data/com.android.launcher/databases/launcher.db
/data/data/com.example.android.apis/databases/webviewCache.db
/data/data/com.example.android.apis/databases/webview.db
/data/data/com.eclipsim.gpsstatus2/databases/google_analytics.db
/data/data/com.eclipsim.gpsstatus2/databases/webviewCache.db
/data/data/com.eclipsim.gpsstatus2/databases/webview.db
/data/data/com.android.inputmethod.latin/databases/userbigram_dict.db
/data/data/com.android.inputmethod.latin/databases/auto_dict.db
/data/data/com.google.android.gsf/databases/talk.db
/data/data/com.google.android.gsf/databases/webviewCache.db
/data/data/com.google.android.gsf/databases/webview.db
/data/data/com.google.android.gsf/databases/googlesettings.db
/data/data/com.google.android.gsf/databases/subscribedfeeds.db
/data/data/com.google.android.gsf/databases/gservices.db
/data/data/com.google.android.gsf/databases/gls.db
/data/data/com.google.android.googlequicksearchbox/databases/qsb-log.db
/data/data/com.google.android.gm/databases/downloads.db
/data/data/com.google.android.gm/databases/[email protected]
/data/data/com.google.android.gm/databases/gmail.db
/data/data/com.google.android.apps.genie.geniewidget/databases/weather.db
/data/data/com.cooliris.media/databases/launcher.db
/data/data/com.cooliris.media/databases/picasa.db
/data/data/com.android.email/databases/EmailProviderBody.db
/data/data/com.android.email/databases/EmailProvider.db
/data/data/com.android.providers.drm/databases/drm.db
/data/data/com.getsetgames.megajump/databases/google_analytics.db
/data/data/com.getsetgames.megajump/databases/webviewCache.db
/data/data/com.getsetgames.megajump/databases/webview.db
/data/data/com.android.providers.downloads/databases/downloads.db
/data/data/com.rich.webviewtest/databases/webviewCache.db
/data/data/com.rich.webviewtest/databases/webview.db
/data/data/com.android.deskclock/databases/alarms.db
/data/data/com.android.providers.contacts/databases/contacts2.db
/data/data/com.android.providers.calendar/databases/calendar.db
/data/data/com.android.browser/app_icons/WebpageIcons.db
/data/data/com.android.browser/app_geolocation/CachedGeoposition.db
/data/data/com.android.browser/app_databases/Databases.db
/data/data/com.android.browser/app_appcache/ApplicationCache.db
/data/data/com.android.browser/databases/browser.db
/data/data/com.android.browser/databases/webviewCache.db
/data/data/com.android.browser/databases/webview.db
/data/data/com.android.bluetooth/databases/btopp.db
有了個db文件列表咱們就可以把這些db 復制到電腦上進行操作了

以通訊錄資料庫為例執行以下操作:
adb pull /data/data/com.android.providers.contacts/databases/contacts2.db F:/androidres/systemdb
--1669 KB/s (271360 bytes in 0.158s)
F:/androidres/systemdb為任意本地目錄 不明白pull命令的查看adb help

用sqlite3打開這個文件

F:/androidres/systemdb>sqlite3 contacts2.db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
_sync_state settings
_sync_state_metadata status_updates
accounts v1_settings
activities view_contacts
agg_exceptions view_contacts_restricted
android_metadata view_data
calls view_data_restricted
contact_entities_view view_groups
contact_entities_view_restricted view_raw_contacts
contacts view_raw_contacts_restricted
data view_v1_contact_methods
groups view_v1_extensions
mimetypes view_v1_group_membership
name_lookup view_v1_groups
nickname_lookup view_v1_organizations
packages view_v1_people
phone_lookup view_v1_phones
properties view_v1_photos
raw_contacts

『柒』 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);
}

『捌』 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();

『玖』 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調到最前面來了。

熱點內容
日本免費雲伺服器色 發布:2025-04-05 04:58:52 瀏覽:864
linuxcpp 發布:2025-04-05 04:53:38 瀏覽:747
安卓字體哪個最好 發布:2025-04-05 04:46:37 瀏覽:649
什麼是hdb3碼編解碼 發布:2025-04-05 04:40:20 瀏覽:504
編譯原理運算符 發布:2025-04-05 04:37:50 瀏覽:520
如何用安卓手機玩ipad的賬號 發布:2025-04-05 04:17:42 瀏覽:935
vivo手機怎麼在桌面建文件夾 發布:2025-04-05 04:15:56 瀏覽:961
在線ftp網頁版軟體 發布:2025-04-05 04:15:02 瀏覽:624
android手機gps 發布:2025-04-05 04:14:59 瀏覽:446
頁數演算法 發布:2025-04-05 03:19:01 瀏覽:318