2012-03-27 13 views
5

Había escrito una pequeña aplicación de utilidad solo para mi teléfono, que detenía el portador molesto que proporcionaba jingle que se reproducía durante el arranque. Noté que el sonido no se reproducía si ponía el teléfono en modo silencioso antes de apagarlo, así que escribí esta pequeña utilidad para silenciar el apagado y restaurar el sonido al arrancar. Esto funcionó bien para un Galaxy S2 en Gingerbread. El código completo se divide en dos clases:BroadcastReceivers en ICS

public class OnShutDownReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     AudioManager mgr=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
     mgr.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
    } 

} 

y

public class OnBootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     AudioManager mgr=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
     mgr.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
    } 
} 

El manifiesto es

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.nbt.hush" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <receiver android:name=".OnBootReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
     <receiver android:name=".OnShutDownReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.ACTION_SHUTDOWN" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

Ahora mi teléfono ha sido actualizado a ICS por mi compañía, que ya no funciona. Si puse el teléfono en modo silencioso antes de apagarlo, el tintineo no se reproduce. Por lo tanto, sospecho que ninguno de los receptores está activado. (Puse un código de registro en los receptores que no aparecieron, pero sospecho que debido a los tiempos también podría no haberse mostrado en Gingerbread.)

Cualquier sugerencia sobre por qué no lo hará ¿Trabajas más?

Respuesta

9

Si terminaste desinstalando y reinstalando completamente la aplicación, el problema es que no tienes actividad.

Comenzando con Android 3.1, las aplicaciones se instalan en un estado "detenido", donde ningún receptor de difusión funcionará hasta que el usuario inicie una actividad manualmente. Este es un movimiento anti-malware. I blogged about this ~9 months ago.

+0

Creo que entiendo. Entonces, si agrego una actividad ficticia con un Toast o algo así y lo ejecuto solo una vez, ¿debería funcionar después? – NickT

+0

@NickT: Sí. Si estuviera distribuyendo esta aplicación, podría usar algunos trucos para deshabilitar el componente en versiones anteriores de Android, para que no ocupe demasiado el iniciador. Aquí hay un proyecto de muestra donde uso ese truco: https://github.com/commonsguy/cw-advandroid/tree/master/RemoteViews/Plugin – CommonsWare

+0

Gracias, eso funciona bien ahora, me salva de la vergüenza social cuando enciendo el teléfono en. (P.S. Cortaría y pegaría 'silencioso' y 'normal' al revés del código real cuando publiqué la pregunta por primera vez) – NickT