2016-06-20 19 views
1

Ich habe folgendes manifest.xml:Register Broadcastreceiver in manifest

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <receiver android:name=".PhoneStateBroadcastReceiver" 
     android:permission="android.permission.READ_PHONE_STATE"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

</application> 

Der Zuhörer empfängt Daten, während die Haupttätigkeit ausgeführt wird. Wenn jedoch die Hauptaktivität beendet wird, hört der Empfänger auf, Informationen auszugeben.

Der Empfänger ist ein Beispiel Klasse:

public class PhoneStateBroadcastReceiver extends BroadcastReceiver { 

    private static final String TAG = "PhoneReceiver"; 
    Context mContext; 
    String incoming_number; 
    private int prev_state; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object 
     CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(); 
     telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); //Register our listener with TelephonyManager 

     Bundle bundle = intent.getExtras(); 
     String phoneNr = bundle.getString("incoming_number"); 
     Log.v(TAG, phoneNr); 
     Log.d(TAG, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
     mContext = context; 
    } 

    /* Custom PhoneStateListener */ 
    public class CustomPhoneStateListener extends PhoneStateListener { 

     private static final String TAG = "CustomStateListener"; 

     @Override 
     public void onCallStateChanged(int state, String incomingNumber){ 

      if(incomingNumber != null && incomingNumber.length() > 0) 
       incoming_number = incomingNumber; 

      switch(state){ 
       case TelephonyManager.CALL_STATE_RINGING: 
        Log.d(TAG, "CALL_STATE_RINGING"); 
        prev_state=state; 
        break; 

       case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.d(TAG, "CALL_STATE_OFFHOOK"); 
        prev_state=state; 
        break; 

       case TelephonyManager.CALL_STATE_IDLE: 

        Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_number); 

        if((prev_state == TelephonyManager.CALL_STATE_OFFHOOK)){ 
         prev_state=state; 
         //Answered Call which is ended 
        } 
        if((prev_state == TelephonyManager.CALL_STATE_RINGING)){ 
         prev_state=state; 
         //Rejected or Missed call 
        } 
        break; 
      } 
     } 
    } 
} 

Soweit ich die Android-Prinzipien verstanden, wenn ein Empfänger in einem offenkundigen registriert ist, dann sollte es Daten empfangen, auch wenn seine App getötet wird, wenn ja, welche mache ich falsch?

Antwort

0

OK. Nachdem ich über eine Woche lang meinen Kopf gegen die Wand geschlagen hatte, beschloss ich, ein neues Projekt mit minimaler Funktionalität zu entwickeln, und es funktionierte vom ersten Versuch an. Ich weiß nicht, ob es durch etwas in meinem alten Code verursacht wurde, was ich bezweifle, da ich es methodisch nach Methode auf das neue Projekt kopiert habe und es immer noch funktioniert, oder die neueren Versionen von Android Studio und deren Build-Tools.

Vielen Dank REG1 für die Geduld und den Wunsch, Ideen zu geben.

Grüße

1

folgendes zu Ihrem <receiver> im Manifest hinzufügen:

android:enabled="true" 
android:exported="true"> 

Außerdem according to this thread, es scheint, dass Sie manuell vor dem Rundfunkempfänger ein Ihre Aktivitäten starten anfangen zu arbeiten, dh die Anwendung haben muss wurde mindestens einmal gestartet, bevor ein Broadcast-Empfänger funktioniert.

Zusätzlich deklarieren Sie die Erlaubnis außerhalb des Tags <application>. So sollten Sie etwas davon haben:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.app.myapp" > 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <application ... 
... 
</manifest> 

Natürlich diese bedeutet, dass Sie die Berechtigung Parameter in Ihrer receiver entfernen sollte.

+0

addint aktiviert und half nicht exportiert. Darf ich fragen, wie ich manuell eine Aktivität starten soll, bevor ich den Listener registriere, da er im Manifest registriert ist und auch funktioniert, während die App nicht beendet wird? vielen Dank im Voraus –

+0

Nun, ich meine nicht, dass Sie die App vor der Registrierung starten müssen. Was ich aus dem Link in meiner Antwort verstanden habe, ist, dass du deine App mindestens einmal gestartet haben musst, bevor der Broadcast-Empfänger arbeiten wird. Nach dem Starten und anschließenden Schließen der App sollte der Empfänger also funktionieren. Sehen Sie sich den Link an, den ich in meiner Antwort angegeben habe, da Ihr Problem ziemlich ähnlich zu sein scheint. Ich sehe keine Probleme mit Ihrem Code. – REG1

+0

Ich habe das gleich verstanden, aber so funktioniert es nicht. Egal wie oft ich es starte funktioniert es nur, während die App läuft. –

0

Fügen Sie diese Zeilen auf den Android-Studio-Manifest-Datei ... Sie registrieren nicht die Broadcast-Klasse

<receiver android:name=".PhoneStateBroadcastReceiver" 
     android:exported="true" 
     android:enabled="true"> 
    <intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE"/> 
    </intent-filter> 
</receiver>