❶ 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;