Как определить, какое приложение открыто на Android

Я разрабатываю пользовательскую клавиатуру Android, и я хочу отправить листы друзьям, например, на видеовстречи с моей клавиатуры. Я добавил несколько png для этого.

Когда я использую общий ресурс android для Android, я должен сначала выбрать приложение для совместного использования. Можно ли обнаружить текущее открытое приложение с моей клавиатуры? Например, если я общаюсь с видеовстречами, то я хочу назвать намерение говорить ему поделиться с "com.something.hangouts"

Если я нахожусь в FB-мессенджере, то говорю «com.something.facebook.messenger» и т. Д. …

Я попытался сделать это так:

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(); } } } 

Но он не работает хорошо … Он возвращает пусковую установку или клавиатуру. (случайно)

Я попытался получить первое приложение из списка недавних приложений, но он не работал

Solutions Collecting From Web of "Как определить, какое приложение открыто на Android"

Это очень легкая задача.

 String packageName = getCurrentInputEditorInfo().packageName; 

Метод вашего класса InputMethodService.

Для Android L и выше используйте:

 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); } } 

Чтобы получить текущее запущенное приложение, используйте следующую функцию для версии для Android до 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();} 

Чтобы получить текущее запущенное приложение, используйте следующую функцию для версии для Android выше kitkat

  public String getRunningAppPackageName() { ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> tasks = activityManager.getRunningAppProcesses(); return activityManager.getRunnningAppProcesses().get(0).processName;} 

Вы также можете использовать службы доступности, но для этого вам необходимо перенаправить своих пользователей в настройки специальных возможностей, чтобы включить его. Примерный код приведен ниже, чтобы получить пакет только что открытого приложения.

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

Вы можете узнать больше об этом здесь.

Проверить этот код

  /** * @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; } } 

Вы можете использовать getRunningAppProcesses api из activitymanager, но когда ваш результат будет больше 1 МБ (в основном, если работает более 30-35 приложений), вы получите «TransactionTooLargeException». Это реализация Android не позволяет передавать данные связующего более 1 МБ.