Problem mit Broadcastreciever

  • Antworten:1
MOSDEV
  • Forum-Beiträge: 57

03.12.2012, 12:43:41 via Website

Ich bin gerade dabei ein kleines Projekt zu erstellen...

Ich benötige eine App die auf Anrufe, SMS etc. reagiert und in eine Datenbank die Ereignisse einfügt.

Nun habe ich einen simplen PhoneStateListener programmiert. Es funktioniert auch. Wenn ich 2 Emulatoren laufen lasse und den anderen intern anrufe reagiert der Listener auch. Mein Problem, die Ereignisse werden mit jedem Ereignis EIN MAL Mehr angezeigt.

Bsp:
Eingehender Andruf von xxx (1x)
Aufgelegt (2x)
Eingehender Andruf von xxx (3x)
Aufgelegt (4x)

usw...

Später würde es dazuführen, dass die Daten in die Datenbank falsch gespeichert werden...

1package org.mosdev.phonelogger;
2
3import android.content.BroadcastReceiver;
4import android.content.Context;
5import android.content.Intent;
6import android.os.Bundle;
7import android.telephony.PhoneStateListener;
8import android.telephony.TelephonyManager;
9import android.widget.Toast;
10
11public class CallReciever extends BroadcastReceiver {
12
13 private MyPhoneStateListener phoneListener;
14 public CallReciever() {
15
16 }
17
18 @Override
19 public void onReceive(Context context, Intent intent) {
20 Bundle extras = intent.getExtras();
21 String action=intent.getAction();
22 if (phoneListener==null)
23 {
24 phoneListener = new MyPhoneStateListener(context);
25 TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
26 telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
27 }
28 }
29
30}

1package org.mosdev.phonelogger;
2
3import android.content.Context;
4import android.telephony.PhoneStateListener;
5import android.telephony.TelephonyManager;
6import android.widget.Toast;
7
8public class MyPhoneStateListener extends PhoneStateListener {
9
10 private Context context;
11 public MyPhoneStateListener(Context context)
12 {
13 this.context = context;
14 }
15
16 @Override
17 public void onCallStateChanged(int state, String incomingNumber) {
18 super.onCallStateChanged(state, incomingNumber);
19 switch(state)
20 {
21 case TelephonyManager.CALL_STATE_IDLE:
22 {
23 Toast.makeText(context, "PHONE IDLE", Toast.LENGTH_LONG).show();
24 break;
25 }
26 case TelephonyManager.CALL_STATE_RINGING:
27 {
28 Toast.makeText(context, "INCOMING CALL FROM "+incomingNumber, Toast.LENGTH_LONG).show();
29 break;
30 }
31 case TelephonyManager.CALL_STATE_OFFHOOK:
32 {
33 Toast.makeText(context, "OFF HOCK", Toast.LENGTH_LONG).show();
34 break;
35 }
36
37 }
38 }
39
40}

1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="org.mosdev.phonelogger"
4 android:versionCode="1"
5 android:versionName="1.0" >
6
7 <uses-sdk
8 android:minSdkVersion="8"
9 android:targetSdkVersion="16" />
10 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
11
12 <application
13 android:allowBackup="true"
14 android:icon="@drawable/ic_launcher"
15 android:label="@string/app_name"
16 android:theme="@style/AppTheme" >
17 <activity
18 android:name="org.mosdev.phonelogger.MainActivity"
19 android:label="@string/app_name" >
20 <intent-filter>
21 <action android:name="android.intent.action.MAIN" />
22
23 <category android:name="android.intent.category.LAUNCHER" />
24 </intent-filter>
25 </activity>
26 <receiver android:name=".CallReciever">
27 <intent-filter >
28 <action android:name="android.intent.action.PHONE_STATE" />
29 </intent-filter>
30 </receiver>
31 <receiver android:name=".MessageReciever"></receiver>
32 </application>
33
34</manifest>


Vielleicht kann mir ja jemand einen Tipp geben.. Hab schon einiges versucht, jedoch finde ich den Fehler nicht...

Antworten
MOSDEV
  • Forum-Beiträge: 57

05.12.2012, 21:04:10 via Website

Ich habe das Problem gefunden ;-)

Der Befehl telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); erstell jedes mal ein neuen Listener ;-)

1phoneListener = new MyPhoneStateListener(context);
2TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
3telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

Diese Zeilen gehören in die MainActivity... Wenn ich es richtig verstanden habe, müsste ich einen Listener erstellen, der reagiert, wenn das System hochgefahren ist... Dieser könnte dann die anderen Listener im Hintergrund starten..

Antworten