我正在制作一个像Emojidom这样的表情符号应用程序https://play.google.com/store/apps/details?id=com.plantpurple.emojidom
当我尝试从微信访问我的应用程序时,我无法做到这一点..但我可以看到表情符号应用程序可以从微信访问。我已经在我的应用程序中添加了所有必要的权限来拾取图像,但它仍然没有显示在微信中。但它显示在 Whatsapp 中。我想要这样的..看截图
在微信聊天窗口的顶部,我们可以看到表情符号图标,但我无法让我的图标出现在那里......该怎么做......有什么想法吗?我想我需要编写一个服务来监控微信何时进入前台。知道如何编写这样一个服务来监视特定应用程序何时进入前台吗?
首先,我不知道你是否这样做,但是Emojidom在这里所做的并不是在操作栏中包含图标,而是将自己绘制在你的应用程序顶部,作为浮动图标。一个众所周知的例子是 Facebook Messenger 应用程序,它为浮动在屏幕上的活动聊天绘制图标。要实现此目的,您可以按照本教程进行操作: http://www.piwai.info/chatheads-basics/
其次,Emojidom 仅当符合条件的应用程序位于前台时才会自行绘制。我们很幸运,因为我们有一种方法来检测前台有什么应用程序。
为此,我们创建一个如下方法:
private RunningAppProcessInfo getForegroundApp() {
RunningAppProcessInfo temp;
ActivityManager mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
Iterator <RunningAppProcessInfo> i = mActivityManager.getRunningAppProcesses().iterator();
while(i.hasNext()){
temp = i.next();
if(temp.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
return temp;
}
}
return null;
}
如果你检查
RunningAppProcessInfo
类,很容易知道包的名称,因为你可以轻松地检查所有包名称(例如在play网站中),你可以准备你想要的应用程序的包列表考虑,并将列表放入应用程序的变量中。
第三。我在微信中不知道,但在whatsapp中,仅当聊天打开时才会显示该图标(即您在聊天列表或配置屏幕中看不到它)。
为此,您可以检查活动应用程序中实际运行的活动,我们可以使用此方法,它将检查任何正在运行的任务的包名称是否与前台应用程序相同,并返回信息
private ComponentName getRunningActivity(RunningAppProcessInfo target){
ActivityManager.RunningTaskInfo info;
ActivityManager mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
Iterator <ActivityManager.RunningTaskInfo> i = mActivityManager.getRunningTasks(100).iterator();
while(i.hasNext()){
info=i.next();
if(info.baseActivity.getPackageName().equals(target.processName)){
return info.topActivity;
}
}
return null;
}
查看 ComponentName 类以获取您需要的信息。
要知道每个应用程序的每个屏幕代表什么活动,您可以尝试在Google上查找,或者制作一个简单的应用程序来列出您自己的手机上所有正在运行的任务,并运行您想要检查的所有应用程序
通过程序和 DisAssembleit 了解它是如何工作的。
此代码用于检查您的应用程序是否在后台运行。您可以根据您的需要修改它: https://stackoverflow.com/a/11787496/2521931
尝试下面的代码
public class ChatHeadService extends Service {
private WindowManager windowManager;
private ImageView chatHead;
private static final String TAG = "ChatheadService";
private Timer timer;
private static final int delay = 500; // delay for .5 sec before first start
private static final int period = 500; // repeat check every .5 sec.
Intent mIntent;
WindowManager.LayoutParams params;
ActivityManager activityManager;
@Override public IBinder onBind(Intent intent) {
Log.i("called", "onBind");
return null;
}
@Override public void onCreate() {
super.onCreate();
Log.i("called", "onCreate");
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
chatHead = new ImageView(this);
chatHead.setImageResource(R.drawable.app_icon);
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
//handleCommand(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("called", "onStartCommand");
mIntent=intent;
handleCommand(intent);
return START_NOT_STICKY;
}
// handles a Start command
private void handleCommand(Intent intent) {
Log.d(TAG, "service is starting");
if (timer == null) {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
checkActivityForeground();
}
}, delay, period);
}
}
protected void checkActivityForeground() {
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
final List<ActivityManager.RunningAppProcessInfo> processInfos = am
.getRunningAppProcesses();
ActivityManager.RunningAppProcessInfo processInfo = processInfos
.get(0);
// for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
// getting process at 0th index means our application is on top on all apps or currently open
appPackageName = (Arrays.asList(processInfo.pkgList).get(0));
}
// }
}
else {
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = null;
componentInfo = taskInfo.get(0).topActivity;
appPackageName = componentInfo.getPackageName();
}
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(appPackageName.contains("com.whatsapp")){
if(chatHead.isShown()==false){
windowManager.addView(chatHead, params);
}
}else{
if ((chatHead != null) && chatHead.isShown()){
windowManager.removeView(chatHead);
}
}
}
}, 500);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
if ((chatHead != null) && chatHead.isShown()){
windowManager.removeView(chatHead);
}
}
}, 500);
timer.cancel();
}
}
在清单中添加
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<service android:name=".ChatHeadService"></service>
在您的活动课程中启动服务
startService(new Intent(MainActivity.this, ChatHeadService.class));