2016-03-05 23 views
5

Sto sviluppando una tastiera personalizzata Android e voglio inviare stickies ai miei amici per esempio su Hangouts dalla mia tastiera. Ho aggiunto del png per questo.Come rilevare quale app è aperta su Android

Quando utilizzo la condivisione share di Android, devo selezionare prima un'app da condividere. È possibile rilevare l'attuale applicazione aperta dalla mia tastiera? Ad esempio, se sto chattando con Hangouts, voglio chiamare l'intento dicendogli di condividere con "com.something.hangouts"

Se sono in FB messenger, dicendolo "com.something.facebook.messenger" ecc. ...

ho cercato di ottenere in questo modo:

fun getOpenedApplication() { 
    var am = this.getSystemService(ACTIVITY_SERVICE) as ActivityManager; 

    var l = am.getRecentTasks(1, 
      ActivityManager.RECENT_WITH_EXCLUDED); 
    var i = l.iterator(); 

    var pm = this.packageManager; 

    while (i.hasNext()) { 
     try { 
      var intent = i.next().baseIntent; 
      var list = pm.queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY); 

      var c = pm.getApplicationLabel(pm.getApplicationInfo(
        list[0].activityInfo.packageName, 
        PackageManager.GET_META_DATA)); 

      Toast.makeText(this, "Application name: " + c.toString(), 
        Toast.LENGTH_LONG).show(); 

     } catch (e: Exception) { 
      Toast.makeText(this, 
        "Application name not found: " + e.toString(), 
        Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

Ma non funziona bene ... si dà indietro il programma di avvio o la tastiera. (Casualmente)

Ho cercato di ottenere la prima app dalla lista Applicazioni recenti ma non funzionava

risposta

7

È un'operazione molto semplice.

String packageName = getCurrentInputEditorInfo().packageName; 

metodo della classe InputMethodService.

+1

Grazie, questa era la soluzione! – MegaX

+1

Fantastico. Ho dovuto passare attraverso molti thread su SO per arrivare a questo. complimenti! – Shahar

+1

Grazie, Aiuto fantastico dalla tua parte. – Janak

4

Per Android L e, soprattutto, l'uso:

ActivityManager activityManager = (ActivityManager) newContext.getSystemService(Context.ACTIVITY_SERVICE); 
List<RunningAppProcessInfo> runAppProcessesList = activityManager.getRunningAppProcesses(); 
for (RunningAppProcessInfo runAppProcess : runAppProcessesList) { 
    if (runAppProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
     Log.d("current foreground App", runAppProcess.processName); 
    } 
} 
0

È possibile utilizzare getRunningAppProcesses api da ActivityManager ma quando il risultato sarà superiore a 1 MB (in pratica nel caso in cui siano in esecuzione più di 30-35 app) si finirà con "TransactionTooLargeException". Questa implementazione di Android non è in grado di trasferire i dati del binder più di 1 MB.

1

È anche possibile utilizzare i servizi di accessibilità, ma per questo è necessario reindirizzare gli utenti alle impostazioni di accessibilità per attivarlo. Il codice di esempio è sotto per ottenere il pacchetto dell'app che è stata appena aperta.

public class MyAccessibilityService extends AccessibilityService { 

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
     String packageName = event.getPackageName(); 
     if(packageName.equals("com.sample")) 
      //Do whatever you want 
    }} 

Si può leggere di più su di esso qui Accessibility Services

4

Per ottenere l'applicazione in esecuzione corrente utilizzare la seguente funzione per la versione Android fino kitkat

public String getRunningAppPackageName() 
{ 
    ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1); 
    RunningTaskInfo p = (RunningTaskInfo) tasks.get(0); 

    return p.baseActivity.getPackageName();} 

Per utilizzare l'applicazione in esecuzione in corso il seguente funzione per la versione Android sopra kitkat

 public String getRunningAppPackageName() 
{ 
    ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> tasks = activityManager.getRunningAppProcesses(); 


    return activityManager.getRunnningAppProcesses().get(0).processName;} 
+0

risolto il mio problema thnx –

1

Verificare questo codice

/** 
    * @param context 
    * @return 
    * @throws PackageManager.NameNotFoundException 
    */ 
    public String getRunningPackageName(Context context) throws PackageManager.NameNotFoundException { 
     ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     String packagename = ""; 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      List<ActivityManager.AppTask> tasks = mgr.getAppTasks(); 
      for (ActivityManager.AppTask task : tasks) { 
       packagename = task.getTaskInfo().baseIntent.getComponent().getPackageName(); 
       if (packagename.equalsIgnoreCase(context.getPackageName().toString())) { 
        break; 
       } 
      } 
     } else { 
      ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
      List<ActivityManager.RunningTaskInfo> alltasks = activityManager.getRunningTasks(1); 
      packagename = alltasks.get(0).topActivity.getPackageName(); 
     } 
     return packagename; 
    } 


    private void yourMethodName(Context context, Bundle notifyBundle) { 
      boolean isActivityFound = false; 
      String packageName = ""; 
      try { 
       packageName = getRunningPackageName(context); 
      } catch (PackageManager.NameNotFoundException e) { 
       e.printStackTrace(); 
      } 
    if (packageName.equalsIgnoreCase(context.getPackageName().toString())) { 
      isActivityFound = true; 
     } 
    }