如何在黑莓中录制电话?

时间:2011-08-24 11:49:04

标签: blackberry call

我想在黑莓中创建一个呼叫记录器应用程序。在这个论坛中搜索时,我得到了call-recorder-in-blackberry这个链接。下面链接中给出的代码是公平的。

对于你的专家来说,这可能是一个愚蠢的问题,但我的问题是如何对我们这段代码。我的意思是MyScreen对象可以在UIApplication上运行。但是如何让我的模块在启动设备时启动,并在后台运行等待电话呼叫监听器调用。


我使用了以下代码,它记录了通话,但仅在通话时使用扬声器模式。现在我怎样才能在不放大扬声器模式的情况下做同样的事情。

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 {

    Player player;
    RecordControl recorder;
    private ByteArrayOutputStream output;
    byte[] data;
    boolean yes = false;
    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) {

        // TODO Auto-generated method s
        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("unable 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;
    }
}

2 个答案:

答案 0 :(得分:1)

实际上,使用黑莓手机无法进行直接通话录音。发布代码的AFAIK是通过免提电话拨打电话录音。这意味着如果手机有扬声器,则拨打扬声器并录制该声音。看看这个讨论,Call recorder in Blackberry.

答案 1 :(得分:1)

您无法像正在尝试的那样录制电话的音频(除了使用扬声器)。这是故意的。您需要在设备上采用另一种方法来执行此操作。但是,我可以回答你的其他问题:

要使您的应用程序自动启动,您可以按照以下步骤操作:http://supportforums.blackberry.com/t5/Java-Development/Configure-an-application-to-start-automatically-when-the/ta-p/444748

此外,由于上面的这个应用程序没有从UiApplication延伸,所以当你按照上面的说明操作时,你应该检查“作为系统模块运行”框。这样它就不会出现在功能区上或作为应用程序列表中的图标。