2 votes

Le récepteur de diffusion ne reçoit pas d'intention (RemoteViews / PendingIntent)

Je travaille sur une notification personnalisée qui contient deux boutons. J'utilise des RemoteViews et j'utilise PendingIntent pour que la notification soit reçue par le récepteur de diffusion. Cela fonctionne bien sur les appareils Huawei mais pas sur les appareils Oppo et Infinix.

J'enregistre le récepteur de diffusion comme ceci dans manifeste :

<receiver android:name="com.appedia.flashlight.torch.Notification_Receiver">
            <intent-filter>
                <action android:name="Notification_Flashlight"></action>
                <action android:name="Notification_SOS"></action>
                <action android:name="Notification_Delete"></action>
            </intent-filter>
        </receiver>

En utilisant ces méthodes dans le Activité principale pour la notification :

public void Notification()
        {
            builder = new NotificationCompat.Builder(this);
            builder.setAutoCancel(true)
                    .setCustomContentView(remoteViews)
                    .setDeleteIntent(delete_pending_intent)
                    .setContentIntent(pendingIntent);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            {
                builder.setSmallIcon(R.drawable.flashlight);
            }
            else
            {
                builder.setSmallIcon(R.mipmap.ic_launcher);
            }

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
            {
                int importance = NotificationManager.IMPORTANCE_HIGH;
                NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, importance);
                assert notificationManager != null;
                builder.setChannelId(NOTIFICATION_CHANNEL_ID);
                notificationManager.createNotificationChannel(notificationChannel);
            }

            assert notificationManager != null;
        }

        public void NotificationItemsClickIntent()
        {
            Intent notification_intent = new Intent(getApplicationContext(),MainActivity.class);
            pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notification_intent, 0);

            Intent notification_deleted_intent = new Intent("Notification_Delete");
            notification_deleted_intent.putExtra("notification_delete", "notification_delete");
            delete_pending_intent = PendingIntent.getBroadcast(getApplicationContext(), 0, notification_deleted_intent, PendingIntent.FLAG_UPDATE_CURRENT);

            /* Pending Intent for Notification Flashlight Button */
            //Intent with flashlight button for triggering Broadcast Receiver when clicked from notification bar
            Intent notification_flashlight_intent = new Intent("Notification_Flashlight");
            notification_flashlight_intent.putExtra("notification_flashlight", "Flashlight");

            //start flashlight when notification bar button is clicked
            PendingIntent notification_flashlight_button = PendingIntent.getBroadcast(this,0,notification_flashlight_intent,PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.notification_flashlight_button, notification_flashlight_button);

            /* Pending Intent for Notification SOS Button */
            //Intent with sos button for triggering Broadcast Receiver when clicked from notification bar
            Intent notification_sos_intent = new Intent("Notification_SOS");
            notification_sos_intent.putExtra("notification_sos", "SOS");

            //start flashlight when notification bar button is clicked
            PendingIntent notification_sos_button = PendingIntent.getBroadcast(this,0,notification_sos_intent,PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.notification_sos_button, notification_sos_button);
        }

        //broadcast receiver for getting battery percentage
        private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
            @Override
            public void onReceive(Context ctx, Intent intent) {

                boolean isPlugged;

                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                remoteViews.setTextViewText(R.id.notification_battery_percent,String.valueOf(level) + "%");

                int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
                isPlugged = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;

                if(isPlugged)
                {
                    remoteViews.setTextViewText(R.id.notification_battery_text, "Charging");
                }
                else
                {
                    remoteViews.setTextViewText(R.id.notification_battery_text, "Discharging");
                }

                NotificationItemsClickIntent();
                Notification();
                notificationManager.notify(0, builder.build());

                unregisterReceiver(mBatInfoReceiver);
                }
            };

Démarrer le service de notification et enregistrer le récepteur de diffusion pour les informations sur la batterie comme ceci dans onCreate de MainActivity :

//Starting Notification Service
        notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        remoteViews = new RemoteViews(getPackageName(),R.layout.notification_bar);

    //for getting battery percentage (shows notification)
        this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

Récepteur de diffusion de notifications :

public class Notification_Receiver extends BroadcastReceiver {

String notification_flashlight, notification_sos, notification_delete;

@Override
public void onReceive(Context context, Intent intent) {

    notification_flashlight = intent.getExtras().getString("notification_flashlight");
    notification_sos = intent.getExtras().getString("notification_sos");
    notification_delete = intent.getExtras().getString("notification_delete");

    if (notification_flashlight != null) {

        Toast.makeText(context, "Flashlight", Toast.LENGTH_SHORT).show();
    }

    else if (notification_sos != null) {

        Toast.makeText(context, "SOS", Toast.LENGTH_SHORT).show();
    }

    else if (notification_delete != null) {

        Toast.makeText(context, "Delete", Toast.LENGTH_SHORT).show();

    }
}

Quelqu'un peut-il m'aider ? Je ne sais pas ce que je fais de mal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X