如何检测 android 打开了哪个应用
How to detect which app is opened on android
我正在开发一个 android 自定义键盘,我想通过我的键盘向我的朋友发送即时贴,例如在视频群聊中。我为此添加了一些 png。
当我使用 android 的分享功能时 api 我必须先 select 一个要分享的应用程序。是否可以从我的键盘检测到当前打开的应用程序?例如,如果我正在与环聊聊天,那么我想调用意图告诉它与 "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 中的 getRunningAppProcesses 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
}}
您可以在此处阅读更多相关信息 Accessibility Services
要获取当前 运行 应用程序,请对 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;}
检查此代码
/**
* @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 的方法 class。
我正在开发一个 android 自定义键盘,我想通过我的键盘向我的朋友发送即时贴,例如在视频群聊中。我为此添加了一些 png。
当我使用 android 的分享功能时 api 我必须先 select 一个要分享的应用程序。是否可以从我的键盘检测到当前打开的应用程序?例如,如果我正在与环聊聊天,那么我想调用意图告诉它与 "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 中的 getRunningAppProcesses 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
}}
您可以在此处阅读更多相关信息 Accessibility Services
要获取当前 运行 应用程序,请对 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;}
检查此代码
/**
* @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 的方法 class。