Call Helper class
package com.example.callrecording;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;
public class CallHelper {
private class CallStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
// called when someone is ringing to this phone
Toast.makeText(ctx,
"Incoming: "+incomingNumber,
Toast.LENGTH_LONG).show();
break;
}
}
}
/**
* Broadcast receiver to detect the outgoing calls.
*/
public class OutgoingReceiver extends BroadcastReceiver {
public OutgoingReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Toast.makeText(ctx,
"Outgoing: "+number,
Toast.LENGTH_LONG).show();
}
}
private Context ctx;
private TelephonyManager tm;
private CallStateListener callStateListener;
private OutgoingReceiver outgoingReceiver;
public CallHelper(Context ctx) {
this.ctx = ctx;
callStateListener = new CallStateListener();
outgoingReceiver = new OutgoingReceiver();
}
/**
* Start calls detection.
*/
public void start() {
tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
ctx.registerReceiver(outgoingReceiver, intentFilter);
}
/**
* Stop calls detection.
*/
public void stop() {
tm.listen(callStateListener, PhoneStateListener.LISTEN_NONE);
ctx.unregisterReceiver(outgoingReceiver);
}
}
主要活动
package com.example.callrecording;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private boolean detectEnabled;
private TextView textViewDetectState;
private Button buttonToggleDetect;
private Button buttonExit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewDetectState = (TextView) findViewById(R.id.textViewDetectState);
buttonToggleDetect = (Button) findViewById(R.id.buttonDetectToggle);
buttonToggleDetect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setDetectEnabled(!detectEnabled);
}
});
buttonExit = (Button) findViewById(R.id.buttonExit);
buttonExit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setDetectEnabled(false);
MainActivity.this.finish();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private void setDetectEnabled(boolean enable) {
detectEnabled = enable;
Intent intent = new Intent(this, callDetectService.class);
if (enable) {
// start detect service
startService(intent);
buttonToggleDetect.setText("Turn off");
textViewDetectState.setText("Detecting");
}
else {
// stop detect service
stopService(intent);
buttonToggleDetect.setText("Turn on");
textViewDetectState.setText("Not detecting");
}
}
}
调用检测类
package com.example.callrecording;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class callDetectService extends Service {
private CallHelper callHelper;
public callDetectService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
callHelper = new CallHelper(this);
int res = super.onStartCommand(intent, flags, startId);
callHelper.start();
return res;
}
@Override
public void onDestroy() {
super.onDestroy();
callHelper.stop();
}
@Override
public IBinder onBind(Intent intent) {
// not supporting binding
return null;
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.callrecording"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<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=".CallDetectService"
android:enabled="true"
android:exported="false" >
</service>
</application>
</manifest>
这是调用助手类中的代码我试图显示吐司,但我无法执行相同的操作。 所有文件都已共享。 有什么我可以在代码中改变,基本上我正在尝试开发通话记录器,请同时分享反馈意见。 提前谢谢你,我真的很感激。
答案 0 :(得分:1)
您应该使用广播接收器来获取呼叫详细信息,您应该在代码中使用与此类似的内容,作为参考看看此代码
public class CallBroadcastReceiver extends BroadcastReceiver {
Context contxt;
TelephonyManager telephony;
private boolean ring = false;
private boolean callReceived = false;
static String callerPhoneNumber = "";
SharePreferenceClass preferenceClass;
@Override
public void onReceive(final Context context, Intent intent) { // Get the
// current
// Phone State
contxt = context;
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
preferenceClass = new SharePreferenceClass(contxt);
telephony = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(new PhoneStateListener(),
PhoneStateListener.LISTEN_CALL_STATE);
Bundle bundle = intent.getExtras();
callerPhoneNumber = bundle.getString("incoming_number");
if (state == null) {
callerPhoneNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
System.out.println("CallFinishingBroadcastReceiver out going "
+ callerPhoneNumber);
return;
}
// If phone state "Rininging"
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
ring = true;
System.out.println("CallFinishingBroadcastReceiver ringing "
+ callerPhoneNumber);
}
// If incoming call is received
if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
callReceived = true;
System.out.println("offhook " + callerPhoneNumber);
}
// If phone is Idle
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
// If phone was ringing(ring=true) and not
// received(callReceived=false) , then it is a missed call
System.out.println("MISSED " + callerPhoneNumber);
if (ring == true && callReceived == false) {
System.out.println("CallFinishingBroadcastReceiver idle "
+ callerPhoneNumber);
} else if (ring == true && callReceived == true) {
System.out.println("CallFinishingBroadcastReceiver INCOMING "
+ callerPhoneNumber);
}
ring = false;
callReceived = false;
}
}
}
在清单文件中注册广播接收器
<receiver android:name=".CallBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" >
</action>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>