首页 > 解决方案 > Android有来电时如何设置弹窗(Overlay)?

问题描述

我正在创建一个像 truecaller 这样的 Android 应用程序。所以我想要在开始来电或去电时设置弹出窗口。

我知道如何设置广播接收器,但我无法通过它设置弹出窗口。

标签: androidbroadcastreceiveroverlayreact-native-popup-dialog

解决方案


在 call Receiver 中启动此服务时,您可以使用以下代码设置弹出窗口:

public class ChatHead extends Service{

private WindowManager windowManager;
private ImageView chatHead;
WindowManager windowManager2;
String phoneNumber;
@Nullable
@Override
public IBinder onBind(Intent intent) {

    return null;
}

@Override public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {


    phoneNumber =  intent.getStringExtra("PhoneNumber");
    Log.d("newtag","StartService"+phoneNumber);



    windowManager2 = (WindowManager)getSystemService(WINDOW_SERVICE);


    LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view=layoutInflater.inflate(R.layout.header_file, null);

    Button btn1 = view.findViewById(R.id.button2);
    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("newtag","Click Chat");

            windowManager2.removeViewImmediate(view);
        }
    });



    TextView number_txt = view.findViewById(R.id.incoming_number);
    number_txt.setText(phoneNumber);


    WindowManager.LayoutParams params=new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
    );

    params.gravity= Gravity.TOP|Gravity.CENTER;
    params.x=0;
    params.y=0;
    windowManager2.addView(view, params);

    return super.onStartCommand(intent, flags, startId);


}

@Override
public void onDestroy() {
    super.onDestroy();
    if (chatHead != null){

        windowManager2.removeViewImmediate(chatHead);
    }
}

}

您可以像这样启动服务:

public class CallReceiver extends BroadcastReceiver {
    String phone_number;

@Override
public void onReceive(Context context, Intent intent) {


        String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

    if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){

        Log.i("newtag","outgoing number : "+number);


        Toast.makeText(context, "Call Start...!", Toast.LENGTH_SHORT).show();
        Intent intent1= new Intent(context,ChatHead.class);

        intent1.putExtra("PhoneNumber",number);
        context.startService(intent1);

    }else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)){
        Toast.makeText(context, "Call End...!", Toast.LENGTH_SHORT).show();

        Intent intent1= new Intent(context,ChatHead.class);
        context.stopService(intent1);

    }else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)){
        Log.i("newtag","Incoming number : "+number);
        Toast.makeText(context, "Incoming Call...!!", Toast.LENGTH_SHORT).show();
        Intent intent1= new Intent(context,ChatHead.class);

        intent1.putExtra("PhoneNumber",number);
        context.startService(intent1);

    }
}

}

您还需要像这样向清单文件添加服务:

<service
       android:name=".ChatHead"
        android:label="My Service" >
    </service>

推荐阅读