- Home /
Muting application during phonecall on Android(Call Popup)
Apparently there has been a new thing i wasn't aware of, and that is call popups. What this essentially does is it prompts you to answer/mute/decline the call without never leaving the current app you are focused on. Of course, since the app doesn't lose focus Unity doesn't mute it. Does anyone have a possible workaround for this?
Answer by Nonatomic · Mar 26, 2015 at 03:10 PM
Experienced the same issue. There's a setting on device under Settings
-> Call
-> Call-related pop-ups
called Call notification pop-ups
which can be toggled to test this.
I wrote a native extension to get the phone call status of the device. This can be extended to mute your application during a call.
Java code
package com.your.app.package;
import android.content.Context;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;
public class CallStatusBridge extends UnityPlayerActivity
{
private static int currentState = 0;
private static String gameObject = "callstate";
private static String callBackName = "OnCallStateChange";
protected void onCreate(Bundle savedInstanceState)
{
Log.d("Unity", "CallStatus created");
super.onCreate(savedInstanceState);
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener phoneStateListener = new PhoneStateListener()
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
currentState = 0;
break;
case TelephonyManager.CALL_STATE_RINGING:
currentState = 1;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
currentState = 2;
break;
default:
currentState = 0;
break;
}
Log.d("Unity", "CurrentState:" + currentState);
sendCallStateToUnity(currentState);
}
};
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
public static int getCallStatus()
{
return currentState;
}
public static void setCallBack(String gameObject, String callBackName)
{
Log.d("Unity", "setCallBack");
CallStatusBridge.gameObject = gameObject;
CallStatusBridge.callBackName = callBackName;
}
public static void sendCallStateToUnity(int state){
Log.d("Unity", "sendCallState");
UnityPlayer.UnitySendMessage(gameObject, callBackName, "" + state);
}
}
C# code
using UnityEngine;
using System.Collections;
public class CallStateBridge : MonoBehaviour {
#if UNITY_ANDROID
AndroidJavaObject jc;
#endif
void Start ()
{
#if UNITY_ANDROID
AndroidJNI.AttachCurrentThread();
jc = new AndroidJavaClass("com.ea.android.theimpossibleline.rowsamsung.CallStatusBridge");
jc.CallStatic("setCallBack", new object[2] {gameObject.name, "OnCallStateChange"});
#endif
}
public void OnCallStateChange(string state){
Debug.Log("call status:" + state);
}
#if UNITY_ANDROID
public int CheckCallStatus(){
return jc.CallStatic<int>("getCallStatus");
}
#endif
}
Add this to your Android Manifest in Unity
<!-- CallStatusBridge -->
<activity android:name=".CallStatusBridge"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
This is a bad piece of code because it requires READ_PHONE_STATE permission. It's already implemented withing Unity, but in a less intrusive way.
Answer by Orfen · Sep 25, 2015 at 07:56 AM
I ended up implementing a very similar solution to yours, but not having a bridge, just extending the unity activity and doing everything on the native side.
public class UnityPlayerNativeActivity extends NativeActivity
{
protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code
private Boolean wasPlaying;
// Setup activity layout
@Override protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
getWindow().takeSurface(null);
getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy
mUnityPlayer = new UnityPlayer(this);
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();
wasPlaying=true;
TelephonyManager mgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
mgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
PhoneStateListener mPhoneStateListener = new PhoneStateListener()
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if( state == TelephonyManager.CALL_STATE_RINGING )
{
if(wasPlaying){
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
wasPlaying=false;
}
}
else if(state == TelephonyManager.CALL_STATE_IDLE )
{ // Not in call: Play music
if(wasPlaying==false){
am.setStreamMute(AudioManager.STREAM_MUSIC, false);
wasPlaying=true;
}
}
else if( state == TelephonyManager.CALL_STATE_OFFHOOK )
{
if(wasPlaying==true){
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
wasPlaying=false;
}
}
super.onCallStateChanged(state, incomingNumber);
}
};
Answer by sandeepsmartest · Sep 25, 2015 at 12:40 PM
Try using "OnApplicationPause(bool PauseState)" based on the PauseStateboolean value try decreasing/increasing or switching off audio listener or making audio source mute. Hope this may help you.
Your answer
![](https://koobas.hobune.stream/wayback/20220613190311im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Keyboard doesn't popup on Android 4.4 with Unity 3.5 1 Answer
Disable/Enable Bluetooth on Android (NATIVE) 1 Answer
Read intent from Android Studio in Unity 0 Answers
popup message with a button 0 Answers
Android native popup window 4 Answers