6

Sto creando un semplice widget per la gestione dei contatti, che consente all'utente di comporre e inviare sms al contatto desiderato.Come avviare una nuova attività dalla schermata di blocco?

Funziona come "widget normale", ma quando lo aggiungo come widget di blocco su Android 4.2, l'app sms o l'app di composizione non si avvia. Beh, in effetti hanno una stella, ma "dietro" la schermata di blocco, quindi l'utente deve ancora sbloccare manualmente lo schermo per poter comporre/inviare sms.

Ho cercato il web per qualche soluzione, ma non è utile. Sono a conoscenza di FLAG_DISABLE_KEYGUARD o FLAG_SHOW_WHEN_LOCKED, ma dal momento che sms/dial apps non sono "mie", quindi non so se impostano il flag corretto. Come soluzione temporanea, ho provato a creare la mia attività che ha impostato quei flag e quindi ha semplicemente avviato uno desiderato (dial o sms), ma questo non aiuta.

C'è un modo per sbloccare lo schermo, ma questo comporta l'uso di KeyguardManager e KeyguardLock (che funzionano bene), ma in seguito all'uso di KeyguardLock.newKeyguardLock(), il telefono non riesce a girare automaticamente, sicuramente perché non rilascio questo blocco (fa sì che il lucchetto riappaia, che non è quello che voglio).

In effetti, questo widget dovrebbe funzionare in modo simile al widget predefinito di sms o al widget di posta sulla schermata di blocco?

Quindi, la mia domanda è: come raggiungerlo e iniziare una nuova attività da lockscreen?

+0

Hi Filip. Mi stavo chiedendo la stessa cosa. Sono abbastanza nuovo per Android. Quindi puoi aiutarmi un po 'qui? Come si impostano i listener dei clic sui pulsanti o la visualizzazione nel layout del widget? Questo ha qualcosa a che fare con il metodo onReceive della classe AppWidgetProvider? –

+0

Ciao, Bene, questo non è così ovvio e abbastanza difficile da spiegare (per non parlare dell'implementazione :)). Mi ci è voluto un po 'per capirlo. In breve, è necessario utilizzare le classi 'PendingIntent' e' RemoteView' per raggiungerlo. Il modo migliore è guardare all'interno [documentazione] (http://developer.android.com/guide/topics/appwidgets/index.html#implementing_collections). In breve, quando la vista è stata configurata tramite 'RemoteView', è sufficiente iniettare l'oggetto' PendingIntent' tramite il metodo 'RemoteView # setOnClickFillInIntent'. –

risposta

7

Bene, ho trovato la soluzione da solo. è risultato che ero vicino :)

Per avviare app/attività di terze parti, la soluzione più semplice consiste nel creare una sorta di attività proxy, che imposterà i flag appropriati sulla finestra e quindi avvierà l'attività desiderata e le FINITURE.

codice di esempio è la seguente:

chiamando intenti widget di (proxy chiamando):

@Override 
public void onReceive(Context context, Intent intent) { 
    Utilities.printLog(TAG, "onReceive"); 
    Utilities.printLog(TAG, "intent: " + intent); 
    if (intent.getAction().equals(ACTION)) { 

     final String number = intent.getStringExtra(EXTRAS); 
     Toast.makeText(context, "Selected number: " + number, 
       Toast.LENGTH_SHORT) 
       .show(); 


     /** REMOVING KEYGUARD RECEIVER **/ 
     // not really an option - lock is still holded by widget and screen 
     // cannot be locked again ;(
     // KeyguardManager keyguardManager = (KeyguardManager) context 
     // .getSystemService(Context.KEYGUARD_SERVICE); 
     // KeyguardLock lock = keyguardManager 
     // .newKeyguardLock(Context.KEYGUARD_SERVICE); 
     // lock.disableKeyguard(); 

     final Intent activity = new Intent(context, MainActivity.class); 
     activity.putExtras(intent.getExtras()); 
     activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     activity.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
     context.startActivity(activity); 
    } 

    super.onReceive(context, intent); 
} 

nell'attività delega basta chiamare:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

    final Intent callingIntent = getIntent(); 

    final String actionToLaunch = callingIntent.getStringExtra(ContactsStackWidgetProvider.ACTION); 
    final String number = callingIntent.getStringExtra(ContactsStackWidgetProvider.EXTRAS); 

    final Intent activity = new Intent(); 
    if (actionToLaunch.equals(Intent.ACTION_DIAL)) { 
     activity.setAction(Intent.ACTION_DIAL); 
     activity.setData(Uri.parse("tel:"+number)); 
    } else if (actionToLaunch.equals(Intent.ACTION_SENDTO)) { 
     activity.setAction(Intent.ACTION_SENDTO); 
     activity.setData(Uri.parse("sms:"+number)); 
    } else { 
     throw new IllegalArgumentException("Unrecognized action: " 
       + actionToLaunch); 
    } 

    new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      startActivity(activity); 
      finish();//it is important to finish, but after a small delay 
     } 
    }, 50L); 


} 
+0

I miei due centesimi: invece di usare un gestore, puoi chiamare 'startActivity()' e 'finish()' in 'onWindowsFocusChanged (pHasFocus)' quando 'pHasFocus' è vero. – mamuso

Problemi correlati