Bouton d'action de Notification non cliquable dans l'écran de verrouillage

afin de mieux prendre en charge les notifications Android 5, je configure maintenant la notification de mon application visibilty à"public". Après avoir considéré les réponses sur Lollipop Notification setVisibility () ne fonctionne pas? , la notification est maintenant affichée comme prévu. Cependant, lorsque je veux cliquer sur le bouton action de la notification, je dois d'abord déverrouiller le périphérique qui ne devrait pas être nécessaire. (L'action montre qu'une base de données de mots de passe est déverrouillée et le bouton action verrouiller la base de données.)

C'est le code que j'utilise pour créer la notification (en utilisant le Mono de Xamarin pour Android):

NotificationCompat.Builder builder =
                new NotificationCompat.Builder(this)
                    .SetOngoing(true)
                    .SetSmallIcon(Resource.Drawable.ic_notify)
                    .SetLargeIcon(...)
                    .SetVisibility((int)Android.App.NotificationVisibility.Public)
                    .SetContentTitle(...)
                    .SetContentText(...);

builder.AddAction(Resource.Drawable.ic_action_lock, GetString(Resource.String.menu_lock), PendingIntent.GetBroadcast(this, 0, new Intent(Intents.LockDatabase), PendingIntentFlags.UpdateCurrent));

this est une instance de Service.

je sais que les notifications MediaStyle ont des boutons cliquables, mais il se sent comme un hack pour utiliser MediaStyle même si ce n'est pas sur les médias. Est-il possible que je peux faire mon action utilisables depuis l'écran de verrouillage?

4
demandé sur Community 2014-12-28 08:37:53

2 réponses

au lieu d'ajouter une action, définissez votre propre disposition de notification et connectez un pentingent à fire via RemoteView. (L'exemple ci-dessous est basé sur l'Holo look et aura toujours besoin de mise à jour pour lollipop. Vous pouvez trouver toutes les ressources correctes dans le dossier android-21/data/res de votre sdk)

// NOTE: while creating pendingIntent: requestcode must be different!
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(myService)
        .setSmallIcon(R.drawable.notification_icon).setContentTitle("My Title")
        .setContentText("Service running in the background");
Intent openIntent = new Intent(MainActivity.this, MainActivity.class);
PendingIntent pOpenIntent = PendingIntent.getActivity(this, 0, openIntent, 0);
mBuilder.setContentIntent(pOpenIntent);

// Notification with exit button if supported
String ACTION_NOTIFICATION_EXITACTIVITY = "com.jmols.example.exitactivity";
Intent exitIntent = new Intent();
exitIntent.setAction(ACTION_NOTIFICATION_EXITACTIVITY);
PendingIntent pExitIntent = PendingIntent.getBroadcast(this, 1, exitIntent, 0);
RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification_discoveryservice);
view.setOnClickPendingIntent(R.id.notification_closebtn_ib, pExitIntent);
mBuilder.setContent(view);

avec une disposition de notification:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:internal="http://schemas.android.com/apk/prv/res/android"
    android:id="@+id/status_bar_latest_event_content"
    android:layout_width="match_parent"
    android:layout_height="64dp"
    internal:layout_maxHeight="64dp"
    internal:layout_minHeight="64dp" >

    <ImageView
        android:id="@+id/notification_icon_iv"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:padding="10dp"
        android:layout_alignParentLeft="true"
        android:scaleType="center"
        android:src="@drawable/notification_icon"
        android:background="#3333B5E5" />

    <ImageButton
        android:id="@+id/notification_closebtn_ib"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:scaleType="centerInside"
        android:src="@drawable/notification_exitbtn"
        android:background="@drawable/notification_imagebtn_bg"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="fill_vertical"
        android:gravity="top"
        android:minHeight="64dp"
        android:layout_toRightOf="@id/notification_icon_iv"
        android:layout_toLeftOf="@id/notification_closebtn_ib"
        android:orientation="vertical"
        android:paddingBottom="2dp"
        android:paddingEnd="8dp"
        android:paddingTop="2dp" >

        <TextView
            android:id="@+id/notification_title_tv"
            style="@android:style/TextAppearance.StatusBar.EventContent.Title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:ellipsize="marquee"
            android:paddingTop="6dp"
            android:singleLine="true"
            android:text="JMols Service" />

        <TextView
            android:id="@+id/notification_contenttext_tv"
            style="@android:style/TextAppearance.StatusBar.EventContent"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:ellipsize="marquee"
            android:singleLine="true"
            android:text="Service running in the background" />

    </LinearLayout>

</RelativeLayout>

et le contexte de la notification est:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:state_pressed="true"  android:drawable="@drawable/notification_bg_normal_pressed" />
    <item android:state_pressed="false" android:drawable="@drawable/notification_bg_normal" />
</selector>

notification_bg_normal.9 notification_bg_normal_pressed.9

et la notification imagebutton background est:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:state_pressed="true"  android:drawable="@drawable/notification_imagebtn_bg_normal_pressed" />
    <item android:state_pressed="false" android:drawable="@drawable/notification_imagebtn_bg_normal" />
</selector>

notification_imagebtn_bg_normal.9.png notification_imagebtn_bg_normal_pressed.9.png

4
répondu Jeroen Mols 2015-01-08 10:37:36

je pense que Android permet seulement la lecture des médias peut être contrôlée à partir de l'écran de verrouillage, d'autres notifications doivent déverrouiller l'écran d'abord pour commencer l'activité est à des fins de sécurité. Par exemple, vous pouvez vouloir savoir que vous recevez de nouveaux mails, vous pouvez même vouloir montrer le contenu des mails qui viennent d'arriver, mais vous pouvez ne pas vouloir une faille pour que d'autres accèdent à votre compte email lorsque l'appareil est verrouillé. Dans les cas de contrôle de l'utilisation des médias, les problèmes de sécurité ne sont pas les mêmes.

0
répondu 2015-01-07 16:35:34