❶ android怎麼判斷是雙卡雙待
Android怎麼判斷是雙卡雙待的具體方法為:
1、Android平台是一個多樣型的平台,不同的手機獲取ITelephony介面不同,用一種方法實現雙卡雙待管理是不可取的。只有針對不同的手機分析出一套管理的方案,該方案實現難度大,因為需要各個廠家的SDK的資料。為了實現該功能,需要整合各個廠家的SDK的資料。
2、為了更好的管理雙卡雙待的問題,新建一個雙卡雙待模塊靜態庫,其它項目引用便是,項目如圖:
3、AbsSim是抽象類,負責實現手機操作的類。不同的廠家繼承該類實現各自的介面。AbsSim信息如下:
public abstract class AbsSim implements IDualDetector { //抽象基類
protected final String TAG = getClass().getSimpleName();
protected ArrayList<SimSlot> mSimSlots = new ArrayList<SimSlot>();
protected boolean mIsDualSimPhone = false;
protected String mCallLogExtraField = "";
public abstract String getSimPhoneNumber(int paramInt); // 返回手機號碼
public abstract int getDataState(int paramInt);// 返回數據狀態
public abstract String getIMSI(int paramInt);// 返回手機標識
public abstract String getIMSI(int paramInt, Context paramContext);// 返回手機標識
public abstract int getPhoneState(int paramInt);// 返回手機狀態
public abstract boolean isServiceAvaliable(int paramInt);// 服務是否可用
public abstract boolean isSimStateIsReady(int paramInt);// 卡是否在使用
public abstract int getSimOperator(int paramInt);// 服務商(電信、移動、聯通)
protected abstract Object getITelephonyMSim(int paramInt);// 獲取操作介面
protected abstract Object getMSimTelephonyManager(int paramInt);// 獲取操作介面
}
4、這是利用java 反射機制操作Android隱藏的類,很好的解決了雙卡雙待的問題。
❷ 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 怎麼判斷電話占線
1. 如何判斷手機是否處於正在通話中?(任何時候都可以判斷手機是否處於通過中)
private boolean phoneIsInUse() {
boolean phoneInUse = false;
try {
ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
if (phone != null) phoneInUse = !phone.isIdle();
} catch (RemoteException e) {
Log.w(TAG, "phone.isIdle() failed", e);
}
return phoneInUse;
}
2.通話狀態的判斷(需要注冊監聽以後,才可以判斷手機通話狀態的改變,可能連續接收到同一個狀態的改變)
package cn.com.chenzheng_java;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.TextView;
/**
*
* @author
* @description 通過該實例,我們可以看到,如果我們想要監聽電話的撥打狀況,需要這么幾步
* 第一:獲取電話服務管理器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
*
*
*/
public class PhoneCallStateActivity extends Activity {
TelephonyManager manager ;
String result = "監聽電話狀態:/n";
TextView textView ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//獲取電話服務
manager = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
// 手動注冊對PhoneStateListener中的listen_call_state狀態進行監聽
manager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
textView = (TextView) findViewById(R.id.textView1);
textView.setText(result);
}
/***
* 繼承PhoneStateListener類,我們可以重新其內部的各種監聽方法
*然後通過手機狀態改變時,系統自動觸發這些方法來實現我們想要的功能
*/
class MyPhoneStateListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
result+=" 手機空閑起來了 ";
break;
case TelephonyManager.CALL_STATE_RINGING:
result+=" 手機鈴聲響了,來電號碼:"+incomingNumber;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
result+=" 電話被掛起了 ";
default:
break;
}
textView.setText(result);
super.onCallStateChanged(state, incomingNumber);
}
}
}
這里一定要注意,別忘記給應用注冊許可權:
<uses-permission android:name="android.permission.READ_PHONE_STATE"$amp;>amp;$lt;/uses-permission>
❹ 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中怎麼實現,來電的自動接聽,並且使
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;