2

我正在制作一个表情符号应用程序,例如 Emojidom https://play.google.com/store/apps/details?id=com.plantpurple.emojidom

当我尝试从微信访问我的应用程序时,我不能这样做.. 但我可以看到 emojidom 应用程序可以从微信访问。我已经在我的应用程序中添加了所有必要的权限以获取图像,但它仍然没有出现在微信中。虽然它出现在 whatsapp 中。我想要这样..看截图 在此处输入图像描述

在微信这个聊天窗口的顶部,我们可以看到 emojidom 图标,但我无法让我的出现在那里......怎么做......有什么想法吗?我想我需要编写一个服务来监控微信何时进入前台。知道如何编写这样的服务来监视特定应用程序何时进入前台吗?

4

4 回答 4

1

首先,我不知道您是否这样做,但 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 类以获取您需要的信息。

想知道每个app的每一屏代表什么activity,可以尝试在google上查找,或者制作一个简单的app列出自己手机上所有正在运行的任务,运行所有你想查看的app

于 2014-01-14T19:59:11.460 回答
1

我可以建议一个疯狂的根来使用该程序并 DisAssembleit 来了解它是如何做到的。要获得我的帮助,请联系:gmail dot com 的limelect

于 2014-01-01T11:45:38.483 回答
0

此代码是检查您的后台应用程序。您可以根据自己的需要对其进行修改: https ://stackoverflow.com/a/11787496/2521931

于 2014-01-13T03:23:47.303 回答
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));
于 2015-12-15T11:44:48.603 回答