Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中检测已连接的传出呼叫_Android_Android Intent - Fatal编程技术网

如何在Android中检测已连接的传出呼叫

如何在Android中检测已连接的传出呼叫,android,android-intent,Android,Android Intent,如何检测传出呼叫何时连接。下面是我的代码,但当有incomingcall时,它会进入这个if(intent.getStringExtra(TelephonyManager.EXTRA\u STATE).equals(TelephonyManager.EXTRA\u STATE\u RINGING)) 当没有活动时,它会进入此状态 else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.

如何检测传出呼叫何时连接。下面是我的代码,但当有incomingcall时,它会进入这个if(intent.getStringExtra(TelephonyManager.EXTRA\u STATE).equals(TelephonyManager.EXTRA\u STATE\u RINGING))

当没有活动时,它会进入此状态

else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE))

当incomingcall是Response时,它将进入这个,而Outgoing Call将进入这个

else if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK))

现在,当Outgoing Call处于脱机状态时,我如何知道我的Outgoing Call何时已连接

多谢各位

@Override
public void onReceive(Context context, Intent intent) {
    // TODO: This method is called when the BroadcastReceiver is receiving
    // an Intent broadcast.
    if(intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)){
        String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        Toast.makeText(context, "Call From : " + incomingNumber, Toast.LENGTH_LONG).show();

    }
    else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)){
        Toast.makeText(context,TelephonyManager.EXTRA_STATE_IDLE,Toast.LENGTH_LONG).show();
    }
    else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
        Toast.makeText(context,TelephonyManager.EXTRA_STATE_OFFHOOK,Toast.LENGTH_LONG).show();
    }
}

将其添加到Android清单文件中。声明广播接收机

    <receiver
        android:name=".OutCallLogger"
        android:enabled="true"
        android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.PRECISE_CALL_STATE" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
    </receiver>

在android清单文件中添加以下权限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
<uses-feature android:name="android.hardware.telephony">
</uses-feature>

还要在清单文件中添加此行

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
<uses-feature android:name="android.hardware.telephony">
</uses-feature>

这是您的类,用于获取传出呼叫的精确呼叫状态

public class OutCallLogger extends BroadcastReceiver {
public OutCallLogger() {
}
TelephonyManager Tm;
ITelephony telephonyService;
Class c = null;
Method methodGetInstance = null;
Method methodGetActiveFgCallState=null;
String TAG="Tag";
Object objectCallManager=null;
Context context1;
Class<?> classCallManager;

Class telephonyClass;
Class telephonyStubClass;
Class serviceManagerClass;
Class serviceManagerStubClass;
Class serviceManagerNativeClass;
Class serviceManagerNativeStubClass;

Method telephonyCall;
Method telephonyEndCall;
Method telephonyAnswerCall;
Method getDefault;

Method[] temps;
Constructor[] serviceManagerConstructor;

// Method getService;
Object telephonyObject;
Object serviceManagerObject;
private Timer timer= null;

@Override
public void onReceive(Context context, Intent intent) {
    // TODO: This method is called when the BroadcastReceiver is receiving
    // an Intent broadcast.



    this.context1= context;
    try {
        //String serviceManagerName = "android.os.IServiceManager";
        String serviceManagerName = "android.os.ServiceManager";
        String serviceManagerNativeName = "android.os.ServiceManagerNative";
        String telephonyName = "com.android.internal.telephony.ITelephony";


        telephonyClass = Class.forName(telephonyName);
        telephonyStubClass = telephonyClass.getClasses()[0];
        serviceManagerClass = Class.forName(serviceManagerName);
        serviceManagerNativeClass = Class.forName(serviceManagerNativeName);

        Method getService = // getDefaults[29];
                serviceManagerClass.getMethod("getService", String.class);

        Method tempInterfaceMethod = serviceManagerNativeClass.getMethod(
                "asInterface", IBinder.class);

        Binder tmpBinder = new Binder();
        tmpBinder.attachInterface(null, "fake");

        serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder);
        IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone");
        Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class);
        Method[] aClassMethods = telephonyClass.getDeclaredMethods();
        for(Method m : aClassMethods)
        {
            //Log.e("MEthods", m.getName());
        }
        telephonyObject = serviceMethod.invoke(null, retbinder);
        //telephonyCall = telephonyClass.getMethod("call", String.class);
        telephonyEndCall = telephonyClass.getMethod("getPreciseCallState");
        //telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall");
        Log.e("CallState",telephonyEndCall.invoke(telephonyObject).toString());
        Toast.makeText(context1, " "+telephonyEndCall.invoke(telephonyObject).toString(), Toast.LENGTH_LONG).show();

        telephonyEndCall.invoke(telephonyObject);

    } catch (Exception e) {
        e.printStackTrace();

    }

}
公共类OutCallLogger扩展了BroadcastReceiver{
公共OutCallLogger(){
}
TelephonyManager Tm;
ITelephony电话服务;
c类=空;
方法methodGetInstance=null;
方法methodGetActiveFgCallState=null;
String TAG=“TAG”;
objectCallManager=null;
语境1;
班级经理;
类电话类;
类电话子类;
类serviceManagerClass;
类serviceManagerStubClass;
类serviceManagerNativeClass;
类服务管理器活动子类;
方法电话呼叫;
方法电话呼叫;
方法电话呼叫;
方法getDefault;
方法[]temps;
构造函数[]服务管理器构造函数;
//方法获取服务;
对象电话对象;
对象服务管理对象;
专用定时器=空;
@凌驾
公共void onReceive(上下文、意图){
//TODO:当BroadcastReceiver正在接收时调用此方法
//有意图的广播。
this.context1=上下文;
试一试{
//字符串serviceManagerName=“android.os.IServiceManager”;
字符串serviceManagerName=“android.os.ServiceManager”;
字符串serviceManagerNativeName=“android.os.ServiceManagerActive”;
String telephonyName=“com.android.internal.telephony.ITelephony”;
telephonyClass=Class.forName(telephonyName);
TelephonySubclass=telephonyClass.getClasses()[0];
serviceManagerClass=Class.forName(serviceManagerName);
serviceManagerNativeClass=Class.forName(serviceManagerNativeName);
方法getService=//getDefaults[29];
serviceManagerClass.getMethod(“getService”,String.class);
方法tempInterfaceMethod=serviceManagerNativeClass.getMethod(
“接口”,IBinder.class);
活页夹tmpBinder=新活页夹();
tmpBinder.attachInterface(空,“假”);
serviceManagerObject=tempInterfaceMethod.invoke(null,tmpBinder);
IBinder retbinder=(IBinder)getService.invoke(serviceManagerObject,“电话”);
方法serviceMethod=telephonyStubClass.getMethod(“asInterface”,IBinder.class);
方法[]aClassMethods=telephonyClass.getDeclaredMethods();
对于(方法m:aClassMethods)
{
//Log.e(“方法”,m.getName());
}
telephonyObject=serviceMethod.invoke(null,retbinder);
//telephoncall=telephonyClass.getMethod(“call”,String.class);
telephonyEndCall=telephonyClass.getMethod(“getPreciseCallState”);
//telephonyAnswerCall=telephonyClass.getMethod(“应答呼叫”);
Log.e(“CallState”,telephonyEndCall.invoke(telephonyObject.toString());
Toast.makeText(context1,“+telephonyEndCall.invoke(telephonyObject.toString(),Toast.LENGTH_LONG.show();
调用(telephonyObject);
}捕获(例外e){
e、 printStackTrace();
}
}

}

请查看下面的链接。将显示Toast,它将告诉您确切的通话状态。您可以相应地修改代码。以上您发布的代码只能在来电情况下使用。谢谢。我已经试过你的代码了,但什么也没有得到。当客户回答时不要举杯。我不知道我做错了什么@哈默德·塔里克·萨希多:当拨出电话开始时,你会得到祝酒辞吗?对不起。我现在在哪里吃吐司?我太困惑了@Hammad Tariq Sahi