質問

I have two phones which are paired and connected via bluetooth. How to programmatically check at one phone's end whether the other phone is getting an incoming call? Should I use a particular profile for this, that is, PBAP or HFP? If yes, how I am to do this?

Once I detect this, if I want to receive the incoming call via the connected phone, how should I implement that?

役に立ちましたか?

解決

Download Hands Free Profile pdf. It is available easily. It provides you all details about how HFP works and AT commands supported by HFP for communication. No APIs available for this.

As eliasj said, you need to implement HFP and when two phones get connected, you can communicate between them via AT commands.

Suppose you have 1st phone which is Android device and 2nd phone Android or any device and they both are connected over HFP.

I don't have complete code but I can suggest you some AT commands -
1. Using AT+CIND? command you can read indicator status of other phone.
2. To enable reporting for Indicator status change, you need to use AT+CMER=3,0,0,1 command.
3. Once you get valid response from 'AT+CMER' command, you can use AlarmManager that will start a service which continuously reads the input stream of Bluetooth Socket.
4. Because of step 2., if the 2nd phone is having any incoming call, the input stream of Bluetooth Socket will contains RING as an alert.
I have used service implementing a Runnable. Here is a sample code for step 4.-

public void run()
{
    try
    {
        // Get input and output streams from Bluetooth socket.
        m_oInputStream = m_oBluetoothSocket.getInputStream();
        m_oOutputStream = m_oBluetoothSocket.getOutputStream();

        // Read input stream for +CIEV response is given or not.
        byte[] buffer = new byte[200];
        int nNumberOfBytesRead = m_oInputStream.read(buffer);

        String strResponse = new String(buffer).trim();

        if(true == strResponse.contains("RING"))
        {
            // Contains RING Alert. Answer the call.                
            // Start Activity for handling Incoming Call.
            Intent oIncomingCallActivityIntent = new Intent(getApplicationContext(), IncomingCallActivity.class);
            oIncomingCallActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            getApplicationContext().startActivity(oIncomingCallActivityIntent);

            // Stop service.
            stopSelf(); 
        }
    }
    catch(Exception e)
    {
        // Log the error.
    }
}

You need to implement acivity that handles incoming call. It will accept or reject call. To accept incoming call AT+ATA command is used. You will receive "OK" as a response from 2nd phone.

I hope this will help you.

他のヒント

You should implement HFP (the hands-free side). When I looked at this problem over a year ago it was not possible to send the audio between to phones (Android) but it could have change now.

Look at the Q/A in How to send AT commands based on BT Hands-Free profile in android? (hit on how to connect) and in the HFP spec https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=238193 (for how the profile works (incoming call on page 36))

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top