2013-04-23 5 views
7

Próbuję użyć BroadcastReceiver, ale to nie działa, pomóż mi rozwiązać ten problem. MyReceiver.javaBroadcastReceiver do włączania/wyłączania ekranu

package com.example.broadcast_receiver; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.i("[BroadcastReceiver]", "MyReceiver"); 

     if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){ 
      Log.i("[BroadcastReceiver]", "Screen ON"); 
     } 
     else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
      Log.i("[BroadcastReceiver]", "Screen OFF"); 
     } 
    } 
} 

AndroidManifest.xml

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

    <uses-sdk 
     android:minSdkVersion="9" 
     android:targetSdkVersion="16" /> 

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

     <receiver android:name=".MyReceiver" 
      android:enabled="true" 
      android:exported="false"> 
      <intent-filter> 
       <action android:name="android.intent.action.SCREEN_ON"/> 
       <action android:name="android.intent.action.SCREEN_OFF"/> 
      </intent-filter> 
     </receiver> 

     <activity 
      android:name="com.example.broadcast_receiver.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

BroadcastReceiver nie działa i nie czyni żadnego dziennika, proszę mi pomóc rozwiązać ten problem.

+0

Sprawdź http://stackoverflow.com/a/9478013/1777090 –

+0

Użyj innych usług do naprawy. Wiadomość odebrana lub połączenie przychodzące. Sprawdź LOg. –

+0

sprawdź ten, który może ci pomóc. Http://stackoverflow.com/questions/9477922/android-broadcast-receiver-for-screen-on-and-screen-off – nilkash

Odpowiedz

23

Hey spróbować użyć dynamicznego powołanie audycji, próbowałem to będzie niemiły pracy ...

public class MainActivity extends Activity { 

    //Create broadcast object 
    BroadcastReceiver mybroadcast = new BroadcastReceiver() {  
     //When Event is published, onReceive method is called 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
      Log.i("[BroadcastReceiver]", "MyReceiver"); 

      if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
       Log.i("[BroadcastReceiver]", "Screen ON"); 
      } 
      else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
       Log.i("[BroadcastReceiver]", "Screen OFF"); 
      } 

     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON)); 
     registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF)); 
    } 
} 
+1

yaa to działa, bt chcę, żeby to była praca po zamknięciu mojej aplikacji bcoz robię ekran blokady, więc masz jakiś pomysł na to? – user2290872

+0

Wywołujesz tę transmisję wewnątrz "usług" – kavya

+0

kk thnx Zrobiłem to, ale kiedy zamknąłem aplikację n spróbuj odfiltrować n na nie działa, więc sprawdzam działające usługi na telefonie n pokazuje, że nie ma usługi, którą zrobiłem , więc możesz pomóc 4? – user2290872

3

można spróbować z uzyskiwanie wartości akumulatora:

public class Broadcast extends Activity { 
    //Create broadcast object 
    BroadcastReceiver mybroadcast = new BroadcastReceiver() { 

     //When Event is published, onReceive method is called 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      //Get battery percentage 
      int batterylevel = intent.getIntExtra("level", 0);  
      //get progressbar 
      ProgressBar myprogressbar = (ProgressBar) findViewById(R.id.progressbar); 
      myprogressbar.setProgress(batterylevel); 
      TextView tv = (TextView) findViewById(R.id.textfield); 
      //Set TextView with text 
      tv.setText("Battery Level: " + Integer.toString(batterylevel) + "%"); 
     } 
    }); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_broadcast); 
     registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    } 
} 
+0

yaa działa, bt chcę, żeby to było praca po zamknięciu mojej aplikacji bcoz robię ekran blokady, więc masz jakiś pomysł na to? – user2290872

+0

nazywasz tę transmisję wewnątrz "usług" – kavya

0

Jeśli chcesz tego odbiornika do być wywołanym przez system, musisz go wyeksportować. Ustaw exported = "false", zmień wartość na true lub usuń całkowicie wyeksportowane, a to zacznie działać. Normalnie byłoby to niebezpieczne, ale ponieważ zarówno SCREEN_ON, jak i SCREEN_OFF są zabezpieczonymi transmisjami, a ty zweryfikujesz działania, tylko bardziej zaufany kod systemowy może je wysłać również, więc jest całkiem bezpieczny.

Niestety, to przyzwyczajenie w tym przypadku, ponieważ nadawane intencje mają następujące flagi: Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND