如何检测android上打开的应用程序

如何检测android上打开的应用程序,android,keyboard,Android,Keyboard,我正在开发一个android定制键盘,我想把胶粘物发送给我的朋友,比如在我的键盘上。我为此添加了一些png 当我使用android的共享api时,我必须首先选择一个应用程序来共享。是否可以从我的键盘检测当前打开的应用程序?例如,如果我正在与hangouts聊天,那么我想呼叫意图,告诉它与com.something.hangouts共享 如果我在FB messenger,那么告诉它com.something.facebook.messenger等 我试着这样做: fun getOpenedAppl

我正在开发一个android定制键盘,我想把胶粘物发送给我的朋友,比如在我的键盘上。我为此添加了一些png

当我使用android的共享api时,我必须首先选择一个应用程序来共享。是否可以从我的键盘检测当前打开的应用程序?例如,如果我正在与hangouts聊天,那么我想呼叫意图,告诉它与com.something.hangouts共享

如果我在FB messenger,那么告诉它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();
        }
    }
}
但是它不太好用。。。它返回启动器或键盘。随便


我试图从最近的应用列表中获取第一个应用,但它不起作用

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

您可以使用activitymanager中的GetRunningAppProcesss api,但当您的结果超过1MB时(基本上是在超过30-35个应用程序正在运行的情况下),您将以“TransactionTooLargeException”结束。这是android实现,无法传输超过1 MB的绑定数据。

您也可以使用辅助功能服务,但为此,您需要将用户重定向到辅助功能设置以启用它。下面是示例代码,用于获取刚刚打开的应用程序包

 public class MyAccessibilityService extends AccessibilityService {

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

您可以在此处了解更多信息

要获取当前正在运行的应用程序,请在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();}

要获取当前正在运行的应用程序,请对kitkat以上的android版本使用以下函数

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


    return activityManager.getRunnningAppProcesses().get(0).processName;}
检查此代码

 /**
     * @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;
        }
    }
这是一项很容易的任务

String packageName = getCurrentInputEditorInfo().packageName;

InputMethodService类的方法。

谢谢,这就是解决方案!好极了为了达到这个目的,我们必须经历很多次。荣誉谢谢,你那边的帮助真是太棒了。经过几个小时的多线程搜索,这正是我需要的一行!谢谢