Step 1. Create one receiver to receive your call and detect,
MyPhoneReceiver.class
public class MyPhoneReceiver extends BroadcastReceiver {
private static final String AUDIO_RECORDER_FILE_EXT_AMR = ".amr";
public static final String AUDIO_RECORDER_FOLDER = "CallRecords";
private MediaRecorder recorder = null;
private int currentFormat = 0;
private int output_formats[] = { MediaRecorder.OutputFormat.AMR_NB };
private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_AMR };
Context context;
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
} else if (intent.getAction().equals(
"android.intent.action.PHONE_STATE")) {
handleCalls(context);
} else if (intent.getAction().equals(
"android.intent.action.NEW_OUTGOING_CALL")) {
handleOutgoingCalls(context, intent);
}
}
void sysAlert(String title, String msg, Context context) {
AlertDialog alert = new AlertDialog.Builder(context).setTitle(title)
.setMessage(msg)
.setNegativeButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create();
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alert.setCanceledOnTouchOutside(false);
alert.show();
}
public void onDestroy() {
telephony.listen(null, PhoneStateListener.LISTEN_NONE);
}
TelephonyManager telephony;
MyPhoneStateListener phoneListener;
void handleOutgoingCalls(Context context, Intent intent) {
String number = intent
.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
try {
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_RINGING)) {
Log.e("testing", "outgoing call Recording ringing");
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE)
.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
Log.e("testing", "outgoing call Recording OffHook");
try {
startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE)
.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
Log.e("testing", "outgoing call Recording idle");
try {
stopRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
void handleCalls(Context context) {
if (phoneListener == null) {
phoneListener = new MyPhoneStateListener(context);
telephony = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener,
PhoneStateListener.LISTEN_CALL_STATE);
}
}
public class MyPhoneStateListener extends PhoneStateListener {
Context context;
MyPhoneStateListener(Context context) {
this.context = context;
}
boolean ring = false;
boolean callReceived = false;
public void onCallStateChanged(int state, String incomingNumber) {
Log.e("Testing", "" + state + ", " + incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
ring = true;
// Database db = new Database(context);
// db.insertRecord(incomingNumber, "", Call_details.typeCall);
// db.close();
context.sendBroadcast(new Intent("onNewCall"));
Log.e("testing", "Incoming call Recording ringing");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
callReceived = true;
Log.e("testing", "Incoming call Recording OffHook");
// phoneRinging = true;
// phoneRinging = false;
try {
startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.e("testing", "Incoming call Recording idle");
try {
stopRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
if (ring == true && callReceived == false) {
Toast.makeText(context,
"It was A MISSED CALL from : " + incomingNumber,
Toast.LENGTH_LONG).show();
}
break;
}
}
}
private String getFilename() {
String filepath = Environment.getExternalStorageDirectory().getPath();
File file = new File(filepath, AUDIO_RECORDER_FOLDER);
if (!file.exists()) {
file.mkdirs();
}
return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]);
}
private void startRecording() {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(output_formats[currentFormat]);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(getFilename());
recorder.setOnErrorListener(errorListener);
recorder.setOnInfoListener(infoListener);
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopRecording() {
// if (null != recorder) {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
// }
}
private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
}
};
private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
}
};
}
--------------------------------------------------------------------------------------------
thats all, hope this is useful for somebody.. thanks
MyPhoneReceiver.class
public class MyPhoneReceiver extends BroadcastReceiver {
private static final String AUDIO_RECORDER_FILE_EXT_AMR = ".amr";
public static final String AUDIO_RECORDER_FOLDER = "CallRecords";
private MediaRecorder recorder = null;
private int currentFormat = 0;
private int output_formats[] = { MediaRecorder.OutputFormat.AMR_NB };
private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_AMR };
Context context;
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
} else if (intent.getAction().equals(
"android.intent.action.PHONE_STATE")) {
handleCalls(context);
} else if (intent.getAction().equals(
"android.intent.action.NEW_OUTGOING_CALL")) {
handleOutgoingCalls(context, intent);
}
}
void sysAlert(String title, String msg, Context context) {
AlertDialog alert = new AlertDialog.Builder(context).setTitle(title)
.setMessage(msg)
.setNegativeButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create();
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alert.setCanceledOnTouchOutside(false);
alert.show();
}
public void onDestroy() {
telephony.listen(null, PhoneStateListener.LISTEN_NONE);
}
TelephonyManager telephony;
MyPhoneStateListener phoneListener;
void handleOutgoingCalls(Context context, Intent intent) {
String number = intent
.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
try {
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_RINGING)) {
Log.e("testing", "outgoing call Recording ringing");
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE)
.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
Log.e("testing", "outgoing call Recording OffHook");
try {
startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE)
.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
Log.e("testing", "outgoing call Recording idle");
try {
stopRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
void handleCalls(Context context) {
if (phoneListener == null) {
phoneListener = new MyPhoneStateListener(context);
telephony = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener,
PhoneStateListener.LISTEN_CALL_STATE);
}
}
public class MyPhoneStateListener extends PhoneStateListener {
Context context;
MyPhoneStateListener(Context context) {
this.context = context;
}
boolean ring = false;
boolean callReceived = false;
public void onCallStateChanged(int state, String incomingNumber) {
Log.e("Testing", "" + state + ", " + incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
ring = true;
// Database db = new Database(context);
// db.insertRecord(incomingNumber, "", Call_details.typeCall);
// db.close();
context.sendBroadcast(new Intent("onNewCall"));
Log.e("testing", "Incoming call Recording ringing");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
callReceived = true;
Log.e("testing", "Incoming call Recording OffHook");
// phoneRinging = true;
// phoneRinging = false;
try {
startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.e("testing", "Incoming call Recording idle");
try {
stopRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
if (ring == true && callReceived == false) {
Toast.makeText(context,
"It was A MISSED CALL from : " + incomingNumber,
Toast.LENGTH_LONG).show();
}
break;
}
}
}
private String getFilename() {
String filepath = Environment.getExternalStorageDirectory().getPath();
File file = new File(filepath, AUDIO_RECORDER_FOLDER);
if (!file.exists()) {
file.mkdirs();
}
return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]);
}
private void startRecording() {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(output_formats[currentFormat]);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(getFilename());
recorder.setOnErrorListener(errorListener);
recorder.setOnInfoListener(infoListener);
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopRecording() {
// if (null != recorder) {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
// }
}
private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
}
};
private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
}
};
}
--------------------------------------------------------------------------------------------------------------------
Step 2:
Main class,
MainActivity.class
public class MainActivity extends Activity {
Context context;
Activity act;
ListView lvcall;
public static final String typeCall = "2";
public static final String typeOutgoingCall = "3";
BroadcastReceiver onNewCall = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
BroadcastReceiver onOutgoingCall = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = MainActivity.this;
act = MainActivity.this;
registerReceiver(onNewCall, new IntentFilter("onNewCall"));
registerReceiver(onOutgoingCall, new IntentFilter("onOutgoingCall"));
lvcall = (ListView) findViewById(R.id.lvcall);
callno_record = (TextView)findViewById(R.id.callno_record);
calldetails(typeCall, typeOutgoingCall);
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
unregisterReceiver(onNewCall);
unregisterReceiver(onOutgoingCall);
} catch (Exception e) {
e.printStackTrace();
Log.e("test", "crash in call details");
}
}
void calldetails(String type, String type1) {
Database db = new Database(act);
ArrayList<HashMap<String, String>> al = db.getRecord(type);
db.close();
for (int i = 0; i < al.size(); i++) {
HashMap<String, String> hm = al.get(i);
String name = getName(act.getContentResolver(),
hm.get(phoneNo));
// hm.put("name", hm.get(phoneNo) + " " + name);
hm.put("name", hm.get(phoneNo));
}
if (al.size() > 0) {
lvcall.setVisibility(View.VISIBLE);
SimpleAdapter adapter = null;
if (type.equals(typeCall)) {
adapter = new SimpleAdapter(act, al,
R.layout.call_details_view,
new String[] { "name", time }, new int[] {
R.id.txtPhoneNo, R.id.txtTime });
} else if (type1.equals(typeOutgoingCall)) {
adapter = new SimpleAdapter(act, al,
R.layout.call_details_view,
new String[] { "name", time }, new int[] {
R.id.txtPhoneNo, R.id.txtTime });
}
lvcall.setAdapter(adapter);
callno_record.setVisibility(View.GONE);
} else {
lvcall.setAdapter(null);
lvcall.setVisibility(View.GONE);
}
}
public String getName(ContentResolver cr, String phoneNo) {
Cursor phones = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, null);
while (phones.moveToNext()) {
String name = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phoneNumber = phoneNumber.trim().replaceAll(" ", "");
if (phoneNumber.equals(phoneNo))
return name;
}
phones.close();
return "UnKnown";
}
}
------------------------------------------------------------------------------------------------------------------------
Step 3.:
Allow permissions in your manifest file,
this is your uses permission:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
and receiver is here,
<receiver android:name="com.test.MyPhoneReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
--------------------------------------------------------------------------------------------
thats all, hope this is useful for somebody.. thanks
No comments:
Post a Comment