2013-12-12 2 views
2

Я делаю приложение смайликов как Emojidom https://play.google.com/store/apps/details?id=com.plantpurple.emojidomКак добавить мои смайлики приложения в WeChat

Когда я пытаюсь открыть мое приложение из WeChat, я не могу это сделать .. но я могу видеть, что emojidom приложение доступно из WeChat. Я добавил все необходимые предпосылки в моем приложении для получения изображений, но все же он не отображается в wechat .. Однако это проявляется в whatsapp. Я хочу, чтобы это так .. посмотреть скриншот enter image description here

В верхней части этого окна чата в WeChat, мы можем увидеть значок emojidom, но я не могу получить мой появляться там ... как сделать так ... Есть идеи? Я думаю, мне нужно написать услугу для мониторинга, когда wechat выходит на передний план. Любая идея, как написать такую ​​услугу, которая отслеживает, когда конкретное приложение выходит на передний план?

ответ

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 класс, легко узнать имя пакета, так как вы можете легко проверить все имена пакетов (для instance на веб-сайте игры) вы можете подготовить список пакетов приложений, которые хотите рассмотреть, и поместить список в переменную в своем приложении.

В-третьих. Я не знаю в wechat, но в 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 или просто создать приложение, чтобы перечислить всю выполняемую задачу на своем мобильном устройстве и запустить все приложения, которые вы хотите проверить.

+0

спасибо тонну ... Мне это действительно нужно! –

1

Я могу предложить сумасшедший корень, чтобы взять программу и DisAssembleit, чтобы узнать, как она это делает. Чтобы получить помощь при входе в контакт: limelect at gmail dot com

0

Try ниже кода

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)); 
Смежные вопросы