4

我有一个收听来电的广播接收器。我想调整来电屏幕。现在我可以向通知栏展示祝酒词并向通知栏添加通知(顺便说一句,在接听电话之前,由于屏幕被锁定,用户无法将其拉下,这有点糟糕)。我试图显示警报但它崩溃了 - 不允许吗?广播接收器中的代码有没有办法做其他事情,比如更改呼叫者的头像或给它一个名字(即使它不存在于联系人中)。假设我的广播接收器拦截了一个电话 - 它可以将电话号码和自定义头像添加到联系人,以便他们立即出现在通话屏幕中吗?

你怎么看?


编辑

我已经测试了供应商的代码,它可以工作,但是从后台线程更改 UI 是不安全的,所以我尝试稍微调整他的代码以使其线程安全,但是由于某种原因没有出现 toast。你怎么看?

private Handler handler = new Handler();

    private void showToast() { 
        Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background");
        thread.start();
    }

    private Runnable doBackgroundThreadProcessing = new Runnable() { 
        public void run() {
            backgroundThreadProcessing();
        } 
    };

    private void backgroundThreadProcessing() {
        handler.post(new Runnable() {
            public void run() { 
                int count = 0;
                try{
                    while (count < 10) {
                        toast.show();
                        Thread.sleep(1850);
                        count++;

                    }
                }
                catch(Exception e){

                    Log.e("LongToast", "", e);
                }
            } 
        });
    }
4

3 回答 3

8

你需要一个这样的广播接收器:

public class IncomingBroadcastReceiver extends BroadcastReceiver {

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

        MyLog.d("IncomingBroadcastReceiver: onReceive: ");

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        MyLog.d("IncomingBroadcastReceiver: onReceive: " + state);
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING))
        {
            Intent i = new Intent(context, IncomingCallActivity.class);
            i.putExtras(intent);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            context.startActivity(i);
        }

    }

}

并将其注册到清单中<action android:name="android.intent.action.PHONE_STATE"></action>

然后创建一个这样的活动:

public class IncomingCallActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        MyLog.d("IncomingCallActivity: onCreate: ");

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

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

        setContentView(R.layout.main);

        String number = getIntent().getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        TextView text = (TextView)findViewById(R.id.text);
        text.setText("Incoming call from " + number);
    }
}

具有以下布局:

<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:gravity="center_vertical|center_horizontal"
    android:text="text"
    android:windowBackground="@android:color/transparent" 
    android:windowIsTranslucent="true" 
    android:windowAnimationStyle="@android:style/Animation.Translucent"></TextView>

这将在来电屏幕顶部产生一个半透明的类似对话框的活动,允许用户接听电话(不干扰触摸事件)。

于 2011-03-30T20:13:49.053 回答
4

在 Android 2.3 之前,您无法覆盖呼叫屏幕,但您可以在其上显示 Toast 消息。吐司的最长持续时间是 3 秒,之后它就会消失。但是,您可以创建一个线程,每 2 秒调用一次 toast 的 show() 方法。像这样的东西:

Thread t = new Thread() {
        public void run() {

            try {
                while (true) {
                    if( isInCall ){

                        toast.cancel();
                        break;
                    }

                    toast.show();
                    sleep(1850);
                }
            } catch (Exception e) {

                Log.d("Exception: " + e.toString());
            }
        }
    };
    t.start();

你必须声明吐司:

private Toast toast;

您必须先初始化 toast 对象才能显示它。

toast = new Toast(getBaseContext());    
LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.toast, null, false);

    toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.setView(layout);
于 2011-04-01T11:07:36.047 回答
0

这是不可能的,答案直接来自 Android 团队

http://markmail.org/message/wttvtmxzqnsbyodx#query:+page:1+mid:fjtly3xmriql5xxa+state:results

于 2011-03-27T23:17:08.623 回答