2

通話の終了を処理する Android アプリケーションを作成しています。

  • 電話を切ると、通知が送信されます

  • その通知をクリックすると、Google カレンダーの新しい予定の UI に移動します。

  • フィールドのタイトルには、連絡先の電話番号または名前が入力されます。

私の問題は次のとおりです。

番号 +442070313000 で呼び出された場合 -> 通知ポップアップが表示され、クリックすると、タイトル +442070313000 のイベントが作成されます

しかし、その後 666 番の呼び出し -> 通知ポップアップが表示されますが、カレンダー イベントには +442070313000 という番号が表示されます。

アプリケーションをデバッグしたところ、Google カレンダーに渡されたインテントは問題ありません。ただし、最初の意図のみを保持し、他の意図を無視しているようです

イベントを処理するコードは次のとおりです。

package com.amos.addincalendar.facade;

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

public class CallReceiverIncoming extends BroadcastReceiver {

    String LOG_TAG = "CallReceiver";
    String EVENT_TYPE_PHONE_STATE_CHANGED = "phone state changed";
    private static int MIN_TOTAL_TIME = 0;
    static String LOG_TAG = "CallReceiver";

    TelephonyManager tm;
    private String sPhoneNumber = "";
    private boolean bAgenda = false;
    private long lStartTime;
    private long lEndTime;

    private void onReceivePhoneStateChanged(final Context context,
              final Intent intent) {

        final String phoneState = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        final StringBuilder sb = new StringBuilder();

        if (TelephonyManager.EXTRA_STATE_IDLE.equals(phoneState)) {
            Log.d(LOG_TAG, "event : idle");
            bAgenda = true;
            lEndTime = System.currentTimeMillis();
        } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(phoneState)) {
            Log.d(LOG_TAG, "event : offhook");
            bAgenda = true;
            lEndTime = System.currentTimeMillis();
        } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(phoneState)) {
            Log.d(LOG_TAG, "event : ringing");
            lStartTime = System.currentTimeMillis();
        }

    }



    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();

        if(null == bundle){
            return;         
        }

        final String action = intent.getAction();
        sPhoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

        if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) {
            onReceivePhoneStateChanged(context, intent);
        } else {
            final String data = intent.getDataString();

            Log.v(LOG_TAG, "broadcast : action=" + action + ", data=" + data);
        }


        if(!bAgenda){
            CallReceiver.agendaFishAndChips(context, sPhoneNumber, lStartTime, lEndTime);
        }

    }


    public static void agendaFishAndChips(Context context, String sPhoneNumber, long lStartTime, long lEndTime){

        StringBuilder sbTitleEvent  = new StringBuilder();
        StringBuilder sbDescription = new StringBuilder();
        StringBuilder sbAddress     = new StringBuilder();
        StringBuilder sbName        = new StringBuilder();

        if(sPhoneNumber != null && !sPhoneNumber.equals("")){
            sbTitleEvent.append(sPhoneNumber);

            CallReceiver.sendNotificationAgenda(context, sbTitleEvent.toString(), sbAddress.toString(), sbDescription.toString(), sPhoneNumber, sbName.toString());

        }
    }

    public static String getCaracteresNumeriques (String chaine){
        String sChaineNumerique = "";

        Matcher matcher = Pattern.compile("[0-9]*").matcher(chaine);
        while ( matcher.find() ) {
            sChaineNumerique += matcher.group();
        }
        return sChaineNumerique;
    }

    /*
     * Send a notification and add event in agenda
     */
    public static void sendNotificationAgenda(Context context, String sTitleEvent, String sAddress, String sDescription, String sPhoneNumber, String sName){
        NotificationManager notificationManager;
        notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

        sName = (sName != null && !sName.equals("") ? sName : sPhoneNumber);
        String sNotificationTitle = "Rendezvous with "+ sName;
        Notification notification = new Notification(R.drawable.ic_launcher, sNotificationTitle, System.currentTimeMillis());

        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notification.defaults |= Notification.DEFAULT_LIGHTS;

        Log.d(LOG_TAG, sName + " : " + getCaracteresNumeriques(sPhoneNumber));

        Log.d(LOG_TAG, sTitleEvent);

    //Create the google event intent
    Intent intentNotification = new Intent(Intent.ACTION_EDIT);
        intentNotification.setType("vnd.android.cursor.item/event");

        intentNotification.putExtra("title", sTitleEvent);
        intentNotification.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    Bundle objetbunble = new Bundle();
    objetbunble.putString("TitleEvent"  , sTitleEvent);
    objetbunble.putString("Address"     , sAddress);
    objetbunble.putString("Description", sDescription);
    intentNotification.putExtras(objetbunble);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intentNotification, 0);
        notification.setLatestEventInfo(context,
                    sNotificationTitle,
                    context.getText(R.string.notification_new_rdv) + " " + sName,   pendingIntent);
        notificationManager.notify( Integer.parseInt(getCaracteresNumeriques(sPhoneNumber)), notification);


    }


    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        sPhoneNumber = "";
    }
}

そして、ここにマニフェストがあります:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amos.addincalendar"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.SET_DEBUG_APP"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.DeviceDefault" >

          <activity
            android:name=".action.CalendarMain"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <receiver android:name=".facade.CallReceiverIncoming">
            <intent-filter> 
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter> 
        </receiver>

        <activity android:name=".dao.CalendarDAO"></activity>
        <activity android:name=".facade.CallReceiver"></activity>
        <activity android:name=".facade.CallActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"></activity>

    </application>
</manifest>
4

1 に答える 1

1

この場合、各 PendingIntent に一意の ID を提供する必要があると思います。の 0 を置き換えてみてください

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intentNotification, 0); 

一意の ID (おそらく電話番号?) を使用します。各 PendingIntent に同じ番号を指定すると、同じインテント (最初に送信されたもの) が読み取られます。

于 2012-09-21T11:01:40.363 に答える