让Android手机黑名单来电实现自动静音

来源:互联网 发布:android的数据存储方式 编辑:程序博客网 时间:2024/04/29 13:15

当呼叫者属于黑名单列表 自动静音

[代码 步骤]

本着先易后难的原则 先介绍黑名单列表的制作:其会列出所有联系人列表 以CheckBox形式 可以添加/移除 黑名单

1. 定义所需布局:list.xml

Java代码

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    >  
<ListView    
    android:id="@+id/list" 
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    />  
<Button    
    android:id="@+id/btnOK" 
    android:layout_gravity="right" 
    android:text="OK" 
    android:layout_width="100dip"   
    android:layout_height="wrap_content"   
    />  
</LinearLayout> 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView 
 android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
<Button 
 android:id="@+id/btnOK"
 android:layout_gravity="right"
 android:text="OK"
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    />
</LinearLayout>
 

2. 初始化View

Java代码

public void initial(){  
        initialView();  
    }  
      
    public void initialView(){  
        lView = (ListView)findViewById(R.id.list);  
        btnOK = (Button)findViewById(R.id.btnOK);  
    } 

public void initial(){
     initialView();
    }
   
    public void initialView(){
     lView = (ListView)findViewById(R.id.list);
     btnOK = (Button)findViewById(R.id.btnOK);
    }

3. 定义ContactsAdapter 用于列出使用联系人

Java代码

public class ContactsAdapter extends BaseAdapter {  
        Activity activity;  
          
        public ContactsAdapter(Activity a){  
            activity = a;  
        }  
        @Override 
        public int getCount() {  
            // TODO Auto-generated method stub  
            return cursor.getCount();  
        }  
 
        @Override 
        public Object getItem(int arg0) {  
            // TODO Auto-generated method stub  
            return arg0;  
        }  
 
        @Override 
        public long getItemId(int arg0) {  
            // TODO Auto-generated method stub  
            return arg0;  
        }  
 
        @Override 
        public View getView(int arg0, View arg1, ViewGroup arg2) {  
            // TODO Auto-generated method stub  
            CheckBox rb = new CheckBox(activity);  
            rb.setText(" "+getNameById(arg0)+"  |"+getNumberById(arg0));  
            return rb;  
              
        }  
          
    } 

public class ContactsAdapter extends BaseAdapter {
     Activity activity;
     
     public ContactsAdapter(Activity a){
      activity = a;
     }
  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   return cursor.getCount();
  }

  @Override
  public Object getItem(int arg0) {
   // TODO Auto-generated method stub
   return arg0;
  }

  @Override
  public long getItemId(int arg0) {
   // TODO Auto-generated method stub
   return arg0;
  }

  @Override
  public View getView(int arg0, View arg1, ViewGroup arg2) {
   // TODO Auto-generated method stub
   CheckBox rb = new CheckBox(activity);
   rb.setText(" "+getNameById(arg0)+" |"+getNumberById(arg0));
   return rb;
   
  }
     
    }

其中  getNameById() getNumberById() 可以根据position 返回联系人的名字和号码

Java代码

public String getNameById(int id){  
        cursor.moveToPosition(id);  
 
        int index = cursor.getColumnIndex(People.NAME);  
          
        return cursor.getString(index);  
    }  
      
    public String getNumberById(int id){  
        cursor.moveToPosition(id);  
 
        int index = cursor.getColumnIndex(People.NUMBER);  
          
        return cursor.getString(index);  
    }  
 
 
其中 cursor = getContentResolver().query(People.CONTENT_URI,   
                null, null, null, null); 

public String getNameById(int id){
     cursor.moveToPosition(id);

     int index = cursor.getColumnIndex(People.NAME);
     
     return cursor.getString(index);
    }
   
    public String getNumberById(int id){
     cursor.moveToPosition(id);

     int index = cursor.getColumnIndex(People.NUMBER);
     
     return cursor.getString(index);
    }


其中 cursor = getContentResolver().query(People.CONTENT_URI,
                null, null, null, null);

 3. ContactsAdapter 实例化

Java代码

adapter = new ContactsAdapter(this);  
        lView.setAdapter(adapter); 

adapter = new ContactsAdapter(this);
        lView.setAdapter(adapter);

4. 当按下btnOK 得到所有黑名单 并返回给前Activity:BlacklistMain

Java代码
 
btnOK.setOnClickListener(new OnClickListener(){  
            @Override 
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
                loadContactsChecked();  
            }  
              
        }); 

btnOK.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    loadContactsChecked();
   }
         
        });

5. loadContactsChecked 用于获取所有选中联系人列表 并返回之

Java代码

public void loadContactsChecked(){  
        List<String> list = new ArrayList<String>();  
          
        for(int i=0;i<lView.getCount();i++){  
            CheckBox rButton = (CheckBox)lView.getChildAt(i);  
              
            if(rButton.isChecked()){  
                list.add(getNumberById(i));  
            }  
        }  
          
        sendBack(list);  
    }  
      
    public void sendBack(List<String> l){  
        Intent intent = new Intent();  
        Bundle bundle = new Bundle();  
          
        String[] sArray = new String[l.size()];  
        l.toArray(sArray);  
          
        bundle.putStringArray("phone", sArray);  
          
        intent.putExtras(bundle);  
          
        this.setResult(RESULT_OK, intent);  
        this.finish();  
          
    } 

public void loadContactsChecked(){
     List<String> list = new ArrayList<String>();
     
     for(int i=0;i<lView.getCount();i++){
      CheckBox rButton = (CheckBox)lView.getChildAt(i);
      
      if(rButton.isChecked()){
       list.add(getNumberById(i));
      }
     }
     
     sendBack(list);
    }
   
    public void sendBack(List<String> l){
     Intent intent = new Intent();
     Bundle bundle = new Bundle();
     
     String[] sArray = new String[l.size()];
     l.toArray(sArray);
     
     bundle.putStringArray("phone", sArray);
     
     intent.putExtras(bundle);
     
     this.setResult(RESULT_OK, intent);
     this.finish();
     
    }


至此 黑名单列表选取 已经完成 下面讲自动静音功能 文件为:BlacklistMain

布局:main.xml

Java代码

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    >  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    >  
<Button  
    android:id="@+id/buttonMain"    
    android:singleLine="true" 
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="黑名单" 
    />  
<Button  
    android:id="@+id/buttonClear"    
    android:singleLine="true" 
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="清屏" 
    />  
<Button  
    android:id="@+id/buttonList"    
    android:singleLine="true" 
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="列举" 
    />  
</LinearLayout>  
<TextView  
    android:id="@+id/status"    
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    />  
</LinearLayout> 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
<Button
 android:id="@+id/buttonMain" 
 android:singleLine="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="黑名单"
    />
<Button
 android:id="@+id/buttonClear" 
 android:singleLine="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="清屏"
    />
<Button
 android:id="@+id/buttonList" 
 android:singleLine="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="列举"
    />
</LinearLayout>
<TextView
 android:id="@+id/status" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

1. 与BlacklistManager 即:黑名单列表选取 连接 的代码

* 单击buttonMain 跳转至BlacklistManager

Java代码

findViewById(R.id.buttonMain).setOnClickListener(new OnClickListener(){  
            @Override 
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
                sendGo();  
            }  
              
        }); 

findViewById(R.id.buttonMain).setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    sendGo();
   }
         
        });

sendGo() 实现:

Java代码

public void sendGo(){  
        Intent i = new Intent(BlockMain.this,BlockManager.class);  
        this.startActivityForResult(i, ACTIVITY_CONTACTS_DO_CHECKED);  
    } 

public void sendGo(){
     Intent i = new Intent(BlockMain.this,BlockManager.class);
     this.startActivityForResult(i, ACTIVITY_CONTACTS_DO_CHECKED);
    }

其中 ACTIVITY_CONTACTS_DO_CHECKED 为int 用于标记具体是那个startActivity 之用

Java代码
public final static int ACTIVITY_CONTACTS_DO_CHECKED = 20; 

public final static int ACTIVITY_CONTACTS_DO_CHECKED = 20; 

 * Activity 返回处理 即:从Intent中取出所有选中联系人列表 并存入List<String> 中

Java代码

protected void onActivityResult(int requestCode, int resultCode,  
            Intent data) {  
        switch(requestCode){  
        case ACTIVITY_CONTACTS_DO_CHECKED:  
            Bundle b = data.getExtras();  
              
            String[] s = b.getStringArray("phone");  
              
            blockList.clear();  
            for(String i:s){  
                blockList.add(i);  
            }  
              
            showBloclist();  
              
            break;  
        }  
          
          
    } 

protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
     switch(requestCode){
     case ACTIVITY_CONTACTS_DO_CHECKED:
      Bundle b = data.getExtras();
      
      String[] s = b.getStringArray("phone");
      
      blockList.clear();
      for(String i:s){
       blockList.add(i);
      }
      
      showBloclist();
      
      break;
     }
     
     
    }

下面主要说下 电话呼叫拦截且静音 代码

1. 继承PhoneStateListener 并实现其中的onCallStateChanged() 即:根据不同电话状态做定制化

Java代码

public class CustomPhoneCallListener extends PhoneStateListener {  
        @Override   
        public void onCallStateChanged(int state, String incomingNumber){  
 
            switch(state){  
            case TelephonyManager.CALL_STATE_IDLE:   
                textStatus.append("\n"+"status:CALL_STATE_IDLE");  
                  
                aManager.setRingerMode(AudioManager.  
                          RINGER_MODE_NORMAL);   
                break;  
                  
            case TelephonyManager.CALL_STATE_OFFHOOK:  
                textStatus.append("\n"+"status:CALL_STATE_OFFHOOK");  
                break;  
                  
            case TelephonyManager.CALL_STATE_RINGING:  
                textStatus.append("\n"+"status:CALL_STATE_RINGING:"+incomingNumber);  
                  
                showBloclist();  
                  
                if(isBlock(incomingNumber)){  
                    aManager.setRingerMode(AudioManager.  
                          RINGER_MODE_SILENT);  
                    showToast("Call-number:"+incomingNumber+"|silent");  
                }  
                else {  
                    showToast("Call-number:"+incomingNumber);  
                }  
                  
                break;  
            }  
              
            super.onCallStateChanged(state, incomingNumber);  
              
        }  
          
    } 

public class CustomPhoneCallListener extends PhoneStateListener {
     @Override
        public void onCallStateChanged(int state, String incomingNumber){

      switch(state){
      case TelephonyManager.CALL_STATE_IDLE:
       textStatus.append("\n"+"status:CALL_STATE_IDLE");
       
       aManager.setRingerMode(AudioManager.
                       RINGER_MODE_NORMAL);
       break;
       
      case TelephonyManager.CALL_STATE_OFFHOOK:
       textStatus.append("\n"+"status:CALL_STATE_OFFHOOK");
       break;
       
      case TelephonyManager.CALL_STATE_RINGING:
       textStatus.append("\n"+"status:CALL_STATE_RINGING:"+incomingNumber);
       
       showBloclist();
       
       if(isBlock(incomingNumber)){
        aManager.setRingerMode(AudioManager.
                         RINGER_MODE_SILENT);
        showToast("Call-number:"+incomingNumber+"|silent");
       }
       else {
        showToast("Call-number:"+incomingNumber);
       }
       
       break;
      }
      
      super.onCallStateChanged(state, incomingNumber);
      
     }
     
    }

其中 isBlock() 用于判断来电号码是否在黑名单中 实现为:

Java代码

public boolean isBlock(String s){  
        //to load all String stored in List<String> to String[]  
        String[] bArray = new String[blockList.size()];  
        blockList.toArray(bArray);  
 
        for(String s1:bArray){  
            if(s1.replace("-", "").equals(s)){  
                return true;  
            }  
        }  
        return false;  
    } 

public boolean isBlock(String s){
     //to load all String stored in List<String> to String[]
     String[] bArray = new String[blockList.size()];
     blockList.toArray(bArray);

     for(String s1:bArray){
      if(s1.replace("-", "").equals(s)){
       return true;
      }
     }
     return false;
    }

对了 在最后别忘了监听电话状态 即:

Java代码

public void managerCallListener(){  
        aManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
        tManager = (TelephonyManager)getSystemService(  
                TELEPHONY_SERVICE);  
          
        cpListener = new CustomPhoneCallListener();   
          
        tManager.listen(cpListener, PhoneStateListener.  
            LISTEN_CALL_STATE);  
          
    } 

public void managerCallListener(){
     aManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
     tManager = (TelephonyManager)getSystemService(
                TELEPHONY_SERVICE);
     
     cpListener = new CustomPhoneCallListener();
       
        tManager.listen(cpListener, PhoneStateListener.
            LISTEN_CALL_STATE);
       
    }

3. emulator 运行截图:

* 添加黑名单 选取:137 128

\

* 以号码:137 呼叫该emulator 即:gsm call 137

\

最后 BS android ! 不知道什么原因 开始在emulator 老失败 后来发现其不能打/接听电话 一拨出电话 就提示: Not register on network. 没办法 只有重新创建emulator再试

至于怎么以指导号码向该emulator打电话 以前的博客有 大家自己找一下吧!

done!!!

原创粉丝点击