1:实现打进来的电话的黑名单
来电时,可以获得对方的手机号,如果属于sharedreference中的一个(黑名单用户),则自动挂掉电话,并且加一个notification,来提醒手机用户,有电话打过来,但是已经挂掉了。这个可以用service实现。
Broadcast Reveiver接受系统服务,并且启动自己的服务把手机
在网上搜索了一下,感觉不是这么简单的,用到的是如下的方法:
http://blog.youkuaiyun.com/csy172775922/article/details/6906867
http://www.open-open.com/lib/view/open1406514153905.html
现在结合上述例子(http://files.cnblogs.com/files/MyJie/JieList.rar),总结出来经验如下:
怎样挂断电话?
Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null, new Object[]{TELEPHONY_SERVICE});
ITelephony telephony = ITelephony.Stub.asInterface(binder);
telephony.endCall();
思路:用数据库方法,存储联系人的电话号码
利用反射方法,监听电话状态,声明的权限如下:
<receiver android:name=".BroadcastJie">
<intent-filter android:priority="999">
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
以便系统启动了之后就还是可以有黑名单!
在broadcastreceiver中,启动服务的方法是这样的:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BroadcastJie extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//判断电话状态,如果是拨打电话,什么都不做,否则执行else,启动其监听的Service
if (intent.getAction().equals(
Intent.ACTION_NEW_OUTGOING_CALL)){
}
else{
Intent Sbintent = new Intent(context,blacklistService.class);
context.startService(Sbintent);
}
}
}
整个blacklistService.java是这样的:
package my.Jielist.it;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.app.Service;
import android.content.Intent;
import android.database.Cursor;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
public class blacklistService extends Service {
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this
, "mydatabase.db3" , null, 1);
TelephonyManager tManager;
CustomPhoneCallListener cpListener;
public class CustomPhoneCallListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
// 当电话呼入时
case TelephonyManager.CALL_STATE_RINGING:
// 如果该号码属于黑名单
System.out.println("this is 1") ;
if (isBlock(incomingNumber))
{
System.out.println("this is 2") ;
try
{
Method method = Class.forName(
"android.os.ServiceManager").getMethod(
"getService", String.class);
// 获取远程TELEPHONY_SERVICE的IBinder对象的代理
IBinder binder = (IBinder) method.invoke(null,
new Object[] { TELEPHONY_SERVICE });
// 将IBinder对象的代理转换为ITelephony对象
ITelephony telephony = ITelephony.Stub
.asInterface(binder);
// 挂断电话
telephony.endCall();
}
catch (Exception e)
{
e.printStackTrace();
}
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
public boolean isBlock(String phone)
{
Cursor cursor =dbHelper.getReadableDatabase().rawQuery(
"select * from List",null);
while(cursor.moveToNext()){
if (cursor.getString(1).equals(phone)){
return true;
}
}
return false;
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
cpListener = new CustomPhoneCallListener();
// 通过TelephonyManager监听通话状态的改变
tManager.listen(cpListener, PhoneStateListener.LISTEN_CALL_STATE);
super.onStart(intent, startId);
}
}