我正在制作像Emojidom https://play.google.com/store/apps/details?id=com.plantpurple.emojidom
这样的表情符号应用当我尝试从微信访问我的应用程序时,我不能这样做..但我可以看到可以从微信访问emojidom应用程序。我已经在我的应用程序中添加了所有必要的预设,用于获取图像,但它仍然没有显示在微信中..它显示在whatsapp中。我想要这样..看截图
在微信聊天窗口的顶部,我们可以看到emojidom图标,但我不能让我出现在那里......怎么做...有什么想法吗?我想我需要编写一个服务来监控微信何时进入前台。任何想法如何编写这样的服务,监视特定应用程序何时到达前台?
答案 0 :(得分:1)
我可以建议一个疯狂的根来采取该计划和DisAssembleit来了解它是如何做到的。 为了得到我的帮助,请联系:glect dot com中的limelect
答案 1 :(得分:1)
首先,我不知道你是否这样做,但Emojidom在这里做的不是在操作栏中包含一个图标,而是在应用程序之上绘制自己,作为浮动图标。一个众所周知的例子就是Facebook Messenger App,它为在屏幕上漂浮的活动聊天绘制图标。为此,您可以按照本教程操作: 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
课程,很容易知道包裹的名称,因为您可以轻松检查所有包裹名称(对于游戏网站的实例),您可以准备一份包裹列表您要考虑的应用,并将列表放在应用中的变量中。
第三。我在微信中不知道,但在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类以获取所需的信息。
要知道每个应用的每个屏幕代表什么活动,您可以尝试在谷歌上找到,或者创建一个简单的应用程序来列出您自己手机上的所有正在运行的任务,并运行您要检查的所有应用< / p>
答案 2 :(得分:0)
此代码检查是您的应用程序在后台。您可以根据需要修改它: https://stackoverflow.com/a/11787496/2521931
答案 3 :(得分:0)
尝试以下代码
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));