这是我做的成品图,通过广播接收者来拦截拨出,使其无法拨出
1.定义广播接收者,来接收拨号发出的广播
public class CallReceiver extends BroadcastReceiver
{
boolean flag=false;
private String filterPhone;
@Override
public void onReceive(Context context, Intent intent) {
//判断是来电还是去电
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
//标识当前是拨出电话
flag = false;
//获取当前号码
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
if (phoneNumber.equals(filterPhone)){
Toast.makeText(context, "拦截成功", Toast.LENGTH_LONG).show();
setResultData(null);
Intent i = new Intent(Intent.ACTION_MAIN);
// i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //如果是服务里调用,必须加入new task标识
i.addCategory(Intent.CATEGORY_HOME);
context.startActivity(i);
}
}
}
public void setFilterPhone(String filterPhone){
this.filterPhone=filterPhone;
}
}
2.这是我的layout,大家可以自己设计布局,我用了一个依赖来加载gif,大家可以通过在bulid.gradle里的dependencies中加入,rebulid即可使用。
// GIF 图片 implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.6'
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="30dp"
android:textColor="@color/black"
android:textSize="16sp"/>
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_marginStart="30dp"
android:singleLine="true" />
<Button
android:id="@+id/save_button"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button"
android:layout_gravity="center"/>
<pl.droidsonroids.gif.GifImageView
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_gravity="center"
android:src="@drawable/lock" />
</LinearLayout>
3.这是MainActivity中的代码
public class MainActivity extends AppCompatActivity {
private CallReceiver callReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init(){
Button button=findViewById(R.id.save_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getPermission();
}
});
}
@Override
protected void onDestroy()
{
super.onDestroy();
unregisterReceiver(callReceiver);
}
private void setCallReceiver()
{
callReceiver=new CallReceiver();
EditText editText=findViewById(R.id.editText);
callReceiver.setFilterPhone(editText.getText().toString());
IntentFilter filter=new IntentFilter();
filter.addAction("android.intent.action.PHONE_STATE");
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
registerReceiver(callReceiver,filter);
}
private void getPermission() {
//判断版本号,在api23也就是6.0版本之前能直接获得权限
if(Build.VERSION.SDK_INT>=23)
{
int checkCALLPermission= ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
int checkOutCALLPermission=ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_OUTGOING_CALLS);
//判断是否具有权限
if(checkCALLPermission!= PackageManager.PERMISSION_GRANTED||checkOutCALLPermission!=PackageManager.PERMISSION_GRANTED)
{
//用以申请权限的方法,此时使用ActivityCompat类的该方法,以便于版本兼容
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE,
Manifest.permission.PROCESS_OUTGOING_CALLS},1);
return;
}else{
//如果已经获取了相关权限,调用initData()与initView()方法
setCallReceiver();
}
} else{
//如果api版本低于23,直接调用initData()与initView()方法
setCallReceiver();
}
}
//申请权限做出响应后的回调函数
public void onRequestPermissonsResult(int requestCode,String[] permissions,int[] grantResults) {
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "获取权限成功", Toast.LENGTH_SHORT).show();
//获取权限成功,动态注册广播接收者
setCallReceiver();
} else {
Toast.makeText(this, "获取权限失败", Toast.LENGTH_SHORT).show();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
4.在AndroidManifest.xml加入这些用户授权即可成功运行
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>