To record call in blackberry we should have the knowledge of PhoneListener interface to listen phone call events, Player class to record the call. And, finally FileConnection API to save the recorded file in file system.
One limitation of PhoneListener, it works fine while the call is in loudspeaker mode, but it doesn’t work normal mode.
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.microedition.io.file.FileConnection; import javax.microedition.media.Manager; import javax.microedition.media.Player; import javax.microedition.media.control.RecordControl; import net.rim.blackberry.api.phone.Phone; import net.rim.blackberry.api.phone.PhoneCall; import net.rim.blackberry.api.phone.PhoneListener; import net.rim.device.api.system.Application; import net.rim.device.api.ui.component.Dialog; public class CatchCall extends Application implements PhoneListener { private Player player; private RecordControl recorder; private ByteArrayOutputStream output; private byte[] data; private boolean yes = false; private int st; public CatchCall() { Phone.addPhoneListener(this); } public static void main(String[] args) { new CatchCall().enterEventDispatcher(); } public void callAdded(int callId) { } public void callAnswered(int callId) { } public void callConferenceCallEstablished(int callId) { } public void callConnected(int callId) { PhoneCall phoneCall = Phone.getCall(callId); if (phoneCall != null) { if (yes) initPlay(); } } public void callDirectConnectConnected(int callId) { } public void callDirectConnectDisconnected(int callId) { } public void callDisconnected(int callId) { // TODO Auto-generated method stub if (yes) { try { recorder.commit(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } player.close(); data = output.toByteArray(); saveRecordedFile(data); } } public void callEndedByUser(int callId) { } public void callFailed(int callId, int reason) { } public void callHeld(int callId) { } public void callIncoming(int callId) { Dialog.ask(Dialog.D_YES_NO, "Are u sure to record this call"); } public void callInitiated(int callid) { PhoneCall phoneCall = Phone.getCall(callid); if (phoneCall != null) { st = Dialog.ask(Dialog.D_YES_NO, "Are u sure to record this call"); if (st == Dialog.YES) yes = true; else yes = false; } } public void callRemoved(int callId) { } public void callResumed(int callId) { } public void callWaiting(int callid) { } public void conferenceCallDisconnected(int callId) { } private void initPlay() { try { player = Manager.createPlayer("capture://audio"); player.realize(); recorder = (RecordControl) player.getControl("RecordControl"); output = new ByteArrayOutputStream(); recorder.setRecordStream(output); recorder.startRecord(); player.start(); } catch (Exception e) { Dialog.alert(e + ""); } } public static boolean saveRecordedFile(byte[] data) { try { String filePath1 = System.getProperty("fileconn.dir.music"); String fileName = "Call Recorder("; boolean existed = true; for (int i = 0; i < Integer.MAX_VALUE; i++) { try { FileConnection fc = (FileConnection) Connector.open(filePath1 + fileName + i + ").amr"); if (!fc.exists()) { existed = false; } fc.close(); } catch (IOException e) { Dialog.alert("Failed to save"); return existed; } if (!existed) { fileName += i + ").amr"; filePath1 += fileName; break; } } System.out.println(filePath1); System.out.println(""); FileConnection fconn = (FileConnection) javax.microedition.io.Connector .open(filePath1, javax.microedition.io.Connector.READ_WRITE); if (fconn.exists()) fconn.delete(); fconn.create(); OutputStream outputStream = fconn.openOutputStream(); outputStream.write(data); outputStream.close(); fconn.close(); return true; } catch (Exception e) { } return false; } }