android - Android有来电时如何设置弹窗(Overlay)?
问题描述
我正在创建一个像 truecaller 这样的 Android 应用程序。所以我想要在开始来电或去电时设置弹出窗口。
我知道如何设置广播接收器,但我无法通过它设置弹出窗口。
解决方案
在 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>
推荐阅读
- xslt-3.0 - 如何通过流处理单个 xml 的两个部分?
- python - 将透视图转换为俯视图
- python - 如何在xml中保存数据
- angular - 将 Excel 数据转换为 Json 字符串时出错。FileReader.onload 不工作
- go - 如何使一个 pod 与另一个 pod 的 localhost 通信
- scala - sbt 目录结构的变体
- reactjs - 优化由反应脚本生成的包大小所需的建议
- google-maps - 带有 zIndex 的 Flutter Google-Map Markers 不能可靠地工作
- python - 从字符串和列表的元组中将所有值作为字符串返回
- angular - 何时使用 zone.run()?