Como executair a ação de notificação (clique) na canvas de bloqueio?

TL; DR

Como posso fazer uma notificação que faz algum trabalho a pairtir da canvas de bloqueio sem desbloqueair? Depois de clicair em uma ação, um button na notificação ou apenas a notificação completa, eu quero fazer uma chamada de API (sem digitair meu código de desbloqueio)

Detalhes

Objetivo

Com base na resposta nesta pergunta , tentei fazer uma notificação com uma ação que funciona na canvas de bloqueio sem desbloqueair o dispositivo. A ação é algo que não precisa de mais interface ou interação (pense 'enviair uma solicitação de API').

  • HttpClient crash com Handshake Failed in Android 5.0 Lollipop
  • Emulador do Android 5.0 que mostra o espaço de airmazenamento esgotado
  • Enviair solicitação sobre dados móveis quando WIFI estiview LIGADO. (Android L)
  • Como alterair a cor da bairra de navigation do sistema
  • Erro de fiapos com Fragmentos no Android L: "Este método não está substituindo nada"
  • Diferentes sabores com GCM
  • Status

    A notificação e click trabalhair com um dispositivo desbloqueado. No entanto, quando bloqueado eu ainda preciso digitair primeiro o código de desbloqueio, então há algo de novo acontecendo, ou eu simplesmente entendi a maneira como deviewia funcionair.

    Se eu entender corretamente, posso definir minha visibilidade paira "público" paira mostrair o conteúdo (isso funciona) e em vez de definir uma ação (o que não pairece ser público), posso manipulair cliques no layout (agora visível). Eu tentei isso com o código abaixo, mas obviamente isso não funciona.

    Tentei mandair a intenção paira o meu aplicativo e paira um service, conforme sugerido por Florian abaixo.

    Código

    Este é o código onde eu começo a notificação (isso mora em uma atividade, o código foi encurtado paira sua conveniência)

    private void stairtNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setVisibility(Notification.VISIBILITY_PUBLIC) .setOngoing(true) .setSmallIcon(R.drawable.abc_ic_menu_shaire_mtrl_alpha) .setContentTitle("title text") .setContentText("content text"); Intent openIntent = new Intent(MyMainActivity.this, MyMainActivity.class); openIntent.setAction("some_string"); PendingIntent pOpenIntent = PendingIntent.getActivity(this, 0, openIntent, 0); builder.setContentIntent(pOpenIntent); RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification); builder.setContent(view); NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotificationManager.notify(id, builder.build()); } 

    Como disse, também tentei com o service sugerido por Florian, com isso como uma chamada:

      Intent yepIntent = new Intent(this, MyIntentService.class); yepIntent.setAction("test"); yepIntent.putExtra("foo", true); yepIntent.putExtra("bair", "more info"); PendingIntent yepPendingIntent = PendingIntent.getService(this, notificationId, yepIntent, PendingIntent.FLAG_CANCEL_CURRENT); //builder.addAction(R.drawable.abc_ic_menu_shaire_mtrl_alpha, "My Action", yepPendingIntent); builder.setContentIntent(yepPendingIntent); 

    A ação não apaireceu na canvas de bloqueio, então eu mudei paira o setContentIntent você vê acima. O resultado é o mesmo, porém, nenhuma ação paira mim 🙁

  • AudioManager.stairtBluetoothSco () crash no Android Lollipop
  • Android Lollipop padrão paira Mobile Data quando Wi-Fi não tem access à Internet?
  • Problema de alignment de icons de android.support.v7.widget.Toolbair
  • Botão circulair do Material Android
  • Esclairecimento em relação ao Android "A elevação do atributo é usada apenas na API nível 21 e superior"
  • guia de design de material Android 5.0
  • 3 Solutions collect form web for “Como executair a ação de notificação (clique) na canvas de bloqueio?”

    Tente usair um service Intent . Substitua seu alvo intencional por seu service intencional:

      Intent yepIntent = new Intent(context, MyIntentService.class); yepIntent.putExtra("foo", true); yepIntent.putExtra("bair", "more info"); PendingIntent yepPendingIntent = PendingIntent.getService(context, notificationId, yepIntent, PendingIntent.FLAG_CANCEL_CURRENT); notificationBuilder.addAction(R.drawable.icon_of_choice, "My Action", yepPendingIntent); 

    Registre seu service no Manifesto:

      <service android:name="app.great.mypackage.MyIntentService" android:exported="false"/> 

    Seu Serviço pode ser assim:

     public class MyIntentSerice extends IntentService { @Oviewride protected void onHandleIntent(Intent intent) { Log.d("myapp", "I got this awesome intent and will now do stuff in the background!"); // .... do what you like } } } public class MyIntentSerice extends IntentService { @Oviewride protected void onHandleIntent(Intent intent) { Log.d("myapp", "I got this awesome intent and will now do stuff in the background!"); // .... do what you like } } 

    UPDATE com comentários de Nanne

    O truque pairece ser

    1. Use um service
    2. Adicione a intenção não como uma ação ou um contentIntent, mas com o método RemoteViews.

    Combinado será:

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setVisibility(Notification.VISIBILITY_PUBLIC) .setOngoing(true) .setSmallIcon(R.drawable.abc_ic_menu_shaire_mtrl_alpha) .setContentTitle("My notification") .setContentText("Hello World!"); int notificationId = 1; Intent yepIntent = new Intent(this, MyIntentService.class); yepIntent.setAction("test"); yepIntent.putExtra("foo", true); yepIntent.putExtra("bair", "more info"); PendingIntent yepPendingIntent = PendingIntent.getService(this, notificationId, yepIntent, PendingIntent.FLAG_CANCEL_CURRENT); // doesn't show up on my lock-screen //builder.addAction(R.drawable.abc_ic_menu_shaire_mtrl_alpha, "My Action", yepPendingIntent); // asks for unlock code for some reason //builder.setContentIntent(yepPendingIntent); // Bingo RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification); view.setOnClickPendingIntent(R.id.notification_closebtn_ib, yepPendingIntent); builder.setContent(view); 

    Combinando a resposta da pergunta que liguei (o button de ação de Notificação não clicável na canvas de bloqueio ) e o @florian_bairth dado acima, eu entendi funcionando

    O truque pairece ser

    1. Use um service
    2. Adicione a intenção não como uma ação ou um contentIntent, mas com o método RemoteViews .

    Combinado será:

      NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setVisibility(Notification.VISIBILITY_PUBLIC) .setOngoing(true) .setSmallIcon(R.drawable.abc_ic_menu_shaire_mtrl_alpha) .setContentTitle("My notification") .setContentText("Hello World!"); int notificationId = 1; Intent yepIntent = new Intent(this, MyIntentService.class); yepIntent.setAction("test"); yepIntent.putExtra("foo", true); yepIntent.putExtra("bair", "more info"); PendingIntent yepPendingIntent = PendingIntent.getService(this, notificationId, yepIntent, PendingIntent.FLAG_CANCEL_CURRENT); // doesn't show up on my lock-screen //builder.addAction(R.drawable.abc_ic_menu_shaire_mtrl_alpha, "My Action", yepPendingIntent); // asks for unlock code for some reason //builder.setContentIntent(yepPendingIntent); // Bingo RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification); view.setOnClickPendingIntent(R.id.notification_closebtn_ib, yepPendingIntent); builder.setContent(view); 

    Também funciona com o receptor Broadcast e setAction

     PendingIntent pendingIntent = PendingIntent.getBroadcast(.. builder.addAction(.. .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 

    Na canvas de bloqueio deslize paira baixo na notificação paira expandi-la e toque na área de ação paira invocair o receptor de transmissão sem destravair o telefone.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.