• Android撥打、接聽、掛斷電話操作

    1
    Android Java .NET C/C++ 15313 次瀏覽
     Android2.3之前的系統可以通過反射機制調用ITelephone的方法來掛斷電話,因為Android2.3以后增加了對 permission  android.permission.MODIFY_PHONE_STATE 的限制,之前的反射的方法不能用了,我們可以通過發送廣播的方式來接聽電話。

    示例代碼

        package com.example.android_3gtest;  
          
        import java.lang.reflect.InvocationTargetException;  
        import java.lang.reflect.Method;  
        import android.content.Context;  
        import android.content.Intent;  
        import android.media.AudioManager;  
        import android.net.Uri;  
        import android.os.Build;  
        import android.telephony.TelephonyManager;  
        import android.text.TextUtils;  
        import android.view.KeyEvent;  
          
        public class PhoneUtil {  
          
            public static String TAG = PhoneUtil.class.getSimpleName();    
              
            /** 
             * 掛斷電話 
             * @param context 
             */  
            public static void endCall(Context context) {    
                try {    
                    Object telephonyObject = getTelephonyObject(context);    
                    if (null != telephonyObject) {    
                        Class telephonyClass = telephonyObject.getClass();    
            
                        Method endCallMethod = telephonyClass.getMethod("endCall");    
                        endCallMethod.setAccessible(true);    
            
                        endCallMethod.invoke(telephonyObject);    
                    }    
                } catch (SecurityException e) {    
                    e.printStackTrace();    
                } catch (NoSuchMethodException e) {    
                    e.printStackTrace();    
                } catch (IllegalArgumentException e) {    
                    e.printStackTrace();    
                } catch (IllegalAccessException e) {    
                    e.printStackTrace();    
                } catch (InvocationTargetException e) {    
                    e.printStackTrace();    
                }    
            
            }    
                
            private static Object getTelephonyObject(Context context) {    
                Object telephonyObject = null;    
                try {    
                    // 初始化iTelephony    
                    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);    
                    // Will be used to invoke hidden methods with reflection    
                    // Get the current object implementing ITelephony interface    
                    Class telManager = telephonyManager.getClass();    
                    Method getITelephony = telManager.getDeclaredMethod("getITelephony");    
                    getITelephony.setAccessible(true);    
                    telephonyObject = getITelephony.invoke(telephonyManager);    
                } catch (SecurityException e) {    
                    e.printStackTrace();    
                } catch (NoSuchMethodException e) {    
                    e.printStackTrace();    
                } catch (IllegalArgumentException e) {    
                    e.printStackTrace();    
                } catch (IllegalAccessException e) {    
                    e.printStackTrace();    
                } catch (InvocationTargetException e) {    
                    e.printStackTrace();    
                }    
                return telephonyObject;    
            }    
            
                
            /** 
             * 通過反射調用的方法,接聽電話,該方法只在android 2.3之前的系統上有效。 
             * @param context 
             */    
            private static void answerRingingCallWithReflect(Context context) {    
                try {    
                    Object telephonyObject = getTelephonyObject(context);    
                    if (null != telephonyObject) {    
                         Class telephonyClass = telephonyObject.getClass();    
                         Method endCallMethod = telephonyClass.getMethod("answerRingingCall");    
                         endCallMethod.setAccessible(true);    
                            
                         endCallMethod.invoke(telephonyObject);    
                        // ITelephony iTelephony = (ITelephony) telephonyObject;    
                        // iTelephony.answerRingingCall();    
                    }    
                } catch (SecurityException e) {    
                    e.printStackTrace();    
                } catch (IllegalArgumentException e) {    
                    e.printStackTrace();    
                } catch (IllegalAccessException e) {    
                    e.printStackTrace();    
                } catch (InvocationTargetException e) {    
                    e.printStackTrace();    
                } catch (NoSuchMethodException e) {    
                    e.printStackTrace();    
                }    
            
            }    
                
            /** 
             * 偽造一個有線耳機插入,并按接聽鍵的廣播,讓系統開始接聽電話。 
             * @param context 
             */    
            private static void answerRingingCallWithBroadcast(Context context){    
                AudioManager localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);    
                //判斷是否插上了耳機    
                boolean isWiredHeadsetOn = localAudioManager.isWiredHeadsetOn();    
                if (!isWiredHeadsetOn) {    
                    Intent headsetPluggedIntent = new Intent(Intent.ACTION_HEADSET_PLUG);    
                    headsetPluggedIntent.putExtra("state", 1);    
                    headsetPluggedIntent.putExtra("microphone", 0);    
                    headsetPluggedIntent.putExtra("name", "");    
                    context.sendBroadcast(headsetPluggedIntent);    
                        
                    Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);    
                    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);    
                    meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);    
                    context.sendOrderedBroadcast(meidaButtonIntent, null);    
                        
                    Intent headsetUnpluggedIntent = new Intent(Intent.ACTION_HEADSET_PLUG);    
                    headsetUnpluggedIntent.putExtra("state", 0);    
                    headsetUnpluggedIntent.putExtra("microphone", 0);    
                    headsetUnpluggedIntent.putExtra("name", "");    
                    context.sendBroadcast(headsetUnpluggedIntent);    
                        
                } else {    
                    Intent meidaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);    
                    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);    
                    meidaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT,keyEvent);    
                    context.sendOrderedBroadcast(meidaButtonIntent, null);    
                }    
            }    
            
            /** 
             * 接聽電話 
             * @param context 
             */    
            public static void answerRingingCall(Context context) {    
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {  //2.3或2.3以上系統  
                    answerRingingCallWithBroadcast(context);    
                } else {    
                    answerRingingCallWithReflect(context);    
                }    
            }    
                
            /** 
             * 打電話 
             * @param context 
             * @param phoneNumber 
             */    
            public static void callPhone(Context context, String phoneNumber) {    
                if(!TextUtils.isEmpty(phoneNumber)){    
                    try {    
                        Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ phoneNumber));    
                        context.startActivity(callIntent);    
                    } catch (Exception e) {    
                        e.printStackTrace();    
                    }    
                }    
            }    
                
            /** 
             * 撥電話 
             * @param context 
             * @param phoneNumber 
             */    
            public static void dialPhone(Context context, String phoneNumber){    
                if(!TextUtils.isEmpty(phoneNumber)){    
                    try {    
                        Intent callIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+ phoneNumber));    
                        context.startActivity(callIntent);    
                    } catch (Exception e) {    
                        e.printStackTrace();    
                    }    
                }    
            }    
        }  

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色