当前位置: 首页 > 知识库问答 >
问题:

Android本机来电屏幕上的弹出窗口,如真来电Android应用程序

权浩阔
2023-03-14

我正在开发一个广播接收器的来电在Android和收到来电我想在本机进线量屏幕上膨胀弹出。

我完成了那个代码。但是现在的问题是,在Android 4.1(Jelly Bean)API级别17中,当电话铃声响起时,PHONE_STATEOFF HOOK的形式出现,如果我调用一个活动,它会被调用,但是下面的代码它不会被处决。我列出的代码:

package com.example.popwindowonincomingcallscreen;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;

public class IncomingBroadcastReceiver extends BroadcastReceiver {

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

        Log.d("IncomingBroadcastReceiver: onReceive: ", "flag1");

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        Log.d("IncomingBroadcastReceiver: onReceive: ", state);
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)
                || state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {

            Log.d("Ringing", "Phone is ringing");

            Intent i = new Intent(context, IncomingCallActivity.class);
            i.putExtras(intent);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            Wait.oneSec();
            context.startActivity(i);
        }
    }
}

我所说的活动:

import android.app.Activity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View.MeasureSpec;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class IncomingCallActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        try {
            Log.d("IncomingCallActivity: onCreate: ", "flag2");

            */ After this line, the code is not executed in Android 4.1 (Jelly Bean) only/*

            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);

            getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
            getWindow().addFlags(
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

            Log.d("IncomingCallActivity: onCreate: ", "flagy");

            setContentView(R.layout.main);

            Log.d("IncomingCallActivity: onCreate: ", "flagz");

            String number = getIntent().getStringExtra(
                    TelephonyManager.EXTRA_INCOMING_NUMBER);
            TextView text = (TextView) findViewById(R.id.text);
            text.setText("Incoming call from " + number);
        } 
        catch (Exception e) {
            Log.d("Exception", e.toString());
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

之后

try {
    Log.d("IncomingCallActivity: onCreate: ", "flag2");
}

该代码没有在Android 4.1(Jelly Bean)中执行,但在其他版本中可以正常工作。

我已经尝试了几乎所有我能做的方法。这段代码在本机通话屏幕上显示一个半透明的活动,它不会阻止背景控制,比如拿起电话。但我想要真正的来电者。我附上了一个关于真正的来电者如何在来电屏幕上显示窗口的快照。

我如何为Android应用程序实现这一功能?

这是一个真正的呼叫者的工作方式:

我目前的产出:

赏金之后,我也没有得到我想要的东西,但我会回到所有的东西;我正在努力。无论如何,此代码适用于大多数Android手机。如果有人要使用和捕捉解决方案,请写在这里,这样每个人都可以受益。

我试图在广播接收器的onRecpse方法中实现吐司,因为吐司是Android的本地组件,但它也不会在Android4.1(果冻豆)中显示。

我的想法是在广播接收器的onReceive方法中实现Toast,然后根据我们的需要更改其设计,并调整其显示持续时间。但还有一个问题是findViewById在广播接收器中不起作用,所以我认为我们必须通过编程来定制toast的线性布局。

共有3个答案

弘浩博
2023-03-14

我刚刚在Android 4.2(Jelly Bean)模拟器上进行了测试,它可以像truecaller一样屏蔽整个来电屏幕,从而达到完美效果:

public void onReceive(Context context, Intent intent) {

    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        LayoutParams.MATCH_PARENT,
        LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT |
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSPARENT);

    params.height = LayoutParams.MATCH_PARENT;
    params.width = LayoutParams.MATCH_PARENT;
    params.format = PixelFormat.TRANSLUCENT;

    params.gravity = Gravity.TOP;

    LinearLayout ly = new LinearLayout(context);
    ly.setBackgroundColor(Color.RED);
    ly.setOrientation(LinearLayout.VERTICAL);

    wm.addView(ly, params);
}

在清单中:

<receiver android:name=""  android:enabled="true" >
    <intent-filter android:priority="-1">
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>
宗政和韵
2023-03-14

super之前尝试代码。onCreate方法。我认为在调用super后,代码被跳过。有时候这种把戏对我很管用。

斜光耀
2023-03-14

我不确定您的自定义图形用户界面是否总是在默认图形用户界面的顶部,因为系统广播接收器和接收器都试图在屏幕顶部显示其图形用户界面。我们不确定哪一个是第一个调用,但一个棘手的工作,使您的图形用户界面在屏幕上是当电话铃声呼叫您的活动后1-2秒(s)使用处理程序

new Handler().postDelayed(new Runnable() {

     @Override
     public void run() {
         // TODO Auto-generated method stub
         Intent intent = new Intent(context, AcceptReject.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(intent);
     }
 }, 2000);

我希望它能帮助你。

 类似资料:
  • 我正在开发我的第一款Android应用程序,使用本教程录制手机屏幕。现在我想在我的android应用程序中显示我录制的视频,比如下面的弹出窗口布局,以及AZ Screen Recorder的共享功能。 如何在Android Studio 2.2中实现上述功能?

  • 有人知道xml主题/样式中的哪个参数负责PreferenceScreen弹出窗口中文本的颜色吗?要说明: 文本颜色是黑色的,所以我尝试的样式属性没有触及它。这个背景是白色的,但是稍后我想把它改成深色,我也需要改变文本的颜色。 首选项屏幕片段。 我分配给首选项屏幕的样式。之后

  • 我是新手。我知道这个问题已经被问了很多次了,但是到目前为止还没有一个完整的解决方案。我首先开始运行一些没有GUI的代码,通过简单地设置主题,这是成功的。现在,我想添加对话框显示错误从代码,但我不能得到它显示! 因此我创建了一个空视图,其中wrap_content作为宽度和高度,但我不确定应该为活动中的AlertDialog对象使用什么view元素。我在另一个活动中测试了所有的代码,所有的工作都很好

  • 我们计划发布一个基于Twilio语音SDK的Android应用程序的更新。我们的客户想要一种更原生的体验,他们可以直接看到一个屏幕来接受或拒绝呼叫(就像Skype/WhatsApp/Viber/Line等),而不是点击通知然后再点击对话框。此外,这也应该在锁屏上工作。 此外,在OnCallActivityNew.java的onCreate()中,我提到了以下代码。 现在唯一的问题是,当电话被锁定时

  • 我想为我的Android手机写一个软件,拦截来电,并播放一个简短的音频剪辑,指示来电者按“1”继续通话。这是打电话推销员的。 备注: > 很难得到一个明确的答案,因为在2012年,Android2.3(姜饼)删除了一些与修改手机状态相关的重要API,见这里。然而,Android7(“牛轧糖”)似乎支持呼叫阻塞(见这里),所以我希望当前的API支持拦截呼叫。 我不想像这里建议的那样将呼叫转发到某个服

  • 问题内容: 在我的android项目(目标SDK版本23)中,我想拒绝来电。我知道对此有很多疑问,特别是 1 如何将com.android.internal.telephony.ITelephony导入Android应用程序 2 如何在Android中以编程方式拒绝通话 在第一个链接中,建议的解决方案是在接口上使用反射,因为它是内部接口。但是此解决方案使用权限,该权限只能授予系统应用程序,因此无论