- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android开发四大组件之实现电话拦截和电话录音由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、问题描述 。
使用BordercastReceiver和Service组件实现下述功能:
1.当手机处于来电状态,启动监听服务,对来电进行监听录音.
2.设置电话黑名单,当来电是黑名单电话,则直接挂断.
当拨打电话或电话状态发生改变时,系统就会发出有序广播,因此我们可以使用BordercastReceiver接受广播,因BordercastReceiver执行时间短不能执行耗时任务也不能使用子线程,因此我们应启动一个Service来监听电话并进行处理 。
2、加入AIDL文件 。
Android没有对外公开结束通话的API,要结束通话就必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,这样需要android 源码文件NeighboringCellInfo.aidl和ITelephony.aidl添加到项目中,如图所示:
Android Studio 会自动编译产生对应的类文件 。
3、编写TelReceiver组件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public
class
TelReceiver extends BroadcastReceiver {
public
TelReceiver() {
}
@Override
public
void
onReceive(Context context, Intent intent) {
Intent i=
new
Intent(context,ListenPhoneService.
class
);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setAction(intent.getAction());
i.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER,
intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER));
//电话号码
i.putExtra(TelephonyManager.EXTRA_STATE,
intent.getStringExtra(TelephonyManager.EXTRA_STATE));
//电话状态
context.startService(i);
//启动服务
}
}
|
注册广播:
1
2
3
4
5
6
|
<receiver android:name=
".TelReceiver"
>
<intent-filter android:priority=
"1000"
>
<action android:name=
"android.intent.action.PHONE_STATE"
/>
<action android:name=
"android.intent.action.NEW_OUTGOING_CALL"
/>
</intent-filter>
</receiver>
|
4、编写ListenPhoneService组件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
public
class
ListenPhoneService
extends
Service {
private
AudioManager mAudioManager;
private
TelephonyManager tm;
public
ListenPhoneService() {
}
@Override
public
void
onCreate() {
super
.onCreate();
mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
tm=(TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE);
}
@Override
public
int
onStartCommand(Intent intent,
int
flags,
int
startId) {
if
(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
//去电广播,android没有来电话广播
}
else
{
//去掉拨打电话就是来电状态了
//方法1
//获得来电电话
// String number=intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
//获得电话状态
// String state=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
// Log.d("jereh", "incoming phone:" + number);
// Log.d("jereh","call state:"+state);
// TelephonyManager.EXTRA_STATE_IDLE: 没有来电 或者 挂断
// TelephonyManagerEXTRA_STATE_OFFHOOK: 接起电话
// TelephonyManager.EXTRA_STATE_RINGING:当电话呼入时,响铃时
// if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){
// if(number.equals("13280998858")){//拦截指定的电话号码
// mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
// Log.d("jereh","电话被拦截");
// stopCall();
// mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复铃声
// }
// }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
//接起电话
// recordCall();//开始录音
// }else if(state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
// stopCall();//停止录音
// }
//方法2
// 设置一个监听器,监听电话状态
tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
}
return
super
.onStartCommand(intent, flags, startId);
}
/**
* 挂断电话
*/
private
void
stopCall(){
try
{
//Android的设计将ServiceManager隐藏了,所以只能使用反射机制获得。
Method method=Class.forName(
"android.os.ServiceManager"
).getMethod(
"getService"
, String.
class
);
IBinder binder=(IBinder)method.invoke(
null
,
new
Object[]{
"phone"
});
//获得系统电话服务
ITelephony telephoney=ITelephony.Stub.asInterface(binder);
telephoney.endCall();
//挂断电话
stopSelf();
//停止服务
}
catch
(Exception e) {
e.printStackTrace();
}
}
PhoneStateListener listener=
new
PhoneStateListener(){
@Override
public
void
onCallStateChanged(
int
state,String incomingNumber){
switch
(state){
//手机空闲了
case
TelephonyManager.CALL_STATE_IDLE:
stopCall();
//停止录音
break
;
//接起电话
case
TelephonyManager.CALL_STATE_OFFHOOK:
recordCall();
//开始录音
break
;
// 响铃时
case
TelephonyManager.CALL_STATE_RINGING:
Log.e(
"jereh"
,
"来电号码是:"
+ incomingNumber);
// 如果该号码属于黑名单
if
(incomingNumber.equals(
"123456"
)) {
// 如果是黑名单,就进行屏蔽
stopCall();
}
break
;
}
}
};
/**
* 停止录音
*/
private
void
stopRecord(){
if
(recording){
recorder.stop();
recorder.release();
recording=
false
;
stopSelf();
//停止服务
}
}
/**
* 电话录音
*/
private
MediaRecorder recorder;
private
boolean
recording ;
private
void
recordCall(){
Log.d(
"jereh"
,
"record calling"
)
if
( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
recorder=
new
MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//读麦克风的声音
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置输出格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 编码方式
File file=
new
File(Environment.getDownloadCacheDirectory().getAbsolutePath(),
"recorder"
);
if
(!file.exists()){
file.mkdir();
}
recorder.setOutputFile(file.getAbsolutePath() +
"/"
+ System.currentTimeMillis() +
"3gp"
);
// 存放的位置是放在sd卡recorder目录下
try
{
recorder.prepare();
recorder.start();
recording=
true
;
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
@Override
public
IBinder onBind(Intent intent) {
throw
new
UnsupportedOperationException(
"Not yet implemented"
);
}
}
|
Service XML配置 。
1
2
3
4
5
|
<
service
android:name
=
".ListenPhoneService"
android:enabled
=
"true"
android:exported
=
"true"
>
</
service
>
|
5、最后别忘了一些权限的设置 。
<!-- 添加访问手机电话状态的权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 拨打电话权限 --> <uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 监听手机去电的权限 --> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 。
好了,以上就是本文的全部所述,希望对大家学习android四大基本组件有所帮助,谢谢.
最后此篇关于Android开发四大组件之实现电话拦截和电话录音的文章就讲到这里了,如果你想了解更多关于Android开发四大组件之实现电话拦截和电话录音的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 twilio JS 客户端从 Web 进行调用。客户端调用后端获取 token 。这里是返回 token 的后端代码。如何记录通话。表示在哪里设置录制网址。通话成功。但是不知道从哪里传录音
我有一个软件,可以记录 5 秒间隔的声音,然后将其发送进行处理。它在无限循环中运行,如下所示: while (true) { System.out.println("recording..")
我目前正在做一个项目,需要录制 iPhone 播放的声音。通过这个,我的意思是录制在后台播放的声音,如声音剪辑或其他任何东西,而不是使用内置麦克风。 这能做到吗?我目前正在试验 AVAudioReco
当我将蓝牙免提连接到 Android 手机设备时,是否可以使用手机麦克风录制声音并在免提中听到? 我设法通过手机麦克风录制声音,并通过手机扬声器或耳机听到声音。但是当耳机有麦克风时,通常是免提,它默认
我想访问我在我的应用程序中记录的跟踪数据和自定义数据。 有人可以提供不同数据轨道保存在 mp4 中的格式吗? 使用这个例子https://github.com/google-ar/arcore-and
我想知道,在C++中进行音频记录/回放/搜索的跨平台实用工具是什么?我当时在考虑采用ALUT(OpenAL)的路线,但是有更好的方法吗?如果不是,你们是否知道ALUT的任何优秀教程/示例代码? 最佳答
我目前正在开发一个项目,该项目允许用户录制音频消息,但是最近提出了一个要求,允许他们暂停录制过程,然后继续录制(将新的音频追加到之前的录制之后)。 示例: 用户按下记录并进行初始记录。 用户按下暂停按
我见过几个这样的例子,但它们似乎是针对旧版本的 SDK。我正在尝试设置基本的录音,以下代码在针对 SDK 2.0 版时给我一个 NullPointerException。 ContentValues
我开发了一款安卓游戏,使用 Audio Record 获取麦克风输入。 可以看一下https://play.google.com/store/apps/details?id=fixappmedia.m
我想在最近的项目中使用该插件进行音频捕获。我找到了 Matt Diamond 的努力 demo here正如大多数文章所指向的那样。我尝试在本地重新创建这个完全相同的演示,但没有成功。 我包括了所有依
我正在设置录音机,但在 soundRecorder = try AVAudioRecorder(URL: getFileURL(), settings: recordSettings as! [Str
作为一名吉他手,我一直想开发自己的录音、混音软件。我在 Direct Sound、Windows Multimedia(waveOutOpen 等)方面有一些经验。我意识到这将是一个复杂的项目,但纯粹
我不想记录我自己的击键来创建 asciinema 教程,而是想编写它们的脚本,这样我就可以随着时间的推移轻松地改进我的教程,而不必担心每次我想进行更改时都要重做,或者花很多时间尝试更正录音中的错别字。
我正在尝试使用 Flutter 构建一个应用程序,其中包含录音机。如何访问录音机?请帮我弄清楚它的包、依赖项和代码。 最佳答案 您可以使用 audio_recorder 包: https://pub.
掌握 Java Flight recorder (JFR) 配置,我有一个最合理的配置: -XX:+UnlockCommercialFeatures -XX:+DebugNonSafepoints -
我正在尝试播放我从 twilio 取回的通话录音。到目前为止,我在我的网站上有一个所有通话录音的列表,当我点击它们时,它会将我发送到 twilio 以收听它们。然后我发出一个 ajax 请求以从 tw
我们可以用 iPhone 直接线路输入录制音频吗? 最佳答案 唯一的方法是使用底座连接器创建您自己的配件,然后使用提供的 API! 关于iPhone LINE-IN 录音 可以吗?,我们在Stack
基本上,我希望用户使用 SoundCloud 录音机录制声音,一旦他们单击“保存”,他们刚刚录制的声音就会嵌入到我的网页中。 我使用 SC.record() 方法来获取录音。这是我保存录音的功能...
我正在尝试在网站中实现录音。基本上,用户应该能够按下一个按钮并对着麦克风说些什么。然后应将录制的音频发送到服务器以进行进一步处理。我知道您可以使用 Flash 做到这一点,但现在我正在努力避免这种情况
我正在尝试“录制”一个音频文件,我读过这个 doc ,实际上我想在文件中将“采样”值记录为双倍值,这是我使用的代码(不起作用,我不知道为什么没有): /* Use the newer ALSA API
我是一名优秀的程序员,十分优秀!