Android: Представление уведомления во время разговора? - PullRequest
4 голосов
/ 25 марта 2011

У меня есть приемник вещания, который прослушивает входящие звонки.И я хочу настроить экран входящего вызова.Прямо сейчас я могу представить тосты и добавить уведомления на панель уведомлений (кстати, пользователь не может опустить его, потому что экран заблокирован, прежде чем принять вызов, что вроде отстой).Я пытался показать оповещение, но оно вылетело - это не разрешено?Есть ли способ для кода в приемнике вещания делать другие вещи, такие как изменение аватара вызывающего абонента или присвоение ему имени (даже если его нет в контактах).Скажем так, мой приемник вещания перехватывает вызов - может ли он добавить номер телефона и пользовательский аватар в контакты, чтобы они сразу же отображались на экране вызова?

Что ты думаешь?


Редактировать

Я протестировал код поставщика, и он сработал, но изменить интерфейс пользователя из фонового потока небезопасно, поэтому я попытался немного изменить его кодсделать это потокобезопасным, но тост не появляется по какой-то причине.Как вы думаете?

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);
                }
            } 
        });
    }

Ответы [ 3 ]

7 голосов
/ 31 марта 2011

Вам нужен такой BroadcastReceiver:

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>

Это создаст полупрозрачную диалоговую активность поверх экрана входящего вызова, которая позволяет пользователю отвечать на вызов (не мешает сенсорным событиям).

4 голосов
/ 01 апреля 2011

До Android 2.3 вы не можете переопределить экран вызова, но вы можете показать сообщение Toast на нем.Самый длинный период тоста составляет 3 секунды, после чего он исчезнет.Однако вы можете создавать поток, который вызывает метод show () тоста каждые 2 секунды.Примерно так:

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;

Вы должны инициировать объект тоста, прежде чем показывать его.

0 голосов
/ 28 марта 2011

Это невозможно, ответ приходит прямо из команды Android

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

...