正文  基础知识 > 程序示例 >

android开发中的电话拦截代码示例-安卓100分享

第一步:在程序中新建一个包,包名必须为:com android internal telephony,因为要使用aidl。 第二步:在这个包里面新建一个名为ITelephony aidl的文件,然后在文件里面写入代码...

第一步:在程序中新建一个包,包名必须为:com.android.internal.telephony,因为要使用aidl。
 
第二步:在这个包里面新建一个名为ITelephony.aidl的文件,然后在文件里面写入代码:
 
 
[java] view plain copy
package com.android.internal.telephony;  
    interface ITelephony{  
        boolean endCall();  
        void answerRingingCall();  
    }  
 
然后是要监听电话状态,当来电时,检测来电号码是否符合拦截标准(这个拦截标准是我们自己定的,你可以拦截指定号码如实现一个黑名单的功能,我们在这里拦截所有不在联系人里的号码,并把此号码存入文件,以方便在首页显示),代码如下:
 
 
[java] view plain copy
import java.lang.reflect.Method;  
import java.util.ArrayList;  
  
import com.android.internal.telephony.ITelephony;  
  
import android.app.Service;  
import android.content.BroadcastReceiver;  
import android.content.ContentResolver;  
import android.content.Context;  
import android.content.Intent;  
import android.content.SharedPreferences;  
import android.content.SharedPreferences.Editor;  
import android.database.Cursor;  
import android.provider.ContactsContract;  
import android.telephony.TelephonyManager;  
import android.util.Log;  
  
public class PhoneStatReceiver extends BroadcastReceiver{  
  
    String TAG = "tag";  
    TelephonyManager telMgr;  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        telMgr = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);  
        switch (telMgr.getCallState()) {  
            case TelephonyManager.CALL_STATE_RINGING:  
                String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);   
                Log.v(TAG,"number:"+number);  
                if (!getPhoneNum(context).contains(number)) {  
                    SharedPreferences phonenumSP = context.getSharedPreferences("in_phone_num", Context.MODE_PRIVATE);  
                    Editor editor = phonenumSP.edit();  
                    editor.putString(number,number);  
                    editor.commit();  
                    endCall();  
                }  
                break;  
            case TelephonyManager.CALL_STATE_OFFHOOK:                                 
                break;  
            case TelephonyManager.CALL_STATE_IDLE:                                 
                break;  
        }  
          
    }  
    /** 
     * 挂断电话 
     */  
    private void endCall()  
    {  
        Class c = TelephonyManager.class;           
        try  
        {  
            Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);  
            getITelephonyMethod.setAccessible(true);  
            ITelephony iTelephony = null;  
            Log.e(TAG, "End call.");  
            iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);  
            iTelephony.endCall();  
        }  
        catch (Exception e)  
        {  
            Log.e(TAG, "Fail to answer ring call.", e);  
        }          
    }  
    private ArrayList< string>  getPhoneNum(Context context) {  
        ArrayList< string> numList = new ArrayList< string>();  
        //得到ContentResolver对象     
        ContentResolver cr = context.getContentResolver();       
        //取得电话本中开始一项的光标     
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);     
        while (cursor.moveToNext())     
        {                 
            // 取得联系人ID     
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));     
            Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);     
            // 取得电话号码(可能存在多个号码)     
            while (phone.moveToNext())     
            {     
                String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));     
                numList.add(strPhoneNumber);    
                Log.v("tag","strPhoneNumber:"+strPhoneNumber);  
            }     
              
            phone.close();     
        }     
        cursor.close();  
        return numList;  
    }  
}  
这里我们要注意以下几点:
1.PhoneStatReceiver一定要在清单文件(AndroidManifest.xml)中注册。
 
2.一定要添加权限
 
AndroidManifest文件如下:
 
 
[html] view plain copy
  
    package="com.xxxx.xxxx"  
    android:versionCode="1"  
    android:versionName="1.0" >  
 
            android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name" >  
                     android:name=".MainActivity"  
            android:label="@string/app_name" >  
   
其实最到这里,整个拦截功能就已经实现了,但是呢,我们的首页也不能让它光秃秃的显示个Hello World!吧。所以,在MainActivity中,再给大家加点料,就是在listView中显示所有已经被拦截的电话号码,代码如下:
 
[java] view plain copy
import java.util.Map;  
import android.app.ListActivity;  
import android.content.Context;  
import android.content.SharedPreferences;  
import android.os.Bundle;  
import android.util.Log;  
import android.widget.ArrayAdapter;  
  
public class MainActivity extends ListActivity {  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
          
        SharedPreferences phonenumSP = getSharedPreferences("in_phone_num", Context.MODE_PRIVATE);  
        Map map = phonenumSP.getAll();  
        Object[] array = map.keySet().toArray();  
        Log.v("tag",map.toString()+map.size());  
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,array);  
          
        setListAdapter(adapter);  
    }  
}